rbac
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
package rbac
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"portal-mini-go/internal/model/admin"
|
||||
"portal-mini-go/internal/pkg/errors"
|
||||
adminrepo "portal-mini-go/internal/repository/admin"
|
||||
)
|
||||
|
||||
// PermissionService 权限(接口 / 菜单)业务:CRUD。
|
||||
type PermissionService struct {
|
||||
repo PermissionRepository
|
||||
invalidator CacheInvalidator
|
||||
}
|
||||
|
||||
func NewPermissionService(repo PermissionRepository, invalidator CacheInvalidator) *PermissionService {
|
||||
return &PermissionService{repo: repo, invalidator: invalidator}
|
||||
}
|
||||
|
||||
// CreatePermReq 新建权限请求。
|
||||
// Type 取 admin.PermTypeAPI / admin.PermTypeMenu;菜单需指定 ParentID 与 Sort。
|
||||
type CreatePermReq struct {
|
||||
Code string `json:"code" binding:"required"`
|
||||
Name string `json:"name" binding:"required"`
|
||||
Type string `json:"type" binding:"required"`
|
||||
Method string `json:"method"`
|
||||
Path string `json:"path"`
|
||||
ParentID uint64 `json:"parent_id"`
|
||||
Sort int `json:"sort"`
|
||||
}
|
||||
|
||||
// Create 新建权限,code 唯一。
|
||||
func (s *PermissionService) Create(ctx context.Context, req CreatePermReq) (*admin.Permission, error) {
|
||||
if req.Type != admin.PermTypeAPI && req.Type != admin.PermTypeMenu {
|
||||
return nil, errors.New(40000, "非法的权限类型")
|
||||
}
|
||||
p := &admin.Permission{
|
||||
Code: req.Code,
|
||||
Name: req.Name,
|
||||
Type: req.Type,
|
||||
Method: req.Method,
|
||||
Path: req.Path,
|
||||
ParentID: req.ParentID,
|
||||
Sort: req.Sort,
|
||||
}
|
||||
if err := s.repo.Create(ctx, p); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
s.invalidator.InvalidateAll(ctx)
|
||||
return p, nil
|
||||
}
|
||||
|
||||
// PermListReq 权限列表过滤条件。
|
||||
type PermListReq struct {
|
||||
Type string
|
||||
Keyword string
|
||||
Page int
|
||||
Size int
|
||||
}
|
||||
|
||||
// List 分页查询权限,Type 为空表示全部类型。
|
||||
func (s *PermissionService) List(ctx context.Context, req PermListReq) ([]admin.Permission, int64, error) {
|
||||
page, size := req.Page, req.Size
|
||||
if page <= 0 {
|
||||
page = 1
|
||||
}
|
||||
if size <= 0 {
|
||||
size = 20
|
||||
}
|
||||
return s.repo.List(ctx, adminrepo.PermListFilter{
|
||||
Type: req.Type,
|
||||
Keyword: req.Keyword,
|
||||
Page: page,
|
||||
Size: size,
|
||||
})
|
||||
}
|
||||
|
||||
// GetByID 按 ID 查询权限。
|
||||
func (s *PermissionService) GetByID(ctx context.Context, id uint64) (*admin.Permission, error) {
|
||||
return s.repo.GetByID(ctx, id)
|
||||
}
|
||||
|
||||
// UpdatePermReq 编辑权限请求;指针区分“未提供”与“置空”。
|
||||
type UpdatePermReq struct {
|
||||
Name *string `json:"name"`
|
||||
Type *string `json:"type"`
|
||||
Method *string `json:"method"`
|
||||
Path *string `json:"path"`
|
||||
ParentID *uint64 `json:"parent_id"`
|
||||
Sort *int `json:"sort"`
|
||||
}
|
||||
|
||||
// Update 局部更新权限。
|
||||
func (s *PermissionService) Update(ctx context.Context, id uint64, req UpdatePermReq) (*admin.Permission, error) {
|
||||
cols := map[string]interface{}{}
|
||||
if req.Name != nil {
|
||||
cols["name"] = *req.Name
|
||||
}
|
||||
if req.Type != nil {
|
||||
if *req.Type != admin.PermTypeAPI && *req.Type != admin.PermTypeMenu {
|
||||
return nil, errors.New(40000, "非法的权限类型")
|
||||
}
|
||||
cols["type"] = *req.Type
|
||||
}
|
||||
if req.Method != nil {
|
||||
cols["method"] = *req.Method
|
||||
}
|
||||
if req.Path != nil {
|
||||
cols["path"] = *req.Path
|
||||
}
|
||||
if req.ParentID != nil {
|
||||
cols["parent_id"] = *req.ParentID
|
||||
}
|
||||
if req.Sort != nil {
|
||||
cols["sort"] = *req.Sort
|
||||
}
|
||||
if len(cols) == 0 {
|
||||
return s.repo.GetByID(ctx, id)
|
||||
}
|
||||
if err := s.repo.Update(ctx, id, cols); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
s.invalidator.InvalidateAll(ctx)
|
||||
return s.repo.GetByID(ctx, id)
|
||||
}
|
||||
|
||||
// Delete 删除权限(清理关联并失效全部缓存)。
|
||||
func (s *PermissionService) Delete(ctx context.Context, id uint64) error {
|
||||
if err := s.repo.Delete(ctx, id); err != nil {
|
||||
return err
|
||||
}
|
||||
s.invalidator.InvalidateAll(ctx)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user