guard/internal/logic/roleservice/get_role_logic.go

192 lines
4.8 KiB
Go
Raw Permalink Normal View History

2024-08-19 01:39:05 +00:00
package roleservicelogic
import (
"ark-permission/gen_result/pb/permission"
2024-08-19 16:59:38 +00:00
"ark-permission/internal/domain"
"ark-permission/internal/entity"
"ark-permission/internal/model"
2024-08-19 01:39:05 +00:00
"ark-permission/internal/svc"
2024-08-19 16:59:38 +00:00
ers "code.30cm.net/wanderland/library-go/errors"
"context"
"errors"
2024-08-19 01:39:05 +00:00
"github.com/zeromicro/go-zero/core/logx"
)
type GetRoleLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
logx.Logger
}
func NewGetRoleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetRoleLogic {
return &GetRoleLogic{
ctx: ctx,
svcCtx: svcCtx,
Logger: logx.WithContext(ctx),
}
}
// GetRole 取得搜尋的角色
func (l *GetRoleLogic) GetRole(in *permission.GetRoleReq) (*permission.GetRoleResp, error) {
2024-08-19 16:59:38 +00:00
// 檢查是否為全表搜尋
2024-08-19 01:39:05 +00:00
if in.GetAll() {
2024-08-19 16:59:38 +00:00
return l.getAllRoles()
}
// 處理分頁參數
size := int64(20)
if in.GetPageSize() != 0 {
size = in.GetPageSize()
}
index := int64(1)
if in.GetPageIndex() != 0 {
index = in.GetPageIndex()
}
// 執行角色搜尋和計算總數
roles, count, err := l.searchRolesWithCount(in, size, index)
if err != nil {
return nil, err
}
// 組裝結果
return l.buildRoleResp(roles, in.PageSize, in.PageIndex, count, in.GetPermissions()), nil
}
// getAllRoles 獲取全表角色
func (l *GetRoleLogic) getAllRoles() (*permission.GetRoleResp, error) {
// 查詢所有角色
roles, err := l.svcCtx.RoleRepo.Find(l.ctx)
if err != nil {
return nil, l.handleDBError(err, "failed to get role")
}
// 計算總數
count, err := l.svcCtx.RoleRepo.Count(l.ctx, &model.Role{})
if err != nil {
return nil, l.handleDBError(err, "failed to get role")
}
// 組裝結果
return l.buildRoleResp(roles, -1, -1, count, nil), nil
}
2024-08-19 01:39:05 +00:00
2024-08-19 16:59:38 +00:00
// searchRolesWithCount 搜尋角色並計算總數
func (l *GetRoleLogic) searchRolesWithCount(in *permission.GetRoleReq, size, index int64) ([]*model.Role, int64, error) {
// 搜尋角色
roles, err := l.svcCtx.RoleRepo.SearchRoles(l.ctx, &model.Role{
RoleId: in.GetRoleIds(),
DisplayName: in.GetDisplayName(),
Status: int64(in.GetStatus().Number()),
}, size, index)
if err != nil {
return nil, 0, err
2024-08-19 01:39:05 +00:00
}
2024-08-19 16:59:38 +00:00
// 計算總數
count, err := l.svcCtx.RoleRepo.Count(l.ctx, &model.Role{
RoleId: in.GetRoleIds(),
DisplayName: in.GetDisplayName(),
Status: int64(in.GetStatus().Number()),
})
if err != nil {
return nil, 0, l.handleDBError(err, "failed to get role")
}
list := make([]*model.Role, 0, count)
for _, item := range roles {
list = append(list, &item)
}
return list, count, nil
}
// handleDBError 處理資料庫錯誤
func (l *GetRoleLogic) handleDBError(err error, msg string) error {
if errors.Is(model.ErrNotFound, err) {
return ers.ResourceNotFound(msg)
}
return ers.DBError(err.Error())
}
// buildRoleResp 組裝角色回應
func (l *GetRoleLogic) buildRoleResp(roles []*model.Role, pageSize, pageIndex, totalCount int64, filter []string) *permission.GetRoleResp {
list := make([]*permission.RoleResp, 0, len(roles))
for _, item := range roles {
permissions := make(map[string]string)
// Admin 角色
if item.RoleId == domain.AdminRoleID {
data, err := l.svcCtx.Permission.FindAllOpenPermission(l.ctx)
if err != nil {
// log
continue
}
2024-08-19 01:39:05 +00:00
2024-08-19 16:59:38 +00:00
for _, v := range data {
permissions[v.Name] = string(domain.PermissionStatusOpenCode)
}
} else {
rolePermission, err := l.svcCtx.RolePermissionRepo.FindOneByRoleID(l.ctx, item.RoleId)
if err != nil {
// log
continue
}
var rp = make([]entity.RolePermission, 0, len(rolePermission))
for _, item := range rolePermission {
rp = append(rp, entity.RolePermission{
ID: item.Id,
RoleID: item.RoleId.Int64,
PermissionID: item.PermissionId.Int64,
CreateTime: item.CreateTime,
UpdateTime: item.UpdateTime,
})
}
userRolePermission, err := l.svcCtx.PermissionTree.GetRolePermissionTree(rp)
if err != nil {
return nil
}
if filter == nil {
list = append(list, &permission.RoleResp{
Id: item.Id,
DisplayName: item.DisplayName,
RoleId: item.RoleId,
Status: permission.PermissionStatus(item.Status),
Permissions: permissions,
CreateTime: item.CreateTime,
UpdateTime: item.UpdateTime,
})
} else {
for _, p := range filter {
if userRolePermission[p] == domain.PermissionStatusOpenCode {
list = append(list, &permission.RoleResp{
Id: item.Id,
DisplayName: item.DisplayName,
RoleId: item.RoleId,
Status: permission.PermissionStatus(item.Status),
Permissions: permissions,
CreateTime: item.CreateTime,
UpdateTime: item.UpdateTime,
})
break
}
}
}
}
}
return &permission.GetRoleResp{
List: list,
Page: &permission.PageResponse{
PageSize: pageSize,
PageIndex: pageIndex,
TotalCount: totalCount,
},
}
2024-08-19 01:39:05 +00:00
}