The Go module name has been changed from `carrot_bbs` to `with_you`, which requires all import paths to be updated throughout the codebase and by external consumers. BREAKING CHANGE: Module name changed from carrot_bbs to with_you. All imports and dependencies must be updated from carrot_bbs/* to with_you/*.
110 lines
3.0 KiB
Go
110 lines
3.0 KiB
Go
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
|
|
}
|