package repository import ( "context" "with_you/internal/model" "gorm.io/gorm" ) // RoleRepository 角色仓储接口 type RoleRepository interface { // GetUserRoles 获取用户的所有角色 GetUserRoles(ctx context.Context, userID string) ([]string, error) // AddRoleForUser 为用户添加角色 AddRoleForUser(ctx context.Context, userID, role string) error // DeleteRoleForUser 移除用户的角色 DeleteRoleForUser(ctx context.Context, userID, role string) error // DeleteAllRolesForUser 移除用户的所有角色 DeleteAllRolesForUser(ctx context.Context, userID string) error // HasRole 检查用户是否拥有指定角色 HasRole(ctx context.Context, userID, role string) (bool, error) // GetRole 获取角色信息 GetRole(ctx context.Context, name string) (*model.Role, error) // GetAllRoles 获取所有角色 GetAllRoles(ctx context.Context) ([]model.Role, error) // GetRoleUserCount 获取角色对应的用户数量 GetRoleUserCount(ctx context.Context, role string) (int64, error) } type roleRepository struct { db *gorm.DB } func NewRoleRepository(db *gorm.DB) RoleRepository { return &roleRepository{db: db} } func (r *roleRepository) GetUserRoles(ctx context.Context, userID string) ([]string, error) { var userRoles []model.UserRole if err := r.db.WithContext(ctx).Where("user_id = ?", userID).Find(&userRoles).Error; err != nil { return nil, err } roles := make([]string, len(userRoles)) for i, ur := range userRoles { roles[i] = ur.Role } return roles, nil } func (r *roleRepository) AddRoleForUser(ctx context.Context, userID, role string) error { userRole := model.UserRole{ UserID: userID, Role: role, } return r.db.WithContext(ctx).Create(&userRole).Error } func (r *roleRepository) DeleteRoleForUser(ctx context.Context, userID, role string) error { return r.db.WithContext(ctx). Where("user_id = ? AND role = ?", userID, role). Delete(&model.UserRole{}).Error } func (r *roleRepository) DeleteAllRolesForUser(ctx context.Context, userID string) error { return r.db.WithContext(ctx). Where("user_id = ?", userID). Delete(&model.UserRole{}).Error } func (r *roleRepository) HasRole(ctx context.Context, userID, role string) (bool, error) { var count int64 err := r.db.WithContext(ctx). Model(&model.UserRole{}). Where("user_id = ? AND role = ?", userID, role). Count(&count).Error return count > 0, err } func (r *roleRepository) GetRole(ctx context.Context, name string) (*model.Role, error) { var role model.Role err := r.db.WithContext(ctx).Where("name = ?", name).First(&role).Error if err != nil { return nil, err } return &role, nil } func (r *roleRepository) GetAllRoles(ctx context.Context) ([]model.Role, error) { var roles []model.Role err := r.db.WithContext(ctx).Order("priority DESC").Find(&roles).Error return roles, err } func (r *roleRepository) GetRoleUserCount(ctx context.Context, role string) (int64, error) { var count int64 err := r.db.WithContext(ctx). Model(&model.UserRole{}). Where("role = ?", role). Count(&count).Error return count, err }