Skip to content

Commit a8d4094

Browse files
committed
refactor(users): Improve user validation in bulk add feature
1 parent 236b1f7 commit a8d4094

2 files changed

Lines changed: 54 additions & 44 deletions

File tree

internal/schema/backyard_user_schema.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ type AddUsersErrorData struct {
114114
ExtraMessage string `json:"extra_message"`
115115
}
116116

117-
func (e *AddUsersErrorData) SetErrField(errFields []*validator.FormErrorField) {
118-
if len(errFields) > 0 {
119-
e.Field = errFields[0].ErrorField
120-
e.ExtraMessage = errFields[0].ErrorMsg
121-
}
117+
func (e *AddUsersErrorData) GetErrField(ctx context.Context) (errFields []*validator.FormErrorField) {
118+
return append([]*validator.FormErrorField{}, &validator.FormErrorField{
119+
ErrorField: "users",
120+
ErrorMsg: translator.TrWithData(handler.GetLangByCtx(ctx), reason.AddBulkUsersFormatError, e),
121+
})
122122
}
123123

124124
func (req *AddUsersReq) ParseUsers(ctx context.Context) (errFields []*validator.FormErrorField, err error) {

internal/service/user_admin/user_backyard.go

Lines changed: 49 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -176,45 +176,65 @@ func (us *UserAdminService) AddUsers(ctx context.Context, req *schema.AddUsersRe
176176
if err != nil {
177177
return resp, err
178178
}
179-
180-
users, resp, err := us.formatBulkAddUsers(ctx, req)
179+
errData := us.checkUserDuplicateInner(ctx, req.Users)
180+
if errData != nil {
181+
return errData.GetErrField(ctx), errors.BadRequest(reason.RequestFormatError)
182+
}
183+
users, errData, err := us.formatBulkAddUsers(ctx, req)
181184
if err != nil {
182185
return resp, err
183186
}
184-
err = us.userRepo.AddUsers(ctx, users)
185-
return nil, err
187+
if errData != nil {
188+
return errData.GetErrField(ctx), errors.BadRequest(reason.RequestFormatError)
189+
}
190+
return nil, us.userRepo.AddUsers(ctx, users)
186191
}
187192

188-
func (us *UserAdminService) formatBulkAddUsers(ctx context.Context, req *schema.AddUsersReq) (
189-
users []*entity.User, errFields []*validator.FormErrorField, err error) {
193+
func (us *UserAdminService) checkUserDuplicateInner(ctx context.Context, users []*schema.AddUserReq) (
194+
errorData *schema.AddUsersErrorData) {
190195
lang := handler.GetLangByCtx(ctx)
191196
val := validator.GetValidatorByLang(lang)
192-
errorData := &schema.AddUsersErrorData{Line: -1}
193-
existEmails := make(map[string]bool)
194-
existDisplayNames := make(map[string]bool)
195-
for line, user := range req.Users {
196-
if existEmails[user.Email] {
197-
errorData.Field = "email"
198-
errorData.Line = line + 1
199-
errorData.Content = user.Email
200-
errorData.ExtraMessage = translator.Tr(lang, reason.EmailDuplicate)
201-
break
202-
}
203-
if existDisplayNames[user.DisplayName] {
204-
errorData.Field = "name"
205-
errorData.Line = line + 1
206-
errorData.Content = user.DisplayName
207-
errorData.ExtraMessage = translator.Tr(lang, reason.UsernameDuplicate)
208-
break
209-
}
210197

211-
if fields, e := val.Check(user); e != nil {
212-
errorData.SetErrField(fields)
198+
emails := make(map[string]bool)
199+
displayNames := make(map[string]bool)
200+
for line, user := range users {
201+
if errFields, e := val.Check(user); e != nil {
202+
errorData = &schema.AddUsersErrorData{}
203+
if len(errFields) > 0 {
204+
errorData.Field = errFields[0].ErrorField
205+
errorData.ExtraMessage = errFields[0].ErrorMsg
206+
}
213207
errorData.Line = line + 1
214208
errorData.Content = fmt.Sprintf("%s, %s, %s", user.DisplayName, user.Email, user.Password)
215-
break
209+
return errorData
210+
}
211+
if emails[user.Email] {
212+
return &schema.AddUsersErrorData{
213+
Field: "email",
214+
Line: line + 1,
215+
Content: user.Email,
216+
ExtraMessage: translator.Tr(lang, reason.EmailDuplicate),
217+
}
216218
}
219+
if displayNames[user.DisplayName] {
220+
return &schema.AddUsersErrorData{
221+
Field: "name",
222+
Line: line + 1,
223+
Content: user.DisplayName,
224+
ExtraMessage: translator.Tr(lang, reason.UsernameDuplicate),
225+
}
226+
}
227+
emails[user.Email] = true
228+
displayNames[user.DisplayName] = true
229+
}
230+
return nil
231+
}
217232

233+
func (us *UserAdminService) formatBulkAddUsers(ctx context.Context, req *schema.AddUsersReq) (
234+
users []*entity.User, errorData *schema.AddUsersErrorData, err error) {
235+
lang := handler.GetLangByCtx(ctx)
236+
errorData = &schema.AddUsersErrorData{Line: -1}
237+
for line, user := range req.Users {
218238
_, has, e := us.userRepo.GetUserInfoByEmail(ctx, user.Email)
219239
if e != nil {
220240
return nil, nil, e
@@ -224,7 +244,7 @@ func (us *UserAdminService) formatBulkAddUsers(ctx context.Context, req *schema.
224244
errorData.Line = line + 1
225245
errorData.Content = user.Email
226246
errorData.ExtraMessage = translator.Tr(lang, reason.EmailDuplicate)
227-
break
247+
return nil, errorData, nil
228248
}
229249

230250
userInfo := &entity.User{}
@@ -238,22 +258,12 @@ func (us *UserAdminService) formatBulkAddUsers(ctx context.Context, req *schema.
238258
errorData.Line = line + 1
239259
errorData.Content = user.DisplayName
240260
errorData.ExtraMessage = translator.Tr(lang, reason.UsernameInvalid)
241-
break
261+
return nil, errorData, nil
242262
}
243263
userInfo.MailStatus = entity.EmailStatusAvailable
244264
userInfo.Status = entity.UserStatusAvailable
245265
userInfo.Rank = 1
246266
users = append(users, userInfo)
247-
existEmails[user.Email] = true
248-
existDisplayNames[user.DisplayName] = true
249-
}
250-
251-
if errorData.Line != -1 {
252-
errFields = append([]*validator.FormErrorField{}, &validator.FormErrorField{
253-
ErrorField: "users",
254-
ErrorMsg: translator.TrWithData(handler.GetLangByCtx(ctx), reason.AddBulkUsersFormatError, errorData),
255-
})
256-
return nil, errFields, errors.BadRequest(reason.RequestFormatError)
257267
}
258268
return users, nil, nil
259269
}

0 commit comments

Comments
 (0)