From 21bf0cbec2ff9df14dc25a97c55294527dd2d34c Mon Sep 17 00:00:00 2001 From: caisi35 Date: Wed, 5 Feb 2025 11:17:50 +0800 Subject: [PATCH] fix(user):duplicate name --- api/user/user.go | 31 ++++++++++++++++++++++++++++--- internal/user/user.go | 11 +++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/api/user/user.go b/api/user/user.go index e0bef5ff..388dce34 100644 --- a/api/user/user.go +++ b/api/user/user.go @@ -2,6 +2,7 @@ package user import ( "github.com/0xJacky/Nginx-UI/api" + internalUser "github.com/0xJacky/Nginx-UI/internal/user" "github.com/0xJacky/Nginx-UI/model" "github.com/0xJacky/Nginx-UI/query" "github.com/0xJacky/Nginx-UI/settings" @@ -12,6 +13,10 @@ import ( "net/http" ) +const ( + ErrDuplicateName = 4409 +) + func GetUsers(c *gin.Context) { cosy.Core[model.User](c).SetFussy("name").PagingList() } @@ -58,10 +63,16 @@ func AddUser(c *gin.Context) { } // duplicate name - _, err = u.Where(u.Name.Eq(json.Name)).First() - if !(err != nil && err.Error() == "record not found") { + existUser, err := u.Where(u.Name.Eq(json.Name)).Find() + if err != nil { + api.ErrHandler(c, err) + return + } + err = internalUser.CheckDuplicateName(existUser) + if err != nil { c.JSON(http.StatusConflict, gin.H{ - "message": "name already exists", + "message": err.Error(), + "code": ErrDuplicateName, }) } @@ -114,6 +125,20 @@ func EditUser(c *gin.Context) { edit.Password = string(pwd) } + // duplicate name + existUser, err := u.Where(u.Name.Eq(json.Name)).Find() + if err != nil { + api.ErrHandler(c, err) + return + } + err = internalUser.CheckDuplicateName(existUser) + if err != nil { + c.JSON(http.StatusConflict, gin.H{ + "message": err.Error(), + "code": ErrDuplicateName, + }) + } + _, err = u.Where(u.ID.Eq(userId)).Updates(&edit) if err != nil { diff --git a/internal/user/user.go b/internal/user/user.go index 6cbdc071..45ac1191 100644 --- a/internal/user/user.go +++ b/internal/user/user.go @@ -11,6 +11,10 @@ import ( "time" ) +var ( + ErrDuplicateName = errors.New("name already exists") +) + const ExpiredTime = 24 * time.Hour type JWTClaims struct { @@ -109,3 +113,10 @@ func ValidateJWT(tokenStr string) (claims *JWTClaims, err error) { } return nil, errors.New("invalid claims type") } + +func CheckDuplicateName(users []*model.User) error { + if len(users) > 0 { + return ErrDuplicateName + } + return nil +} \ No newline at end of file