From a6096bee06139eec0b3becf02c83423e6ea01004 Mon Sep 17 00:00:00 2001 From: dushixiang Date: Sat, 5 Mar 2022 16:17:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=BB=84=E5=92=8C=E7=94=A8=E6=88=B7=E5=90=8D=E5=94=AF=E4=B8=80?= =?UTF-8?q?=E5=88=A4=E6=96=AD=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/user.go | 3 +-- server/repository/user.go | 15 +++++++++------ server/repository/user_group.go | 13 +++++++++++++ server/service/backup.go | 6 +++++- server/service/user.go | 32 +++++++++++++++++++++++++++++++- server/service/user_group.go | 32 ++++++++++++++++++-------------- 6 files changed, 77 insertions(+), 24 deletions(-) diff --git a/server/api/user.go b/server/api/user.go index 80370e0..caa4599 100644 --- a/server/api/user.go +++ b/server/api/user.go @@ -62,9 +62,8 @@ func (userApi UserApi) UserUpdateEndpoint(c echo.Context) error { if err := c.Bind(&item); err != nil { return err } - item.ID = id - if err := repository.UserRepository.Update(context.TODO(), &item); err != nil { + if err := service.UserService.UpdateUser(id, item); err != nil { return err } diff --git a/server/repository/user.go b/server/repository/user.go index 5b9cbb0..f2804d4 100644 --- a/server/repository/user.go +++ b/server/repository/user.go @@ -78,14 +78,17 @@ func (r userRepository) FindByUsername(c context.Context, username string) (o mo return } -func (r userRepository) ExistByUsername(c context.Context, username string) (exist bool) { - count := int64(0) - err := r.GetDB(c).Table("users").Where("username = ?", username).Count(&count).Error +func (r userRepository) ExistByUsername(c context.Context, username string) (exist bool, err error) { + user := model.User{} + var count uint64 + err = r.GetDB(c).Table(user.TableName()).Select("count(*)"). + Where("username = ?", username). + Find(&count). + Error if err != nil { - return false + return false, err } - - return count > 0 + return count > 0, nil } func (r userRepository) FindOnlineUsers(c context.Context) (o []model.User, err error) { diff --git a/server/repository/user_group.go b/server/repository/user_group.go index 54f3675..5d8b826 100644 --- a/server/repository/user_group.go +++ b/server/repository/user_group.go @@ -57,6 +57,19 @@ func (r userGroupRepository) FindByName(c context.Context, name string) (o model return } +func (r userGroupRepository) ExistByName(ctx context.Context, name string) (exists bool, err error) { + userGroup := model.UserGroup{} + var count uint64 + err = r.GetDB(ctx).Table(userGroup.TableName()).Select("count(*)"). + Where("name = ?", name). + Find(&count). + Error + if err != nil { + return false, err + } + return count > 0, nil +} + func (r userGroupRepository) Create(c context.Context, o *model.UserGroup) (err error) { return r.GetDB(c).Create(o).Error } diff --git a/server/service/backup.go b/server/service/backup.go index 3eef961..0184d68 100644 --- a/server/service/backup.go +++ b/server/service/backup.go @@ -133,7 +133,11 @@ func (service backupService) Import(backup *dto.Backup) error { if len(backup.Users) > 0 { for _, item := range backup.Users { oldId := item.ID - if repository.UserRepository.ExistByUsername(c, item.Username) { + exist, err := repository.UserRepository.ExistByUsername(c, item.Username) + if err != nil { + return err + } + if exist { delete(userIdMapping, oldId) continue } diff --git a/server/service/user.go b/server/service/user.go index b63863e..a920c41 100644 --- a/server/service/user.go +++ b/server/service/user.go @@ -209,7 +209,11 @@ func (service userService) ReloadToken() error { func (service userService) CreateUser(user model.User) (err error) { return env.GetDB().Transaction(func(tx *gorm.DB) error { c := service.Context(tx) - if repository.UserRepository.ExistByUsername(c, user.Username) { + exist, err := repository.UserRepository.ExistByUsername(c, user.Username) + if err != nil { + return err + } + if exist { return fmt.Errorf("username %s is already used", user.Username) } password := user.Password @@ -307,3 +311,29 @@ func (service userService) SaveLoginLog(clientIP, clientUserAgent string, userna func (service userService) DeleteALlLdapUser(ctx context.Context) error { return repository.UserRepository.DeleteBySource(ctx, constant.SourceLdap) } + +func (service userService) UpdateUser(id string, user model.User) error { + + return env.GetDB().Transaction(func(tx *gorm.DB) error { + ctx := service.Context(tx) + + dbUser, err := repository.UserRepository.FindById(ctx, id) + if err != nil { + return err + } + + if dbUser.Username != user.Username { + // 修改了登录账号 + exist, err := repository.UserRepository.ExistByUsername(ctx, user.Username) + if err != nil { + return err + } + if exist { + return fmt.Errorf("username %s is already used", user.Username) + } + } + + return repository.UserRepository.Update(ctx, &user) + }) + +} diff --git a/server/service/user_group.go b/server/service/user_group.go index 58af149..47ed9e3 100644 --- a/server/service/user_group.go +++ b/server/service/user_group.go @@ -2,7 +2,6 @@ package service import ( "context" - "errors" "next-terminal/server/constant" "next-terminal/server/env" @@ -36,14 +35,13 @@ func (service userGroupService) DeleteById(userGroupId string) error { } func (service userGroupService) Create(name string, members []string) (model.UserGroup, error) { - var err error - _, err = repository.UserGroupRepository.FindByName(context.TODO(), name) - if err == nil { - return model.UserGroup{}, constant.ErrNameAlreadyUsed + exist, err := repository.UserGroupRepository.ExistByName(context.TODO(), name) + if err != nil { + return model.UserGroup{}, err } - if !errors.Is(gorm.ErrRecordNotFound, err) { - return model.UserGroup{}, err + if exist { + return model.UserGroup{}, constant.ErrNameAlreadyUsed } userGroupId := utils.UUID() @@ -76,15 +74,21 @@ func (service userGroupService) Create(name string, members []string) (model.Use } func (service userGroupService) Update(userGroupId string, name string, members []string) (err error) { - var userGroup model.UserGroup - userGroup, err = repository.UserGroupRepository.FindByName(context.TODO(), name) - if err == nil && userGroup.ID != userGroupId { - return constant.ErrNameAlreadyUsed - } - - if errors.Is(gorm.ErrRecordNotFound, err) { + dbUserGroup, err := repository.UserGroupRepository.FindById(context.TODO(), userGroupId) + if err != nil { return err } + if dbUserGroup.Name != name { + // 修改了名称 + exist, err := repository.UserGroupRepository.ExistByName(context.TODO(), name) + if err != nil { + return err + } + + if exist { + return constant.ErrNameAlreadyUsed + } + } return env.GetDB().Transaction(func(tx *gorm.DB) error { c := context.WithValue(context.TODO(), constant.DB, tx)