247 lines
5.6 KiB
Go
247 lines
5.6 KiB
Go
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
|
|
}
|