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 }