Skip to content

Commit 5c84812

Browse files
committed
feat: 友好的错误提示 && 普通用户重置密码判断邮箱是否绑定
1 parent 79486b3 commit 5c84812

File tree

8 files changed

+79
-12
lines changed

8 files changed

+79
-12
lines changed

backend/biz/team/handler/http/v1/user.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ func (h *TeamGroupUserHandler) Status(c *web.Context) error {
173173
// @Router /api/v1/teams/users/passwords/change [put]
174174
func (h *TeamGroupUserHandler) ChangePassword(c *web.Context, req domain.ChangePasswordReq) error {
175175
teamUser := middleware.GetTeamUser(c)
176+
177+
if err := req.Validate(); err != nil {
178+
return err
179+
}
180+
176181
err := h.usecase.ChangePassword(c.Request().Context(), teamUser.User.ID, &req)
177182
if err != nil {
178183
return err

backend/biz/user/handler/v1/auth.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ func (h *AuthHandler) PasswordLogin(c *web.Context, req domain.TeamLoginReq) err
116116
func (h *AuthHandler) ChangePassword(c *web.Context, req domain.ChangePasswordReq) error {
117117
ctx := c.Request().Context()
118118

119+
if err := req.Validate(); err != nil {
120+
return err
121+
}
122+
119123
user := middleware.GetUser(c)
120124
if user == nil {
121125
return errcode.ErrUnauthorized
@@ -201,6 +205,9 @@ func (h *AuthHandler) Status(c *web.Context) error {
201205
// @Router /api/v1/users/passwords/reset-request [put]
202206
func (h *AuthHandler) SendResetPasswordEmail(c *web.Context, req domain.ResetUserPasswordEmailReq) error {
203207
ctx := c.Request().Context()
208+
if err := req.Validate(); err != nil {
209+
return err
210+
}
204211
if !h.captcha.ValidateToken(ctx, req.CaptchaToken) {
205212
return errcode.ErrForbidden
206213
}
@@ -279,6 +286,9 @@ func (h *AuthHandler) GetAccountInfo(c *web.Context, req domain.GetAccountInfoRe
279286
// @Success 200 {object} web.Resp{}
280287
// @Router /api/v1/users/passwords/reset [put]
281288
func (h *AuthHandler) ResetPassword(c *web.Context, req domain.ResetUserPasswordReq) error {
289+
if err := req.Validate(); err != nil {
290+
return err
291+
}
282292
// 重置前检查 redis 里的 Key
283293
key := fmt.Sprintf("reset_password_token:%s", req.Token)
284294
userID, err := h.redis.Get(c.Request().Context(), key).Result()

backend/biz/user/usecase/user.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ func (u *UserUsecase) SendResetPasswordEmail(ctx context.Context, req *domain.Re
9797
if err != nil {
9898
return err
9999
}
100+
if len(users) != len(req.Emails) {
101+
return errcode.ErrEmailNotBound
102+
}
100103

101104
for _, user := range users {
102105
token := uuid.NewString()

backend/domain/team.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/chaitin/MonkeyCode/backend/pkg/cvt"
1111

1212
"github.com/chaitin/MonkeyCode/backend/consts"
13+
"github.com/chaitin/MonkeyCode/backend/errcode"
1314
)
1415

1516
// TeamGroupUserUsecase 团队分组成员业务逻辑接口
@@ -290,8 +291,15 @@ type TeamMemberInfo struct {
290291

291292
// ChangePasswordReq 修改密码请求
292293
type ChangePasswordReq struct {
293-
CurrentPassword string `json:"current_password" validate:"omitempty"` // 当前密码
294-
NewPassword string `json:"new_password" validate:"required,min=8,max=32"` // 新密码
294+
CurrentPassword string `json:"current_password" validate:"omitempty"` // 当前密码
295+
NewPassword string `json:"new_password" validate:"required"` // 新密码
296+
}
297+
298+
func (r *ChangePasswordReq) Validate() error {
299+
if len(r.NewPassword) < 8 || len(r.NewPassword) > 32 {
300+
return errcode.ErrPasswordLength
301+
}
302+
return nil
295303
}
296304

297305
// ChangePasswordResp 修改密码响应

backend/domain/user.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@ package domain
22

33
import (
44
"context"
5+
"strings"
56
"time"
67

78
"github.com/google/uuid"
89

10+
"github.com/chaitin/MonkeyCode/backend/consts"
911
"github.com/chaitin/MonkeyCode/backend/db"
12+
"github.com/chaitin/MonkeyCode/backend/errcode"
1013
"github.com/chaitin/MonkeyCode/backend/pkg/cvt"
11-
12-
"github.com/chaitin/MonkeyCode/backend/consts"
1314
)
1415

1516
type UserUsecase interface {
@@ -41,13 +42,13 @@ type UserActiveRepo interface {
4142
}
4243

4344
type User struct {
44-
ID uuid.UUID `json:"id"`
45-
Name string `json:"name"`
46-
AvatarURL string `json:"avatar_url"`
47-
Email string `json:"email"`
48-
Role consts.UserRole `json:"role"`
49-
Status consts.UserStatus `json:"status"`
50-
IsBlocked bool `json:"is_blocked"`
45+
ID uuid.UUID `json:"id"`
46+
Name string `json:"name"`
47+
AvatarURL string `json:"avatar_url"`
48+
Email string `json:"email"`
49+
Role consts.UserRole `json:"role"`
50+
Status consts.UserStatus `json:"status"`
51+
IsBlocked bool `json:"is_blocked"`
5152
Token string `json:"token,omitempty"`
5253
Identities []*UserIdentity `json:"identities"`
5354
Team *Team `json:"team,omitempty"`
@@ -143,16 +144,35 @@ type GetAccountInfoReq struct {
143144

144145
// ResetUserPasswordReq 修改密码请求
145146
type ResetUserPasswordReq struct {
146-
NewPassword string `json:"new_password" validate:"required,min=8,max=32"`
147+
NewPassword string `json:"new_password" validate:"required"`
147148
Token string `json:"token" validate:"required"`
148149
}
149150

151+
func (r *ResetUserPasswordReq) Validate() error {
152+
if len(r.NewPassword) < 8 || len(r.NewPassword) > 32 {
153+
return errcode.ErrPasswordLength
154+
}
155+
return nil
156+
}
157+
150158
// ResetUserPasswordEmailReq 发送重置密码邮件请求
151159
type ResetUserPasswordEmailReq struct {
152160
Emails []string `json:"emails" validate:"required"`
153161
CaptchaToken string `json:"captcha_token"`
154162
}
155163

164+
func (r *ResetUserPasswordEmailReq) Validate() error {
165+
if len(r.Emails) == 0 {
166+
return errcode.ErrEmailRequired
167+
}
168+
for _, email := range r.Emails {
169+
if strings.TrimSpace(email) == "" {
170+
return errcode.ErrEmailRequired
171+
}
172+
}
173+
return nil
174+
}
175+
156176
// TeamMembersResp 团队成员列表响应
157177
type TeamMembersResp []*User
158178

backend/errcode/errcode.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ var (
7878
ErrUserAlreadyExists = web.NewErr(http.StatusOK, 10503, "err-user-already-exists")
7979
ErrChangePasswordFailed = web.NewErr(http.StatusOK, 10504, "err-change-password-failed")
8080
ErrPasswordHashFailed = web.NewErr(http.StatusOK, 10505, "err-password-hash-failed")
81+
ErrPasswordLength = web.NewErr(http.StatusOK, 10506, "err-password-length")
8182

8283
// 用户管理
8384
ErrIdentityAlreadyBound = web.NewErr(http.StatusOK, 10601, "err-identity-already-bound")
@@ -92,6 +93,8 @@ var (
9293
ErrEmailVerifyFailed = web.NewErr(http.StatusOK, 10611, "err-email-verify-failed")
9394
ErrEmailAlreadyBound = web.NewErr(http.StatusOK, 10612, "err-email-already-bound")
9495
ErrEmailTaken = web.NewErr(http.StatusOK, 10613, "err-email-taken")
96+
ErrEmailRequired = web.NewErr(http.StatusOK, 10614, "err-email-required")
97+
ErrEmailNotBound = web.NewErr(http.StatusOK, 10615, "err-email-not-bound")
9598

9699
// captcha 模块
97100
ErrCreateCaptchaFailed = web.NewErr(http.StatusOK, 10700, "err-create-captcha-failed")

backend/errcode/locale.en.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ other = "Team member limit exceeded"
8585
[err-invalid-password]
8686
other = "Invalid password"
8787

88+
[err-password-length]
89+
other = "Password must be between 8 and 32 characters"
90+
8891
[err-sms-failed]
8992
other = "SMS send failed"
9093

@@ -138,6 +141,12 @@ other = "Email already bound"
138141
[err-email-taken]
139142
other = "Email already taken by another user"
140143

144+
[err-email-required]
145+
other = "Email is required"
146+
147+
[err-email-not-bound]
148+
other = "Some emails are not bound, please bind email before resetting password"
149+
141150
[err-deposit-failed]
142151
other = "Deposit failed"
143152

backend/errcode/locale.zh.toml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,9 @@ other = "团队成员数量超出限制"
9494
[err-invalid-password]
9595
other = "密码无效"
9696

97+
[err-password-length]
98+
other = "密码长度必须在 8 到 32 个字符之间"
99+
97100
[err-sms-failed]
98101
other = "短信发送失败"
99102

@@ -145,6 +148,12 @@ other = "该邮箱已绑定"
145148
[err-email-taken]
146149
other = "该邮箱已被使用"
147150

151+
[err-email-required]
152+
other = "邮箱不能为空"
153+
154+
[err-email-not-bound]
155+
other = "存在未绑定邮箱的用户,请绑定邮箱后再重置密码"
156+
148157
[err-deposit-failed]
149158
other = "充值失败"
150159

0 commit comments

Comments
 (0)