package repository import ( "github.com/pkg/errors" "gorm.io/gorm" "sghgogs.com/sghblog/authorization-service/domain/model/base" req "sghgogs.com/sghblog/authorization-service/domain/model/request" pb "sghgogs.com/sghblog/authorization-service/proto" ) func (u *Repository) GetAdminUser(userId int64) (req.AdminUser, error) { var user req.AdminUser return user, u.db.Where("id = ? ", userId). Preload("Roles", "status = ?", pb.StatusEnum_ENABLED). Preload("Teams", "status = ?", pb.StatusEnum_ENABLED). First(&user).Error } func (u *Repository) GetAdminUserFind(name string) (req.AdminUser, error) { var user req.AdminUser return user, u.db.Where("username = ?", name).First(&user).Error } func (u *Repository) RetrieveEnabledUsers() ([]req.AdminUser, error) { users := make([]req.AdminUser, 0) return users, u.db.Model(req.AdminUser{}). Order("id desc"). Select("ID", "Username"). Where("status = ?", pb.StatusEnum_ENABLED). Find(&users).Error } func (u *Repository) ListAdminUsers(query *pb.ListAdminUsersRequest) ([]req.AdminUser, int64, error) { var totalCount int64 tx := u.db.Model(&req.AdminUser{}).Order("id desc"). Preload("Roles", "status = ?", pb.StatusEnum_ENABLED). Preload("Teams", "status = ?", pb.StatusEnum_ENABLED) if query.Keyword != "" { tx.Where("username = ? OR phone_number = ?", query.Keyword, query.Keyword) } if base.IsStatusEnum(query.Status) { tx.Where("status = ?", query.Status) } tx.Count(&totalCount) users := make([]req.AdminUser, 0) return users, totalCount, tx.Limit(int(query.PageSize)).Offset(int((query.Page - 1) * query.PageSize)).Find(&users).Error } func (u *Repository) CreateAdminUser(user *req.AdminUser, adminRoles []int64, adminTeams []int64) error { // 开始事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() if err := tx.Create(&user).Error; err != nil { tx.Rollback() return err } // 角色关联 if len(adminRoles) > 0 { if _, err := u.getAdminRoleValidIDs(adminRoles); err != nil { tx.Rollback() return err } roles := make([]req.AdminRole, 0) for _, ID := range adminRoles { roles = append(roles, req.AdminRole{ID: ID}) } if err := tx.Model(&user).Association("Roles").Append(&roles); err != nil { tx.Rollback() return err } } if len(adminTeams) > 0 { if _, err := u.getAdminTeamValidIDs(adminTeams); err != nil { tx.Rollback() return err } teams := make([]req.AdminTeam, 0) for _, ID := range adminTeams { teams = append(teams, req.AdminTeam{ID: ID}) } if err := tx.Model(&user).Association("Teams").Append(&teams); err != nil { tx.Rollback() return err } } return tx.Commit().Error } func (u *Repository) IsAdminUserExists(identifier interface{}) (bool, error) { var user req.AdminUser if err := u.db.Where("id = ? OR username = ?", identifier, identifier).First(&user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil // 记录不存在,账号不存在 } return false, err // 发生其他错误 } return true, nil } func (u *Repository) UpdateAdminUser(updateUser *pb.UpdateAdminUserRequest) error { // updateUser. // 1. 开启事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() var user req.AdminUser // 1.查询角色 if err := tx.First(&user, updateUser.Id).Error; err != nil { tx.Rollback() return err } if err := tx.Model(&user).Association("Teams").Clear(); err != nil { tx.Rollback() return err } if len(updateUser.Teams) > 0 { if _, err := u.getAdminTeamValidIDs(updateUser.Teams); err != nil { tx.Rollback() return err } teams := make([]req.AdminTeam, 0) for _, ID := range updateUser.Teams { teams = append(teams, req.AdminTeam{ ID: ID, }) } if err := tx.Model(&user).Association("Teams").Append(&teams); err != nil { tx.Rollback() return err } } if err := tx.Model(&user).Association("Roles").Clear(); err != nil { tx.Rollback() return err } if len(updateUser.Roles) > 0 { if _, err := u.getAdminRoleValidIDs(updateUser.Roles); err != nil { tx.Rollback() return err } // 移除关联 roles := make([]req.AdminRole, 0) for _, ID := range updateUser.Roles { roles = append(roles, req.AdminRole{ ID: ID, }) } // 重新关联 if err := tx.Model(&user).Association("Roles").Append(&roles); err != nil { tx.Rollback() return err } } if err := tx.Model(&user).Updates(map[string]interface{}{ "phone_number": updateUser.PhoneNumber, "email": updateUser.Email, "avatar": updateUser.Avatar, }).Error; err != nil { tx.Rollback() return err } return tx.Commit().Error } func (u *Repository) DeleteAdminUser(userId int64) error { // 1. 开启事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() var user req.AdminUser // 1.查询角色 if err := tx.First(&user, userId).Error; err != nil { tx.Rollback() return err } if err := tx.Model(&user).Association("Roles").Clear(); err != nil { tx.Rollback() return err } // 1.2移除关联团队 if err := tx.Model(&user).Association("Teams").Clear(); err != nil { tx.Rollback() return err } if err := tx.Model(&req.AdminUser{}).Delete(&req.AdminUser{ ID: userId, }).Error; err != nil { tx.Rollback() return err } return tx.Commit().Error } func (u *Repository) ToggleAdminUser(adminUser *pb.ToggleAdminUserRequest) error { // 1. 开启事务 tx := u.db.Begin() // 错误处理 defer func() { if r := recover(); r != nil { tx.Rollback() } }() var user req.AdminUser // 1.查询角色 if err := tx.First(&user, adminUser.UserId).Error; err != nil { tx.Rollback() return err } if adminUser.Status == pb.StatusEnum_DELETED { // 1.1删除关联角色 if err := tx.Model(&user).Association("Roles").Clear(); err != nil { tx.Rollback() return err } // 1.2移除关联团队 if err := tx.Model(&user).Association("Teams").Clear(); err != nil { tx.Rollback() return err } } // enum // 2. 更新状态 if err := tx.Model(&req.AdminUser{}).Where("id = ?", adminUser.UserId).Updates(map[string]interface{}{ "status": adminUser.Status, }).Error; err != nil { tx.Rollback() return err } return tx.Commit().Error }