Files
2026-07-31 10:31:17 +08:00

94 lines
2.3 KiB
Go

package applogic
import (
"context"
"fmt"
"aijianzhan/platform/internal/authx"
"aijianzhan/platform/internal/rolestore"
"aijianzhan/platform/internal/svc"
"aijianzhan/platform/internal/tenantperm"
"aijianzhan/platform/internal/types"
)
type RoleAdminLogic struct {
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewRoleAdminLogic(ctx context.Context, svcCtx *svc.ServiceContext) *RoleAdminLogic {
return &RoleAdminLogic{ctx: ctx, svcCtx: svcCtx}
}
func (l *RoleAdminLogic) store() (rolestore.Store, error) {
if l.svcCtx.Roles == nil {
return nil, fmt.Errorf("role store unavailable")
}
return l.svcCtx.Roles, nil
}
func (l *RoleAdminLogic) List() ([]rolestore.Role, error) {
st, err := l.store()
if err != nil {
return nil, err
}
tid := authx.TenantID(l.ctx)
_ = st.EnsureDefaults(l.ctx, tid)
return st.List(l.ctx, tid)
}
func (l *RoleAdminLogic) Get(roleID int64) (*rolestore.Role, error) {
st, err := l.store()
if err != nil {
return nil, err
}
return st.Get(l.ctx, authx.TenantID(l.ctx), roleID)
}
func (l *RoleAdminLogic) Create(req *types.RoleCreateReq) (*rolestore.Role, error) {
st, err := l.store()
if err != nil {
return nil, err
}
perms := authx.NormalizePerms(req.Permissions)
if err := tenantperm.MustAllow(l.ctx, l.svcCtx.TenantPerm, authx.TenantID(l.ctx), perms); err != nil {
return nil, err
}
return st.Create(l.ctx, authx.TenantID(l.ctx), rolestore.CreateInput{
Code: req.Code,
Name: req.Name,
Description: req.Description,
Permissions: perms,
})
}
func (l *RoleAdminLogic) Update(roleID int64, req *types.RoleUpdateReq) (*rolestore.Role, error) {
st, err := l.store()
if err != nil {
return nil, err
}
in := rolestore.UpdateInput{}
if req.Name != nil {
in.Name = req.Name
}
if req.Description != nil {
in.Description = req.Description
}
if req.Permissions != nil {
perms := authx.NormalizePerms(*req.Permissions)
if err := tenantperm.MustAllow(l.ctx, l.svcCtx.TenantPerm, authx.TenantID(l.ctx), perms); err != nil {
return nil, err
}
in.Permissions = &perms
}
return st.Update(l.ctx, authx.TenantID(l.ctx), roleID, in)
}
func (l *RoleAdminLogic) Delete(roleID int64) error {
st, err := l.store()
if err != nil {
return err
}
return st.Delete(l.ctx, authx.TenantID(l.ctx), roleID)
}