You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

120 lines
4.1 KiB

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
}