Skip to content

Commit 00e40ad

Browse files
committed
feat(users): add users error message
1 parent 22bdc06 commit 00e40ad

6 files changed

Lines changed: 101 additions & 34 deletions

File tree

i18n/en_US.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,10 @@ backend:
251251
other: Access denied
252252
page_access_denied:
253253
other: You do not have access to this page.
254+
add_bulk_users_format_error:
255+
other: "Error {{.Field}} format near '{{.Content}}' at line {{.Line}}. {{.ExtraMessage}}"
256+
add_bulk_users_amount_error:
257+
other: "The number of users you add at once should be in the range of 1-{{.MaxAmount}}."
254258
config:
255259
read_config_failed:
256260
other: Read config failed

internal/base/constant/constant.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package constant
22

33
const (
44
DefaultPageSize = 20 // Default number of pages
5+
DefaultBulkUser = 5000
56
)
67

78
var (

internal/base/reason/reason.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ const (
7676
AdminCannotModifySelfStatus = "error.admin.cannot_modify_self_status"
7777
UserAccessDenied = "error.user.access_denied"
7878
UserPageAccessDenied = "error.user.page_access_denied"
79+
80+
AddBulkUsersFormatError = "error.user.add_bulk_users_format_error"
81+
AddBulkUsersAmountError = "error.user.add_bulk_users_amount_error"
7982
)
8083

8184
// user external login reasons

internal/controller_admin/user_backyard_controller.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,8 @@ func (uc *UserAdminController) AddUsers(ctx *gin.Context) {
107107
return
108108
}
109109

110-
err := uc.userService.AddUsers(ctx, req)
111-
handler.HandleResponse(ctx, err, nil)
110+
resp, err := uc.userService.AddUsers(ctx, req)
111+
handler.HandleResponse(ctx, err, resp)
112112
}
113113

114114
// UpdateUserPassword update user password

internal/schema/backyard_user_schema.go

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,12 @@ package schema
22

33
import (
44
"context"
5-
"fmt"
65
"github.com/answerdev/answer/internal/base/constant"
6+
"github.com/answerdev/answer/internal/base/handler"
7+
"github.com/answerdev/answer/internal/base/reason"
8+
"github.com/answerdev/answer/internal/base/translator"
9+
"github.com/answerdev/answer/internal/base/validator"
10+
"github.com/segmentfault/pacman/errors"
711
"strings"
812
)
913

@@ -99,22 +103,60 @@ type AddUsersReq struct {
99103
Users []*AddUserReq `json:"-"`
100104
}
101105

102-
func (req *AddUsersReq) ParseUsers(ctx context.Context) error {
106+
type AddUsersErrorData struct {
107+
// optional. error field name.
108+
Field string `json:"field"`
109+
// must. error line number.
110+
Line int `json:"line"`
111+
// must. error content.
112+
Content string `json:"content"`
113+
// optional. error message.
114+
ExtraMessage string `json:"extra_message"`
115+
}
116+
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+
}
122+
}
123+
124+
func (req *AddUsersReq) ParseUsers(ctx context.Context) (errFields []*validator.FormErrorField, err error) {
103125
req.UsersStr = strings.TrimSpace(req.UsersStr)
104126
lines := strings.Split(req.UsersStr, "\n")
105127
req.Users = make([]*AddUserReq, 0)
106128
for i, line := range lines {
107129
arr := strings.Split(line, ",")
108130
if len(arr) != 3 {
109-
return fmt.Errorf("error format at line %d", i)
131+
errFields = append([]*validator.FormErrorField{}, &validator.FormErrorField{
132+
ErrorField: "users",
133+
ErrorMsg: translator.TrWithData(handler.GetLangByCtx(ctx), reason.AddBulkUsersFormatError,
134+
&AddUsersErrorData{
135+
Line: i + 1,
136+
Content: line,
137+
}),
138+
})
139+
return errFields, errors.BadRequest(reason.RequestFormatError)
110140
}
111141
req.Users = append(req.Users, &AddUserReq{
112-
DisplayName: arr[0],
113-
Email: arr[1],
114-
Password: arr[2],
142+
DisplayName: strings.TrimSpace(arr[0]),
143+
Email: strings.TrimSpace(arr[1]),
144+
Password: strings.TrimSpace(arr[2]),
145+
})
146+
}
147+
148+
// check users amount
149+
if len(req.Users) <= 0 || len(req.Users) > constant.DefaultBulkUser {
150+
errFields = append([]*validator.FormErrorField{}, &validator.FormErrorField{
151+
ErrorField: "users",
152+
ErrorMsg: translator.TrWithData(handler.GetLangByCtx(ctx), reason.AddBulkUsersAmountError,
153+
map[string]int{
154+
"MaxAmount": constant.DefaultBulkUser,
155+
}),
115156
})
157+
return errFields, errors.BadRequest(reason.RequestFormatError)
116158
}
117-
return nil
159+
return nil, nil
118160
}
119161

