|
|
|
package repository
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"fmt"
|
|
|
|
"gofaster/internal/auth/model"
|
|
|
|
"gofaster/internal/shared/repository"
|
|
|
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
)
|
|
|
|
|
|
|
|
type PermissionRepository interface {
|
|
|
|
Create(ctx context.Context, permission *model.Permission) error
|
|
|
|
Update(ctx context.Context, permission *model.Permission) error
|
|
|
|
Delete(ctx context.Context, id uint) error
|
|
|
|
GetByID(ctx context.Context, id uint) (*model.Permission, error)
|
|
|
|
GetByName(ctx context.Context, name string) (*model.Permission, error)
|
|
|
|
GetByCode(ctx context.Context, code string) (*model.Permission, error)
|
|
|
|
List(ctx context.Context, offset, limit int) ([]*model.Permission, int64, error)
|
|
|
|
GetByResource(ctx context.Context, resource string) ([]*model.Permission, error)
|
|
|
|
GetByUserID(ctx context.Context, userID uint) ([]*model.Permission, error)
|
|
|
|
BatchCreate(ctx context.Context, permissions []*model.Permission) error
|
|
|
|
}
|
|
|
|
|
|
|
|
type permissionRepository struct {
|
|
|
|
*repository.BaseRepo
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewPermissionRepository(db *gorm.DB) PermissionRepository {
|
|
|
|
return &permissionRepository{
|
|
|
|
BaseRepo: repository.NewBaseRepo(db),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) Create(ctx context.Context, permission *model.Permission) error {
|
|
|
|
return r.DB().WithContext(ctx).Create(permission).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) Update(ctx context.Context, permission *model.Permission) error {
|
|
|
|
return r.DB().WithContext(ctx).Save(permission).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) Delete(ctx context.Context, id uint) error {
|
|
|
|
return r.DB().WithContext(ctx).Delete(&model.Permission{}, id).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) GetByID(ctx context.Context, id uint) (*model.Permission, error) {
|
|
|
|
var permission model.Permission
|
|
|
|
err := r.DB().WithContext(ctx).First(&permission, id).Error
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &permission, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) GetByName(ctx context.Context, name string) (*model.Permission, error) {
|
|
|
|
var permission model.Permission
|
|
|
|
err := r.DB().WithContext(ctx).Where("name = ?", name).First(&permission).Error
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &permission, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) GetByCode(ctx context.Context, code string) (*model.Permission, error) {
|
|
|
|
var permission model.Permission
|
|
|
|
err := r.DB().WithContext(ctx).Where("code = ?", code).First(&permission).Error
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
return &permission, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) List(ctx context.Context, offset, limit int) ([]*model.Permission, int64, error) {
|
|
|
|
var permissions []*model.Permission
|
|
|
|
var total int64
|
|
|
|
|
|
|
|
// 添加调试日志
|
|
|
|
fmt.Printf("🔍 [权限查询] 开始查询权限列表,offset=%d, limit=%d\n", offset, limit)
|
|
|
|
|
|
|
|
err := r.DB().WithContext(ctx).Model(&model.Permission{}).Count(&total).Error
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("🔍 [权限查询] 统计总数失败: %v\n", err)
|
|
|
|
return nil, 0, err
|
|
|
|
}
|
|
|
|
fmt.Printf("🔍 [权限查询] 数据库中共有 %d 条权限记录\n", total)
|
|
|
|
|
|
|
|
err = r.DB().WithContext(ctx).Offset(offset).Limit(limit).Order("id ASC").Find(&permissions).Error
|
|
|
|
if err != nil {
|
|
|
|
fmt.Printf("🔍 [权限查询] 查询权限列表失败: %v\n", err)
|
|
|
|
return nil, 0, err
|
|
|
|
}
|
|
|
|
fmt.Printf("🔍 [权限查询] 查询到 %d 条权限记录\n", len(permissions))
|
|
|
|
|
|
|
|
return permissions, total, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) GetByResource(ctx context.Context, resource string) ([]*model.Permission, error) {
|
|
|
|
var permissions []*model.Permission
|
|
|
|
err := r.DB().WithContext(ctx).Where("resource = ?", resource).Order("id ASC").Find(&permissions).Error
|
|
|
|
return permissions, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) GetByUserID(ctx context.Context, userID uint) ([]*model.Permission, error) {
|
|
|
|
var permissions []*model.Permission
|
|
|
|
|
|
|
|
// 通过用户角色关联查询权限
|
|
|
|
err := r.DB().WithContext(ctx).
|
|
|
|
Joins("JOIN role_permissions ON permissions.id = role_permissions.permission_id").
|
|
|
|
Joins("JOIN user_roles ON role_permissions.role_id = user_roles.role_id").
|
|
|
|
Where("user_roles.user_id = ?", userID).
|
|
|
|
Distinct().
|
|
|
|
Find(&permissions).Error
|
|
|
|
|
|
|
|
return permissions, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *permissionRepository) BatchCreate(ctx context.Context, permissions []*model.Permission) error {
|
|
|
|
return r.DB().WithContext(ctx).CreateInBatches(permissions, 100).Error
|
|
|
|
}
|