package schema import ( "encoding/json" "regexp" "github.com/answerdev/answer/internal/base/reason" "github.com/answerdev/answer/internal/base/validator" "github.com/answerdev/answer/internal/entity" "github.com/answerdev/answer/pkg/checker" "github.com/jinzhu/copier" "github.com/segmentfault/pacman/errors" ) // UserVerifyEmailReq user verify email request type UserVerifyEmailReq struct { // code Code string `validate:"required,gt=0,lte=500" form:"code"` // content Content string `json:"-"` } // GetUserResp get user response type GetUserResp struct { // user id ID string `json:"id"` // create time CreatedAt int64 `json:"created_at"` // last login date LastLoginDate int64 `json:"last_login_date"` // username Username string `json:"username"` // email EMail string `json:"e_mail"` // mail status(1 pass 2 to be verified) MailStatus int `json:"mail_status"` // notice status(1 on 2off) NoticeStatus int `json:"notice_status"` // follow count FollowCount int `json:"follow_count"` // answer count AnswerCount int `json:"answer_count"` // question count QuestionCount int `json:"question_count"` // rank Rank int `json:"rank"` // authority group AuthorityGroup int `json:"authority_group"` // display name DisplayName string `json:"display_name"` // avatar Avatar string `json:"avatar"` // mobile Mobile string `json:"mobile"` // bio markdown Bio string `json:"bio"` // bio html BioHTML string `json:"bio_html"` // website Website string `json:"website"` // location Location string `json:"location"` // ip info IPInfo string `json:"ip_info"` // language Language string `json:"language"` // access token AccessToken string `json:"access_token"` // is admin IsAdmin bool `json:"is_admin"` // user status Status string `json:"status"` } func (r *GetUserResp) GetFromUserEntity(userInfo *entity.User) { _ = copier.Copy(r, userInfo) r.Avatar = FormatAvatarInfo(userInfo.Avatar) r.CreatedAt = userInfo.CreatedAt.Unix() r.LastLoginDate = userInfo.LastLoginDate.Unix() statusShow, ok := UserStatusShow[userInfo.Status] if ok { r.Status = statusShow } } type GetUserToSetShowResp struct { *GetUserResp Avatar *AvatarInfo `json:"avatar"` } func (r *GetUserToSetShowResp) GetFromUserEntity(userInfo *entity.User) { _ = copier.Copy(r, userInfo) r.CreatedAt = userInfo.CreatedAt.Unix() r.LastLoginDate = userInfo.LastLoginDate.Unix() statusShow, ok := UserStatusShow[userInfo.Status] if ok { r.Status = statusShow } avatarInfo := &AvatarInfo{} _ = json.Unmarshal([]byte(userInfo.Avatar), avatarInfo) // if json.Unmarshal Error avatarInfo.Type is Empty r.Avatar = avatarInfo } func FormatAvatarInfo(avatarJson string) string { if avatarJson == "" { return "" } AvatarInfo := &AvatarInfo{} err := json.Unmarshal([]byte(avatarJson), AvatarInfo) if err != nil { return "" } switch AvatarInfo.Type { case "gravatar": return AvatarInfo.Gravatar case "custom": return AvatarInfo.Custom default: return "" } } // GetUserStatusResp get user status info type GetUserStatusResp struct { // user status Status string `json:"status"` } // GetOtherUserInfoByUsernameResp get user response type GetOtherUserInfoByUsernameResp struct { // user id ID string `json:"id"` // create time CreatedAt int64 `json:"created_at"` // last login date LastLoginDate int64 `json:"last_login_date"` // username Username string `json:"username"` // email // follow count FollowCount int `json:"follow_count"` // answer count AnswerCount int `json:"answer_count"` // question count QuestionCount int `json:"question_count"` // rank Rank int `json:"rank"` // display name DisplayName string `json:"display_name"` // avatar Avatar string `json:"avatar"` // mobile Mobile string `json:"mobile"` // bio markdown Bio string `json:"bio"` // bio html BioHTML string `json:"bio_html"` // website Website string `json:"website"` // location Location string `json:"location"` // ip info IPInfo string `json:"ip_info"` // is admin IsAdmin bool `json:"is_admin"` Status string `json:"status"` StatusMsg string `json:"status_msg,omitempty"` } func (r *GetOtherUserInfoByUsernameResp) GetFromUserEntity(userInfo *entity.User) { _ = copier.Copy(r, userInfo) Avatar := FormatAvatarInfo(userInfo.Avatar) r.Avatar = Avatar r.CreatedAt = userInfo.CreatedAt.Unix() r.LastLoginDate = userInfo.LastLoginDate.Unix() statusShow, ok := UserStatusShow[userInfo.Status] if ok { r.Status = statusShow } if userInfo.MailStatus == entity.EmailStatusToBeVerified { statusMsgShow, ok := UserStatusShowMsg[11] if ok { r.StatusMsg = statusMsgShow } } else { statusMsgShow, ok := UserStatusShowMsg[userInfo.Status] if ok { r.StatusMsg = statusMsgShow } } } const ( MailStatePass = 1 MailStateVerifi = 2 NoticeStatusOn = 1 NoticeStatusOff = 2 ActionRecordTypeLogin = "login" ActionRecordTypeEmail = "e_mail" ActionRecordTypeFindPass = "find_pass" ) var UserStatusShow = map[int]string{ 1: "normal", 9: "forbidden", 10: "deleted", } var UserStatusShowMsg = map[int]string{ 1: "", 9: "This user was suspended forever. This user doesn’t meet a community guideline.", 10: "This user was deleted.", 11: "This user is inactive.", } // EmailLogin type UserEmailLogin struct { Email string `validate:"required,email,gt=0,lte=500" json:"e_mail"` // e_mail Pass string `validate:"required,gte=8,lte=32" json:"pass"` // password CaptchaID string `json:"captcha_id"` // captcha_id CaptchaCode string `json:"captcha_code"` // captcha_code } // UserRegisterReq user register request type UserRegisterReq struct { // name Name string `validate:"required,gt=4,lte=30" json:"name"` // email Email string `validate:"required,email,gt=0,lte=500" json:"e_mail" ` // password Pass string `validate:"required,gte=8,lte=32" json:"pass"` IP string `json:"-" ` } func (u *UserRegisterReq) Check() (errFields []*validator.FormErrorField, err error) { // TODO i18n err = checker.CheckPassword(8, 32, 0, u.Pass) if err != nil { errField := &validator.FormErrorField{ ErrorField: "pass", ErrorMsg: err.Error(), } errFields = append(errFields, errField) return errFields, err } return nil, nil } // UserModifyPassWordRequest type UserModifyPassWordRequest struct { UserID string `json:"-" ` // user_id OldPass string `json:"old_pass" ` // old password Pass string `json:"pass" ` // password } func (u *UserModifyPassWordRequest) Check() (errFields []*validator.FormErrorField, err error) { // TODO i18n err = checker.CheckPassword(8, 32, 0, u.Pass) if err != nil { errField := &validator.FormErrorField{ ErrorField: "pass", ErrorMsg: err.Error(), } errFields = append(errFields, errField) return errFields, err } return nil, nil } type UpdateInfoRequest struct { // display_name DisplayName string `validate:"required,gt=0,lte=30" json:"display_name"` // username Username string `validate:"omitempty,gt=0,lte=30" json:"username"` // avatar Avatar AvatarInfo `json:"avatar"` // bio Bio string `validate:"omitempty,gt=0,lte=4096" json:"bio"` // bio BioHTML string `validate:"omitempty,gt=0,lte=4096" json:"bio_html"` // website Website string `validate:"omitempty,gt=0,lte=500" json:"website"` // location Location string `validate:"omitempty,gt=0,lte=100" json:"location"` // user id UserID string `json:"-" ` } type AvatarInfo struct { Type string `validate:"omitempty,gt=0,lte=100" json:"type"` Gravatar string `validate:"omitempty,gt=0,lte=200" json:"gravatar"` Custom string `validate:"omitempty,gt=0,lte=200" json:"custom"` } func (u *UpdateInfoRequest) Check() (errFields []*validator.FormErrorField, err error) { if len(u.Username) > 0 { re := regexp.MustCompile(`^[a-z0-9._-]{4,30}$`) match := re.MatchString(u.Username) if !match { errField := &validator.FormErrorField{ ErrorField: "username", ErrorMsg: err.Error(), } errFields = append(errFields, errField) return errFields, errors.BadRequest(reason.UsernameInvalid) } } return nil, nil } // UpdateUserInterfaceRequest update user interface request type UpdateUserInterfaceRequest struct { // language Language string `validate:"required,gt=1,lte=100" json:"language"` // user id UserId string `json:"-" ` } type UserRetrievePassWordRequest struct { Email string `validate:"required,email,gt=0,lte=500" json:"e_mail" ` // e_mail CaptchaID string `json:"captcha_id" ` // captcha_id CaptchaCode string `json:"captcha_code" ` // captcha_code } type UserRePassWordRequest struct { Code string `validate:"required,gt=0,lte=100" json:"code" ` // code Pass string `validate:"required,gt=0,lte=32" json:"pass" ` // Password Content string `json:"-"` } func (u *UserRePassWordRequest) Check() (errFields []*validator.FormErrorField, err error) { // TODO i18n err = checker.CheckPassword(8, 32, 0, u.Pass) if err != nil { errField := &validator.FormErrorField{ ErrorField: "pass", ErrorMsg: err.Error(), } errFields = append(errFields, errField) return errFields, err } return nil, nil } type UserNoticeSetRequest struct { UserID string `json:"-" ` // user_id NoticeSwitch bool `json:"notice_switch" ` } type UserNoticeSetResp struct { NoticeSwitch bool `json:"notice_switch"` } type ActionRecordReq struct { // action Action string `validate:"required,oneof=login e_mail find_pass" form:"action"` IP string `json:"-"` } type ActionRecordResp struct { CaptchaID string `json:"captcha_id"` CaptchaImg string `json:"captcha_img"` Verify bool `json:"verify"` } type UserBasicInfo struct { ID string `json:"-" ` // user_id Username string `json:"username" ` // name Rank int `json:"rank" ` // rank DisplayName string `json:"display_name"` // display_name Avatar string `json:"avatar" ` // avatar Website string `json:"website" ` // website Location string `json:"location" ` // location IPInfo string `json:"ip_info"` // ip info Status string `json:"status"` // status } type GetOtherUserInfoByUsernameReq struct { Username string `validate:"required,gt=0,lte=500" form:"username"` } type GetOtherUserInfoResp struct { Info *GetOtherUserInfoByUsernameResp `json:"info"` Has bool `json:"has"` } type UserChangeEmailSendCodeReq struct { UserVerifyEmailSendReq Email string `validate:"required,email,gt=0,lte=500" json:"e_mail"` UserID string `json:"-"` } type EmailCodeContent struct { Email string `json:"e_mail"` UserID string `json:"user_id"` } func (r *EmailCodeContent) ToJSONString() string { codeBytes, _ := json.Marshal(r) return string(codeBytes) } func (r *EmailCodeContent) FromJSONString(data string) error { return json.Unmarshal([]byte(data), &r) } type UserChangeEmailVerifyReq struct { Code string `validate:"required,gt=0,lte=500" json:"code"` Content string `json:"-"` } type UserVerifyEmailSendReq struct { CaptchaID string `validate:"omitempty,gt=0,lte=500" json:"captcha_id"` CaptchaCode string `validate:"omitempty,gt=0,lte=500" json:"captcha_code"` }