diff --git a/core/controllers/project.go b/core/controllers/project.go index fa1b2870..37b34056 100644 --- a/core/controllers/project.go +++ b/core/controllers/project.go @@ -53,8 +53,6 @@ func GetProjectList(c *gin.Context) { // count cache cache := map[primitive.ObjectID]int{} - - // iterate for _, p := range projects { ids = append(ids, p.Id) cache[p.Id] = 0 @@ -80,11 +78,9 @@ func GetProjectList(c *gin.Context) { } // assign - var data []models.Project - for _, p := range projects { - p.Spiders = cache[p.Id] - data = append(data, p) + for i, p := range projects { + projects[i].Spiders = cache[p.Id] } - HandleSuccessWithListData(c, data, total) + HandleSuccessWithListData(c, projects, total) } diff --git a/core/controllers/router.go b/core/controllers/router.go index 13f0fefb..409a9bee 100644 --- a/core/controllers/router.go +++ b/core/controllers/router.go @@ -258,7 +258,12 @@ func InitRoutes(app *gin.Engine) (err error) { { Method: http.MethodPut, Path: "/me", - HandlerFunc: PutUserById, + HandlerFunc: PutUserMe, + }, + { + Method: http.MethodPost, + Path: "/me/change-password", + HandlerFunc: PostUserMeChangePassword, }, }...)) diff --git a/core/controllers/user.go b/core/controllers/user.go index a7ae4143..a67b06ba 100644 --- a/core/controllers/user.go +++ b/core/controllers/user.go @@ -18,28 +18,7 @@ func GetUserById(c *gin.Context) { HandleErrorBadRequest(c, err) return } - - // get user - user, err := service.NewModelService[models.User]().GetById(id) - if err != nil { - HandleErrorInternalServerError(c, err) - return - } - - // get role - if utils.IsPro() { - if !user.RoleId.IsZero() { - role, err := service.NewModelService[models.Role]().GetById(user.RoleId) - if err != nil { - HandleErrorInternalServerError(c, err) - return - } - user.Role = role.Name - user.IsAdmin = role.Admin - } - } - - HandleSuccessWithData(c, user) + getUserById(id, c) } func GetUserList(c *gin.Context) { @@ -150,6 +129,15 @@ func PostUser(c *gin.Context) { HandleSuccessWithData(c, result) } +func PutUserById(c *gin.Context) { + id, err := primitive.ObjectIDFromHex(c.Param("id")) + if err != nil { + HandleErrorBadRequest(c, err) + return + } + putUser(id, c) +} + func PostUserChangePassword(c *gin.Context) { // get id id, err := primitive.ObjectIDFromHex(c.Param("id")) @@ -158,65 +146,49 @@ func PostUserChangePassword(c *gin.Context) { return } - // get payload - var payload struct { - Password string `json:"password"` - } - if err := c.ShouldBindJSON(&payload); err != nil { - HandleErrorBadRequest(c, err) - return - } - if len(payload.Password) < 5 { - HandleErrorBadRequest(c, errors.New("password must be at least 5 characters")) - return - } - - // get user - u := GetUserFromContext(c) - modelSvc := service.NewModelService[models.User]() - - // update password - userDb, err := modelSvc.GetById(id) - if err != nil { - HandleErrorInternalServerError(c, err) - return - } - userDb.SetUpdated(u.Id) - userDb.Password = utils.EncryptMd5(payload.Password) - if err := modelSvc.ReplaceById(userDb.Id, *userDb); err != nil { - HandleErrorInternalServerError(c, err) - return - } - - // handle success - HandleSuccess(c) + postUserChangePassword(id, c) } func GetUserMe(c *gin.Context) { u := GetUserFromContext(c) - _u, err := service.NewModelService[models.User]().GetById(u.Id) + getUserById(u.Id, c) +} + +func PutUserMe(c *gin.Context) { + u := GetUserFromContext(c) + putUser(u.Id, c) +} + +func PostUserMeChangePassword(c *gin.Context) { + u := GetUserFromContext(c) + postUserChangePassword(u.Id, c) +} + +func getUserById(userId primitive.ObjectID, c *gin.Context) { + // get user + user, err := service.NewModelService[models.User]().GetById(userId) if err != nil { HandleErrorInternalServerError(c, err) return } + // get role if utils.IsPro() { - if !_u.RoleId.IsZero() { - r, err := service.NewModelService[models.Role]().GetById(_u.RoleId) + if !user.RoleId.IsZero() { + role, err := service.NewModelService[models.Role]().GetById(user.RoleId) if err != nil { HandleErrorInternalServerError(c, err) return } - _u.Role = r.Name - _u.IsAdmin = r.Admin - _u.Routes = r.Routes + user.Role = role.Name + user.IsAdmin = role.Admin } } - HandleSuccessWithData(c, _u) + HandleSuccessWithData(c, user) } -func PutUserById(c *gin.Context) { +func putUser(userId primitive.ObjectID, c *gin.Context) { // get payload var user models.User if err := c.ShouldBindJSON(&user); err != nil { @@ -224,14 +196,11 @@ func PutUserById(c *gin.Context) { return } - // get user - u := GetUserFromContext(c) - // model service modelSvc := service.NewModelService[models.User]() // update user - userDb, err := modelSvc.GetById(u.Id) + userDb, err := modelSvc.GetById(userId) if err != nil { HandleErrorInternalServerError(c, err) return @@ -246,6 +215,9 @@ func PutUserById(c *gin.Context) { // disallow changing password user.Password = userDb.Password + // current user + u := GetUserFromContext(c) + // update user user.SetUpdated(u.Id) if user.Id.IsZero() { @@ -259,3 +231,37 @@ func PutUserById(c *gin.Context) { // handle success HandleSuccess(c) } + +func postUserChangePassword(userId primitive.ObjectID, c *gin.Context) { + // get payload + var payload struct { + Password string `json:"password"` + } + if err := c.ShouldBindJSON(&payload); err != nil { + HandleErrorBadRequest(c, err) + return + } + if len(payload.Password) < 5 { + HandleErrorBadRequest(c, errors.New("password must be at least 5 characters")) + return + } + + // current user + u := GetUserFromContext(c) + + // update password + userDb, err := service.NewModelService[models.User]().GetById(userId) + if err != nil { + HandleErrorInternalServerError(c, err) + return + } + userDb.SetUpdated(u.Id) + userDb.Password = utils.EncryptMd5(payload.Password) + if err := service.NewModelService[models.User]().ReplaceById(userDb.Id, *userDb); err != nil { + HandleErrorInternalServerError(c, err) + return + } + + // handle success + HandleSuccess(c) +} diff --git a/core/models/models/role.go b/core/models/models/role.go index f377d981..898d64a6 100644 --- a/core/models/models/role.go +++ b/core/models/models/role.go @@ -8,4 +8,5 @@ type Role struct { Routes []string `json:"routes" bson:"routes"` Admin bool `json:"-" bson:"admin,omitempty"` IsAdmin bool `json:"admin" bson:"-"` + Users int `json:"users" bson:"-"` }