go18/devcloud/mcenter/apps/role/interface.go
2025-06-08 15:11:14 +08:00

266 lines
7.1 KiB
Go

package role
import (
"context"
"slices"
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/endpoint"
"122.51.31.227/go-course/go18/devcloud/mcenter/apps/view"
"github.com/infraboard/mcube/v2/http/request"
"github.com/infraboard/mcube/v2/ioc"
"github.com/infraboard/mcube/v2/ioc/config/validator"
"github.com/infraboard/mcube/v2/types"
"github.com/infraboard/modules/iam/apps"
)
const (
AppName = "role"
)
func GetService() Service {
return ioc.Controller().Get(AppName).(Service)
}
type Service interface {
RoleService
ApiPermissionService
ViewPermissionService
}
// 角色管理
type RoleService interface {
// 创建角色
CreateRole(context.Context, *CreateRoleRequest) (*Role, error)
// 列表查询
QueryRole(context.Context, *QueryRoleRequest) (*types.Set[*Role], error)
// 详情查询
DescribeRole(context.Context, *DescribeRoleRequest) (*Role, error)
// 更新角色
UpdateRole(context.Context, *UpdateRoleRequest) (*Role, error)
// 删除角色
DeleteRole(context.Context, *DeleteRoleRequest) (*Role, error)
}
func NewQueryRoleRequest() *QueryRoleRequest {
return &QueryRoleRequest{
PageRequest: request.NewDefaultPageRequest(),
RoleIds: []uint64{},
}
}
type QueryRoleRequest struct {
*request.PageRequest
WithMenuPermission bool `json:"with_menu_permission" form:"with_menu_permission"`
WithApiPermission bool `json:"with_api_permission" form:"with_api_permission"`
RoleIds []uint64 `json:"role_ids" form:"role_ids"`
}
func (r *QueryRoleRequest) AddRoleId(roleIds ...uint64) *QueryRoleRequest {
for _, rid := range roleIds {
if !slices.Contains(r.RoleIds, rid) {
r.RoleIds = append(r.RoleIds, rid)
}
}
return r
}
func NewDescribeRoleRequest() *DescribeRoleRequest {
return &DescribeRoleRequest{}
}
type DescribeRoleRequest struct {
apps.GetRequest
}
type UpdateRoleRequest struct {
apps.GetRequest
CreateRoleRequest
}
func NewDeleteRoleRequest() *DeleteRoleRequest {
return &DeleteRoleRequest{}
}
type DeleteRoleRequest struct {
apps.GetRequest
}
// 角色API接口管理
type ApiPermissionService interface {
// 查询角色关联的权限条目
QueryApiPermission(context.Context, *QueryApiPermissionRequest) ([]*ApiPermission, error)
// 添加角色关联API
AddApiPermission(context.Context, *AddApiPermissionRequest) ([]*ApiPermission, error)
// 移除角色关联API
RemoveApiPermission(context.Context, *RemoveApiPermissionRequest) ([]*ApiPermission, error)
// 查询匹配到的Api接口列表
QueryMatchedEndpoint(context.Context, *QueryMatchedEndpointRequest) (*types.Set[*endpoint.Endpoint], error)
}
func NewQueryApiPermissionRequest() *QueryApiPermissionRequest {
return &QueryApiPermissionRequest{
RoleIds: []uint64{},
ApiPermissionIds: []uint64{},
}
}
type QueryApiPermissionRequest struct {
RoleIds []uint64 `json:"role_ids"`
ApiPermissionIds []uint64 `json:"api_permission_ids"`
}
func (r *QueryApiPermissionRequest) AddRoleId(roleIds ...uint64) *QueryApiPermissionRequest {
r.RoleIds = append(r.RoleIds, roleIds...)
return r
}
func (r *QueryApiPermissionRequest) AddPermissionId(permissionIds ...uint64) *QueryApiPermissionRequest {
r.ApiPermissionIds = append(r.ApiPermissionIds, permissionIds...)
return r
}
func NewQueryMatchedEndpointRequest() *QueryMatchedEndpointRequest {
return &QueryMatchedEndpointRequest{
RoleIds: []uint64{},
}
}
type QueryMatchedEndpointRequest struct {
RoleIds []uint64 `json:"role_ids" form:"role_ids"`
}
func (r *QueryMatchedEndpointRequest) Add(roleIds ...uint64) *QueryMatchedEndpointRequest {
for _, rid := range roleIds {
if !slices.Contains(r.RoleIds, rid) {
r.RoleIds = append(r.RoleIds, rid)
}
}
return r
}
func NewAddApiPermissionRequest(roleId uint64) *AddApiPermissionRequest {
return &AddApiPermissionRequest{
RoleId: roleId,
}
}
type AddApiPermissionRequest struct {
RoleId uint64 `json:"role_id"`
Items []*ApiPermissionSpec `json:"items"`
}
func (r *AddApiPermissionRequest) Validate() error {
return validator.Validate(r)
}
func (r *AddApiPermissionRequest) Add(specs ...*ApiPermissionSpec) *AddApiPermissionRequest {
r.Items = append(r.Items, specs...)
return r
}
func NewRemoveApiPermissionRequest(roleId uint64) *RemoveApiPermissionRequest {
return &RemoveApiPermissionRequest{
RoleId: roleId,
ApiPermissionIds: []uint64{},
}
}
type RemoveApiPermissionRequest struct {
RoleId uint64 `json:"role_id"`
ApiPermissionIds []uint64 `json:"api_permission_ids"`
}
func (r *RemoveApiPermissionRequest) Add(apiPermissionIds ...uint64) *RemoveApiPermissionRequest {
r.ApiPermissionIds = append(r.ApiPermissionIds, apiPermissionIds...)
return r
}
func (r *RemoveApiPermissionRequest) Validate() error {
return validator.Validate(r)
}
type UpdateApiPermissionRequest struct {
Items []*ApiPermission `json:"items"`
}
// 角色菜单管理
type ViewPermissionService interface {
// 查询角色关联的视图权限
QueryViewPermission(context.Context, *QueryViewPermissionRequest) ([]*ViewPermission, error)
// 添加角色关联菜单
AddViewPermission(context.Context, *AddViewPermissionRequest) ([]*ViewPermission, error)
// 移除角色关联菜单
RemoveViewPermission(context.Context, *RemoveViewPermissionRequest) ([]*ViewPermission, error)
// 查询能匹配到视图菜单
QueryMatchedPage(context.Context, *QueryMatchedPageRequest) (*types.Set[*view.Menu], error)
}
func NewQueryViewPermissionRequest() *QueryViewPermissionRequest {
return &QueryViewPermissionRequest{
RoleIds: []uint64{},
ViewPermissionIds: []uint64{},
}
}
type QueryViewPermissionRequest struct {
RoleIds []uint64 `json:"role_ids"`
ViewPermissionIds []uint64 `json:"view_permission_ids"`
}
func (r *QueryViewPermissionRequest) AddRoleId(roleIds ...uint64) *QueryViewPermissionRequest {
r.RoleIds = append(r.RoleIds, roleIds...)
return r
}
func (r *QueryViewPermissionRequest) AddPermissionId(permissionIds ...uint64) *QueryViewPermissionRequest {
r.ViewPermissionIds = append(r.ViewPermissionIds, permissionIds...)
return r
}
func NewQueryMatchedPageRequest() *QueryMatchedPageRequest {
return &QueryMatchedPageRequest{}
}
type QueryMatchedPageRequest struct {
apps.GetRequest
}
func NewAddViewPermissionRequest() *AddViewPermissionRequest {
return &AddViewPermissionRequest{
Items: []*ViewPermissionSpec{},
}
}
type AddViewPermissionRequest struct {
RoleId uint64 `json:"role_id"`
Items []*ViewPermissionSpec `json:"items"`
}
func (r *AddViewPermissionRequest) Validate() error {
return validator.Validate(r)
}
func (r *AddViewPermissionRequest) Add(specs ...*ViewPermissionSpec) *AddViewPermissionRequest {
r.Items = append(r.Items, specs...)
return r
}
type UpdateViewPermission struct {
Items []ViewPermission `json:"items"`
}
func NewRemoveViewPermissionRequest() *RemoveViewPermissionRequest {
return &RemoveViewPermissionRequest{
ViewPermissionIds: []uint64{},
}
}
type RemoveViewPermissionRequest struct {
RoleId uint64 `json:"role_id"`
ViewPermissionIds []uint64 `json:"menu_permission_ids"`
}
func (r *RemoveViewPermissionRequest) Validate() error {
return validator.Validate(r)
}