87 lines
2.2 KiB
Go
87 lines
2.2 KiB
Go
package repository
|
|
|
|
import (
|
|
"seeyon-filesystem/config"
|
|
"seeyon-filesystem/model"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// RoleRepository 角色数据访问
|
|
type RoleRepository struct{}
|
|
|
|
func NewRoleRepository() *RoleRepository {
|
|
return &RoleRepository{}
|
|
}
|
|
|
|
// Create 创建角色
|
|
func (r *RoleRepository) Create(role *model.Role) error {
|
|
return config.DB.Create(role).Error
|
|
}
|
|
|
|
// FindByID 根据ID查找角色(含权限)
|
|
func (r *RoleRepository) FindByID(id uint64) (*model.Role, error) {
|
|
var role model.Role
|
|
err := config.DB.Preload("Permissions").First(&role, id).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &role, nil
|
|
}
|
|
|
|
// FindByName 根据标识查找角色
|
|
func (r *RoleRepository) FindByName(name string) (*model.Role, error) {
|
|
var role model.Role
|
|
err := config.DB.Where("name = ?", name).First(&role).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &role, nil
|
|
}
|
|
|
|
// List 查询所有角色
|
|
func (r *RoleRepository) List() ([]model.Role, error) {
|
|
var roles []model.Role
|
|
err := config.DB.Preload("Permissions").Order("id ASC").Find(&roles).Error
|
|
return roles, err
|
|
}
|
|
|
|
// Update 更新角色
|
|
func (r *RoleRepository) Update(role *model.Role) error {
|
|
return config.DB.Save(role).Error
|
|
}
|
|
|
|
// Delete 删除角色(仅非系统角色)
|
|
func (r *RoleRepository) Delete(id uint64) error {
|
|
return config.DB.Transaction(func(tx *gorm.DB) error {
|
|
// 删除角色-权限关联
|
|
if err := tx.Where("role_id = ?", id).Delete(&model.RolePermission{}).Error; err != nil {
|
|
return err
|
|
}
|
|
// 删除用户-角色关联
|
|
if err := tx.Where("role_id = ?", id).Delete(&model.UserRole{}).Error; err != nil {
|
|
return err
|
|
}
|
|
// 删除角色
|
|
return tx.Delete(&model.Role{}, id).Error
|
|
})
|
|
}
|
|
|
|
// SetPermissions 设置角色权限(全量替换)
|
|
func (r *RoleRepository) SetPermissions(roleID uint64, permissionIDs []uint64) error {
|
|
return config.DB.Transaction(func(tx *gorm.DB) error {
|
|
// 先删除旧关联
|
|
if err := tx.Where("role_id = ?", roleID).Delete(&model.RolePermission{}).Error; err != nil {
|
|
return err
|
|
}
|
|
// 插入新关联
|
|
for _, pid := range permissionIDs {
|
|
rp := model.RolePermission{RoleID: roleID, PermissionID: pid}
|
|
if err := tx.Create(&rp).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|