120162
// UpdateUserPasswordReq update user password request

internal/service/user_admin/user_backyard.go

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"github.com/answerdev/answer/internal/base/constant"
77
"github.com/answerdev/answer/internal/base/handler"
8+
"github.com/answerdev/answer/internal/base/translator"
89
"github.com/answerdev/answer/internal/base/validator"
910
"github.com/answerdev/answer/internal/service/export"
1011
"github.com/google/uuid"
@@ -169,40 +170,44 @@ func (us *UserAdminService) AddUser(ctx context.Context, req *schema.AddUserReq)
169170
}
170171

171172
// AddUsers add users
172-
func (us *UserAdminService) AddUsers(ctx context.Context, req *schema.AddUsersReq) (err error) {
173-
err = req.ParseUsers(ctx)
173+
func (us *UserAdminService) AddUsers(ctx context.Context, req *schema.AddUsersReq) (
174+
resp []*validator.FormErrorField, err error) {
175+
resp, err = req.ParseUsers(ctx)
174176
if err != nil {
175-
return errors.BadRequest(reason.RequestFormatError).WithMsg(err.Error())
177+
return resp, err
176178
}
177-
if len(req.Users) == 0 {
178-
return errors.BadRequest(reason.RequestFormatError).WithMsg("not found any user")
179-
}
180-
if len(req.Users) > 5000 {
181-
return errors.BadRequest(reason.RequestFormatError).WithMsg("Add up to 5000 users at one time")
182-
}
183-
users, err := us.formatBulkAddUsers(ctx, req)
179+
180+
users, resp, err := us.formatBulkAddUsers(ctx, req)
184181
if err != nil {
185-
return err
182+
return resp, err
186183
}
187-
return us.userRepo.AddUsers(ctx, users)
184+
err = us.userRepo.AddUsers(ctx, users)
185+
return nil, err
188186
}
189187

190188
func (us *UserAdminService) formatBulkAddUsers(ctx context.Context, req *schema.AddUsersReq) (
191-
users []*entity.User, err error) {
192-
193-
val := validator.GetValidatorByLang(handler.GetLangByCtx(ctx))
194-
for _, user := range req.Users {
195-
_, err = val.Check(user)
196-
if err != nil {
197-
return nil, err
189+
users []*entity.User, errFields []*validator.FormErrorField, err error) {
190+
lang := handler.GetLangByCtx(ctx)
191+
val := validator.GetValidatorByLang(lang)
192+
errorData := &schema.AddUsersErrorData{Line: -1}
193+
for line, user := range req.Users {
194+
if fields, e := val.Check(user); e != nil {
195+
errorData.SetErrField(fields)
196+
errorData.Line = line + 1
197+
errorData.Content = fmt.Sprintf("%s, %s", user.DisplayName, user.Email)
198+
break
198199
}
199200

200-
_, has, err := us.userRepo.GetUserInfoByEmail(ctx, user.Email)
201-
if err != nil {
202-
return nil, err
201+
_, has, e := us.userRepo.GetUserInfoByEmail(ctx, user.Email)
202+
if e != nil {
203+
return nil, nil, e
203204
}
204205
if has {
205-
return nil, errors.BadRequest(reason.EmailDuplicate)
206+
errorData.Field = "email"
207+
errorData.Line = line + 1
208+
errorData.Content = user.Email
209+
errorData.ExtraMessage = translator.Tr(lang, reason.EmailDuplicate)
210+
break
206211
}
207212

208213
userInfo := &entity.User{}
@@ -212,14 +217,26 @@ func (us *UserAdminService) formatBulkAddUsers(ctx context.Context, req *schema.
212217
userInfo.Pass = string(hashPwd)
213218
userInfo.Username, err = us.userCommonService.MakeUsername(ctx, userInfo.DisplayName)
214219
if err != nil {
215-
return nil, err
220+
errorData.Field = "display_name"
221+
errorData.Line = line + 1
222+
errorData.Content = user.DisplayName
223+
errorData.ExtraMessage = translator.Tr(lang, reason.UsernameInvalid)
224+
break
216225
}
217226
userInfo.MailStatus = entity.EmailStatusAvailable
218227
userInfo.Status = entity.UserStatusAvailable
219228
userInfo.Rank = 1
220229
users = append(users, userInfo)
221230
}
222-
return users, nil
231+
232+
if errorData.Line != -1 {
233+
errFields = append([]*validator.FormErrorField{}, &validator.FormErrorField{
234+
ErrorField: "users",
235+
ErrorMsg: translator.TrWithData(handler.GetLangByCtx(ctx), reason.AddBulkUsersFormatError, errorData),
236+
})
237+
return nil, errFields, errors.BadRequest(reason.RequestFormatError)
238+
}
239+
return users, nil, nil
223240
}
224241

225242
// UpdateUserPassword update user password

0 commit comments

Comments
 (0)