package repository import ( "context" "fmt" "gofaster/internal/auth/model" "gofaster/internal/shared/repository" "gorm.io/gorm" ) type RoleRepository interface { Create(ctx context.Context, role *model.Role) error Update(ctx context.Context, role *model.Role) error Delete(ctx context.Context, id uint) error GetByID(ctx context.Context, id uint) (*model.Role, error) GetByCode(ctx context.Context, code string) (*model.Role, error) List(ctx context.Context, offset, limit int) ([]*model.Role, int64, error) GetPermissions(ctx context.Context, roleID uint) ([]*model.Permission, error) AssignPermissions(ctx context.Context, roleID uint, permissionIDs []uint) error RemovePermissions(ctx context.Context, roleID uint, permissionIDs []uint) error GetRolesByPermission(ctx context.Context, permissionID uint) ([]*model.Role, error) GetUserRoles(ctx context.Context, userID uint) ([]*model.Role, error) AssignRolesToUser(ctx context.Context, userID uint, roleIDs []uint) error RemoveRolesFromUser(ctx context.Context, userID uint, roleIDs []uint) error GetUsersByRole(ctx context.Context, roleID uint) ([]*model.User, error) } type roleRepository struct { *repository.BaseRepo } func NewRoleRepository(db *gorm.DB) RoleRepository { return &roleRepository{ BaseRepo: repository.NewBaseRepo(db), } } func (r *roleRepository) Create(ctx context.Context, role *model.Role) error { return r.DB().WithContext(ctx).Create(role).Error } func (r *roleRepository) Update(ctx context.Context, role *model.Role) error { return r.DB().WithContext(ctx).Save(role).Error } func (r *roleRepository) Delete(ctx context.Context, id uint) error { return r.DB().WithContext(ctx).Delete(&model.Role{}, id).Error } func (r *roleRepository) GetByID(ctx context.Context, id uint) (*model.Role, error) { var role model.Role err := r.DB().WithContext(ctx).First(&role, id).Error if err != nil { return nil, err } return &role, nil } func (r *roleRepository) GetByCode(ctx context.Context, code string) (*model.Role, error) { var role model.Role err := r.DB().WithContext(ctx).Where("code = ?", code).First(&role).Error if err != nil { return nil, err } return &role, nil } func (r *roleRepository) List(ctx context.Context, offset, limit int) ([]*model.Role, int64, error) { var roles []*model.Role var total int64 // 添加调试日志 fmt.Printf("🔍 [角色查询] 开始查询角色列表,offset=%d, limit=%d\n", offset, limit) err := r.DB().WithContext(ctx).Model(&model.Role{}).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(&roles).Error if err != nil { fmt.Printf("🔍 [角色查询] 查询角色列表失败: %v\n", err) return nil, 0, err } fmt.Printf("🔍 [角色查询] 查询到 %d 条角色记录\n", len(roles)) return roles, total, nil } func (r *roleRepository) GetPermissions(ctx context.Context, roleID uint) ([]*model.Permission, error) { var permissions []*model.Permission err := r.DB().WithContext(ctx). Joins("JOIN role_permissions ON permissions.id = role_permissions.permission_id"). Where("role_permissions.role_id = ?", roleID). Find(&permissions).Error return permissions, err } func (r *roleRepository) AssignPermissions(ctx context.Context, roleID uint, permissionIDs []uint) error { return r.DB().WithContext(ctx).Transaction(func(tx *gorm.DB) error { // 先删除现有的权限关联 if err := tx.Where("role_id = ?", roleID).Delete(&model.RolePermission{}).Error; err != nil { return err } // 添加新的权限关联 for _, permissionID := range permissionIDs { rolePermission := &model.RolePermission{ RoleID: roleID, PermissionID: permissionID, } if err := tx.Create(rolePermission).Error; err != nil { return err } } return nil }) } func (r *roleRepository) RemovePermissions(ctx context.Context, roleID uint, permissionIDs []uint) error { return r.DB().WithContext(ctx).Where("role_id = ? AND permission_id IN ?", roleID, permissionIDs).Delete(&model.RolePermission{}).Error } func (r *roleRepository) GetRolesByPermission(ctx context.Context, permissionID uint) ([]*model.Role, error) { var roles []*model.Role err := r.DB().WithContext(ctx). Joins("JOIN role_permissions ON roles.id = role_permissions.role_id"). Where("role_permissions.permission_id = ?", permissionID). Find(&roles).Error return roles, err } func (r *roleRepository) GetUserRoles(ctx context.Context, userID uint) ([]*model.Role, error) { var roles []*model.Role err := r.DB().WithContext(ctx). Joins("JOIN user_roles ON roles.id = user_roles.role_id"). Where("user_roles.user_id = ?", userID). Find(&roles).Error return roles, err } func (r *roleRepository) AssignRolesToUser(ctx context.Context, userID uint, roleIDs []uint) error { return r.DB().WithContext(ctx).Transaction(func(tx *gorm.DB) error { // 先删除现有的角色关联 if err := tx.Where("user_id = ?", userID).Delete(&model.UserRole{}).Error; err != nil { return err } // 添加新的角色关联 for _, roleID := range roleIDs { userRole := &model.UserRole{ UserID: userID, RoleID: roleID, } if err := tx.Create(userRole).Error; err != nil { return err } } return nil }) } func (r *roleRepository) RemoveRolesFromUser(ctx context.Context, userID uint, roleIDs []uint) error { return r.DB().WithContext(ctx).Where("user_id = ? AND role_id IN ?", userID, roleIDs).Delete(&model.UserRole{}).Error } func (r *roleRepository) GetUsersByRole(ctx context.Context, roleID uint) ([]*model.User, error) { var users []*model.User err := r.DB().WithContext(ctx). Joins("JOIN user_roles ON users.id = user_roles.user_id"). Where("user_roles.role_id = ?", roleID). Find(&users).Error return users, err }