feat(user): add users

This commit is contained in:
LinkinStars
2023-08-14 12:13:28 +08:00
parent 51c86449e6
commit 22bdc06fe9
5 changed files with 118 additions and 1 deletions
@@ -91,6 +91,26 @@ func (uc *UserAdminController) AddUser(ctx *gin.Context) {
handler.HandleResponse(ctx, err, nil)
}
// AddUsers add users
// @Summary add users
// @Description add users
// @Security ApiKeyAuth
// @Tags admin
// @Accept json
// @Produce json
// @Param data body schema.AddUserReq true "user"
// @Success 200 {object} handler.RespBody
// @Router /answer/admin/api/users [post]
func (uc *UserAdminController) AddUsers(ctx *gin.Context) {
req := &schema.AddUsersReq{}
if handler.BindAndCheck(ctx, req) {
return
}
err := uc.userService.AddUsers(ctx, req)
handler.HandleResponse(ctx, err, nil)
}
// UpdateUserPassword update user password
// @Summary update user password
// @Description update user password
+9
View File
@@ -70,6 +70,15 @@ func (ur *userAdminRepo) AddUser(ctx context.Context, user *entity.User) (err er
return
}
// AddUsers add users
func (ur *userAdminRepo) AddUsers(ctx context.Context, users []*entity.User) (err error) {
_, err = ur.data.DB.Context(ctx).Insert(users)
if err != nil {
err = errors.InternalServer(reason.DatabaseError).WithError(err).WithStack()
}
return
}
// UpdateUserPassword update user password
func (ur *userAdminRepo) UpdateUserPassword(ctx context.Context, userID string, password string) (err error) {
_, err = ur.data.DB.Context(ctx).ID(userID).Update(&entity.User{Pass: password})
+1
View File
@@ -261,6 +261,7 @@ func (a *AnswerAPIRouter) RegisterAnswerAdminAPIRouter(r *gin.RouterGroup) {
r.GET("/user/activation", a.adminUserController.GetUserActivation)
r.POST("/user/activation", a.adminUserController.SendUserActivation)
r.POST("/user", a.adminUserController.AddUser)
r.POST("/users", a.adminUserController.AddUsers)
r.PUT("/user/password", a.adminUserController.UpdateUserPassword)
// reason
+31 -1
View File
@@ -1,6 +1,11 @@
package schema
import "github.com/answerdev/answer/internal/base/constant"
import (
"context"
"fmt"
"github.com/answerdev/answer/internal/base/constant"
"strings"
)
// UpdateUserStatusReq update user request
type UpdateUserStatusReq struct {
@@ -87,6 +92,31 @@ type AddUserReq struct {
LoginUserID string `json:"-"`
}
// AddUsersReq add users request
type AddUsersReq struct {
// users info line by line
UsersStr string `json:"users"`
Users []*AddUserReq `json:"-"`
}
func (req *AddUsersReq) ParseUsers(ctx context.Context) error {
req.UsersStr = strings.TrimSpace(req.UsersStr)
lines := strings.Split(req.UsersStr, "\n")
req.Users = make([]*AddUserReq, 0)
for i, line := range lines {
arr := strings.Split(line, ",")
if len(arr) != 3 {
return fmt.Errorf("error format at line %d", i)
}
req.Users = append(req.Users, &AddUserReq{
DisplayName: arr[0],
Email: arr[1],
Password: arr[2],
})
}
return nil
}
// UpdateUserPasswordReq update user password request
type UpdateUserPasswordReq struct {
UserID string `validate:"required" json:"user_id"`
@@ -4,6 +4,8 @@ import (
"context"
"fmt"
"github.com/answerdev/answer/internal/base/constant"
"github.com/answerdev/answer/internal/base/handler"
"github.com/answerdev/answer/internal/base/validator"
"github.com/answerdev/answer/internal/service/export"
"github.com/google/uuid"
"net/mail"
@@ -34,6 +36,7 @@ type UserAdminRepo interface {
GetUserPage(ctx context.Context, page, pageSize int, user *entity.User,
usernameOrDisplayName string, isStaff bool) (users []*entity.User, total int64, err error)
AddUser(ctx context.Context, user *entity.User) (err error)
AddUsers(ctx context.Context, users []*entity.User) (err error)
UpdateUserPassword(ctx context.Context, userID string, password string) (err error)
}
@@ -165,6 +168,60 @@ func (us *UserAdminService) AddUser(ctx context.Context, req *schema.AddUserReq)
return
}
// AddUsers add users
func (us *UserAdminService) AddUsers(ctx context.Context, req *schema.AddUsersReq) (err error) {
err = req.ParseUsers(ctx)
if err != nil {
return errors.BadRequest(reason.RequestFormatError).WithMsg(err.Error())
}
if len(req.Users) == 0 {
return errors.BadRequest(reason.RequestFormatError).WithMsg("not found any user")
}
if len(req.Users) > 5000 {
return errors.BadRequest(reason.RequestFormatError).WithMsg("Add up to 5000 users at one time")
}
users, err := us.formatBulkAddUsers(ctx, req)
if err != nil {
return err
}
return us.userRepo.AddUsers(ctx, users)
}
func (us *UserAdminService) formatBulkAddUsers(ctx context.Context, req *schema.AddUsersReq) (
users []*entity.User, err error) {
val := validator.GetValidatorByLang(handler.GetLangByCtx(ctx))
for _, user := range req.Users {
_, err = val.Check(user)
if err != nil {
return nil, err
}
_, has, err := us.userRepo.GetUserInfoByEmail(ctx, user.Email)
if err != nil {
return nil, err
}
if has {
return nil, errors.BadRequest(reason.EmailDuplicate)
}
userInfo := &entity.User{}
userInfo.EMail = user.Email
userInfo.DisplayName = user.DisplayName
hashPwd, _ := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
userInfo.Pass = string(hashPwd)
userInfo.Username, err = us.userCommonService.MakeUsername(ctx, userInfo.DisplayName)
if err != nil {
return nil, err
}
userInfo.MailStatus = entity.EmailStatusAvailable
userInfo.Status = entity.UserStatusAvailable
userInfo.Rank = 1
users = append(users, userInfo)
}
return users, nil
}
// UpdateUserPassword update user password
func (us *UserAdminService) UpdateUserPassword(ctx context.Context, req *schema.UpdateUserPasswordReq) (err error) {
// Users cannot modify their password