117 lines
3.7 KiB
Go
117 lines
3.7 KiB
Go
package admin
|
|
|
|
import (
|
|
"context"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"portal-mini-go/internal/model/admin"
|
|
"portal-mini-go/internal/pkg/errors"
|
|
)
|
|
|
|
// PermissionRepository 权限(接口 / 菜单)的数据访问。
|
|
type PermissionRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewPermissionRepository(db *gorm.DB) *PermissionRepository {
|
|
return &PermissionRepository{db: db}
|
|
}
|
|
|
|
// GetByID 按 ID 查询权限,不存在返回 ErrNotFound。
|
|
func (r *PermissionRepository) GetByID(ctx context.Context, id uint64) (*admin.Permission, error) {
|
|
var m admin.Permission
|
|
if err := r.db.WithContext(ctx).Where("id = ?", id).First(&m).Error; err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.ErrNotFound
|
|
}
|
|
return nil, errors.Wrap(50000, "query permission", err)
|
|
}
|
|
return &m, nil
|
|
}
|
|
|
|
// Create 新建权限。
|
|
func (r *PermissionRepository) Create(ctx context.Context, m *admin.Permission) error {
|
|
if err := r.db.WithContext(ctx).Create(m).Error; err != nil {
|
|
return errors.Wrap(50000, "create permission", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// PermListFilter 权限列表过滤条件。Type 为空表示不过滤类型。
|
|
type PermListFilter struct {
|
|
Type string
|
|
Keyword string
|
|
Page int
|
|
Size int
|
|
}
|
|
|
|
// List 分页查询权限,支持类型与关键字(名称 / code / 路径)过滤。
|
|
func (r *PermissionRepository) List(ctx context.Context, f PermListFilter) ([]admin.Permission, int64, error) {
|
|
q := r.db.WithContext(ctx).Model(&admin.Permission{})
|
|
if f.Type != "" {
|
|
q = q.Where("type = ?", f.Type)
|
|
}
|
|
if f.Keyword != "" {
|
|
kw := "%" + f.Keyword + "%"
|
|
q = q.Where("name LIKE ? OR code LIKE ? OR path LIKE ?", kw, kw, kw)
|
|
}
|
|
var total int64
|
|
if err := q.Count(&total).Error; err != nil {
|
|
return nil, 0, errors.Wrap(50000, "count permission", err)
|
|
}
|
|
var list []admin.Permission
|
|
if err := q.Order("sort ASC, id ASC").Offset((f.Page - 1) * f.Size).Limit(f.Size).Find(&list).Error; err != nil {
|
|
return nil, 0, errors.Wrap(50000, "list permission", err)
|
|
}
|
|
return list, total, nil
|
|
}
|
|
|
|
// Update 按 ID 局部更新权限非零值字段。
|
|
func (r *PermissionRepository) Update(ctx context.Context, id uint64, cols map[string]interface{}) error {
|
|
res := r.db.WithContext(ctx).Model(&admin.Permission{}).Where("id = ?", id).Updates(cols)
|
|
if res.Error != nil {
|
|
return errors.Wrap(50000, "update permission", res.Error)
|
|
}
|
|
if res.RowsAffected == 0 {
|
|
return errors.ErrNotFound
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Delete 删除权限,并清理角色-权限关联。
|
|
func (r *PermissionRepository) Delete(ctx context.Context, id uint64) error {
|
|
if err := r.db.WithContext(ctx).Where("permission_id = ?", id).Delete(&admin.RolePermission{}).Error; err != nil {
|
|
return errors.Wrap(50000, "delete role permissions", err)
|
|
}
|
|
res := r.db.WithContext(ctx).Where("id = ?", id).Delete(&admin.Permission{})
|
|
if res.Error != nil {
|
|
return errors.Wrap(50000, "delete permission", res.Error)
|
|
}
|
|
if res.RowsAffected == 0 {
|
|
return errors.ErrNotFound
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// AllMenuPermissions 返回全部菜单类型权限(用于组装菜单树)。
|
|
func (r *PermissionRepository) AllMenuPermissions(ctx context.Context) ([]admin.Permission, error) {
|
|
var list []admin.Permission
|
|
if err := r.db.WithContext(ctx).
|
|
Where("type = ?", admin.PermTypeMenu).
|
|
Order("sort ASC, id ASC").
|
|
Find(&list).Error; err != nil {
|
|
return nil, errors.Wrap(50000, "list menu permissions", err)
|
|
}
|
|
return list, nil
|
|
}
|
|
|
|
// AllCodes 返回全部权限 code(超级管理员短路放行时使用)。
|
|
func (r *PermissionRepository) AllCodes(ctx context.Context) ([]string, error) {
|
|
var codes []string
|
|
if err := r.db.WithContext(ctx).Model(&admin.Permission{}).Pluck("code", &codes).Error; err != nil {
|
|
return nil, errors.Wrap(50000, "list permission codes", err)
|
|
}
|
|
return codes, nil
|
|
}
|