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.
110 lines
3.8 KiB
110 lines
3.8 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) |
|
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) 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 |
|
}
|
|
|