package role import ( "busniess-user-center/config" roleModel "busniess-user-center/internal/models/role" userModel "busniess-user-center/internal/models/user" "busniess-user-center/internal/repo" "busniess-user-center/internal/service/user" contextUtil "busniess-user-center/pkg/utils/context" "busniess-user-center/pkg/utils/session" "context" "fmt" "github.com/jinzhu/copier" "github.com/samber/do" "go.uber.org/zap" "gorm.io/gorm" ) func init() { do.Provide(nil, NewRoleService) } const ( superAdmin = "super_admin" admin = "admin" develop = "develop" ) type roleService struct { logger *zap.SugaredLogger roleRepo repo.RoleRepo conf *config.AppConfig userService user.UserService } func NewRoleService(i *do.Injector) (RoleService, error) { return &roleService{ logger: do.MustInvoke[*zap.SugaredLogger](i), roleRepo: do.MustInvoke[repo.RoleRepo](i), conf: do.MustInvoke[*config.AppConfig](i), userService: do.MustInvoke[user.UserService](i), }, nil } func (o *roleService) Create(ctx context.Context, info *roleModel.CreateReq) error { dbRole := repo.Role{ Code: info.Code, Name: info.Name, } exist, err := o.roleRepo.ExistCode(ctx, info.Code) if err != nil { return err } if exist { return fmt.Errorf("角色code:%s已经存在", info.Code) } return o.roleRepo.Create(ctx, dbRole) } func (o *roleService) Save(ctx context.Context, info *roleModel.SaveReq) error { dbRole, err := o.roleRepo.GetById(ctx, info.Id) if err != nil && err != gorm.ErrRecordNotFound { return err } if err == gorm.ErrRecordNotFound { return fmt.Errorf("角色:%s不存在", info.Code) } dbRole.Name = info.Name return o.roleRepo.Save(ctx, dbRole) } func (o *roleService) Delete(ctx context.Context, info *roleModel.DelReq) error { return o.roleRepo.DelById(ctx, info.Id) } func (o *roleService) Role(ctx context.Context, info *roleModel.GetReq) (role roleModel.Role, err error) { dbRole, err := o.roleRepo.GetById(ctx, info.Id) if err != nil { return } err = copier.Copy(&role, dbRole) return } func (o *roleService) Search(ctx context.Context, info *roleModel.Query) ([]roleModel.Role, error) { dbQuery := repo.Query{} copier.Copy(&dbQuery, info) dbRoles, err := o.roleRepo.Search(ctx, dbQuery) if err != nil { return nil, err } roles := make([]roleModel.Role, 0, len(dbRoles)) for _, role := range dbRoles { roles = append(roles, convertDTM(role)) } return roles, nil } func (o *roleService) AddUsers(ctx context.Context, info *roleModel.AddUsersReq) error { role, err := o.roleRepo.GetById(ctx, info.RoleId) if err != nil && err != gorm.ErrRecordNotFound { return err } if err == gorm.ErrRecordNotFound { return fmt.Errorf("角色%d不存在", info.RoleId) } // 判断权限 session, err := contextUtil.GetSession(ctx) if err != nil { return err } perssion, err := o.hasPerssion(ctx, session) if err != nil { return err } if !perssion { return fmt.Errorf("没有权限") } // 获取用户 users, err := o.userService.BatchGetUserByIDs(ctx, info.Ids) if err != nil { return err } uRoles := make([]repo.UserRole, 0, len(users)) for _, item := range users { uRoles = append(uRoles, repo.UserRole{ UserAccount: item.Account, RoleCode: role.Code, CreatedBy: session.Account, }) } if len(uRoles) > 0 { err = o.roleRepo.CreateUserRole(ctx, uRoles) } return err } func (o *roleService) RemoveUsers(ctx context.Context, info *roleModel.RemoveUsersReq) error { role, err := o.roleRepo.GetById(ctx, info.RoleId) if err != nil && err != gorm.ErrRecordNotFound { return err } if err == gorm.ErrRecordNotFound { return fmt.Errorf("角色%d不存在", info.RoleId) } // 判断权限 session, err := contextUtil.GetSession(ctx) if err != nil { return err } perssion, err := o.hasPerssion(ctx, session) if err != nil { return err } if !perssion { return fmt.Errorf("没有权限") } users, err := o.userService.BatchGetUserByIDs(ctx, info.Ids) if err != nil { return err } uRoles := make([]repo.UserRole, 0, len(users)) for _, item := range users { uRoles = append(uRoles, repo.UserRole{ UserAccount: item.Account, RoleCode: role.Code, CreatedBy: session.Account, }) } if len(uRoles) > 0 { err = o.roleRepo.RemoveUserRole(ctx, uRoles) } return nil } func (u *roleService) AddOrgs(ctx context.Context, info *roleModel.AddOrgsReq) error { return nil } func (u *roleService) RemoveOrgs(ctx context.Context, info *roleModel.RemoveOrgsReq) error { return nil } func (u *roleService) RoleUsers(ctx context.Context, info *roleModel.RoleUsersReq) ([]userModel.User, error) { return nil, nil } func (u *roleService) RoleOrgs(ctx context.Context, info *roleModel.RoleOrgsReq) ([]roleModel.OrgRoleAuthor, error) { return nil, nil } func (u *roleService) AuthorRoleMenu(ctx context.Context, info *roleModel.AuthorRoleMenuReq) error { return nil } func (u *roleService) RemoveRoleMenu(ctx context.Context, info *roleModel.RemoveReleMenuReq) error { return nil } func (u *roleService) RoleMenuAuthorList(ctx context.Context, info *roleModel.AddOrgsReq) ([]roleModel.RoleMenu, error) { return nil, nil } func (u *roleService) hasPerssion(ctx context.Context, session *session.Session) (bool, error) { user, err := u.userService.GetUser(ctx, &userModel.GetUserReq{Account: session.Account, AppCode: session.AppCode}) if err != nil { return false, err } if len(user.Roles) > 0 { for _, item := range user.Roles { if item.Code == superAdmin || item.Code == develop || item.Code == admin { return true, nil } } } return false, nil }