270 lines
7.5 KiB
Go
270 lines
7.5 KiB
Go
package system
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"kra/internal/biz/system"
|
|
"kra/internal/data/model"
|
|
"kra/internal/data/query"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type authorityRepo struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
// NewAuthorityRepo 创建角色仓储
|
|
func NewAuthorityRepo(db *gorm.DB) system.AuthorityRepo {
|
|
return &authorityRepo{db: db}
|
|
}
|
|
|
|
func (r *authorityRepo) Create(ctx context.Context, auth *system.Authority) error {
|
|
m := &model.SysAuthority{
|
|
AuthorityID: int64(auth.AuthorityId),
|
|
AuthorityName: &auth.AuthorityName,
|
|
DefaultRouter: &auth.DefaultRouter,
|
|
}
|
|
if auth.ParentId != nil {
|
|
parentId := int64(*auth.ParentId)
|
|
m.ParentID = &parentId
|
|
}
|
|
return r.db.WithContext(ctx).Create(m).Error
|
|
}
|
|
|
|
func (r *authorityRepo) Update(ctx context.Context, auth *system.Authority) error {
|
|
updates := map[string]any{
|
|
"authority_name": auth.AuthorityName,
|
|
"default_router": auth.DefaultRouter,
|
|
}
|
|
if auth.ParentId != nil {
|
|
updates["parent_id"] = *auth.ParentId
|
|
}
|
|
return r.db.WithContext(ctx).Model(&model.SysAuthority{}).
|
|
Where("authority_id = ?", auth.AuthorityId).
|
|
Updates(updates).Error
|
|
}
|
|
|
|
func (r *authorityRepo) Delete(ctx context.Context, authorityId uint) error {
|
|
return r.db.WithContext(ctx).Unscoped().
|
|
Where("authority_id = ?", authorityId).
|
|
Delete(&model.SysAuthority{}).Error
|
|
}
|
|
|
|
func (r *authorityRepo) FindByID(ctx context.Context, authorityId uint) (*system.Authority, error) {
|
|
m, err := query.SysAuthority.WithContext(ctx).
|
|
Where(query.SysAuthority.AuthorityID.Eq(int64(authorityId))).First()
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return toBizAuthority(m), nil
|
|
}
|
|
|
|
func (r *authorityRepo) FindByIDWithDataAuthority(ctx context.Context, authorityId uint) (*system.AuthorityFull, error) {
|
|
m, err := query.SysAuthority.WithContext(ctx).
|
|
Where(query.SysAuthority.AuthorityID.Eq(int64(authorityId))).First()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 获取数据权限
|
|
var dataAuthIds []model.SysDataAuthorityID
|
|
r.db.WithContext(ctx).Where("sys_authority_authority_id = ?", authorityId).Find(&dataAuthIds)
|
|
|
|
var dataAuthorities []*system.Authority
|
|
for _, da := range dataAuthIds {
|
|
auth, _ := r.FindByID(ctx, uint(da.DataAuthorityIDAuthorityID))
|
|
if auth != nil {
|
|
dataAuthorities = append(dataAuthorities, auth)
|
|
}
|
|
}
|
|
|
|
return &system.AuthorityFull{
|
|
Authority: *toBizAuthority(m),
|
|
DataAuthorityId: dataAuthorities,
|
|
}, nil
|
|
}
|
|
|
|
func (r *authorityRepo) FindByParentID(ctx context.Context, parentId uint) ([]*system.AuthorityFull, error) {
|
|
list, err := query.SysAuthority.WithContext(ctx).
|
|
Where(query.SysAuthority.ParentID.Eq(int64(parentId))).Find()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
result := make([]*system.AuthorityFull, len(list))
|
|
for i, m := range list {
|
|
// 获取数据权限
|
|
var dataAuthIds []model.SysDataAuthorityID
|
|
r.db.WithContext(ctx).Where("sys_authority_authority_id = ?", m.AuthorityID).Find(&dataAuthIds)
|
|
|
|
var dataAuthorities []*system.Authority
|
|
for _, da := range dataAuthIds {
|
|
auth, _ := r.FindByID(ctx, uint(da.DataAuthorityIDAuthorityID))
|
|
if auth != nil {
|
|
dataAuthorities = append(dataAuthorities, auth)
|
|
}
|
|
}
|
|
|
|
result[i] = &system.AuthorityFull{
|
|
Authority: *toBizAuthority(m),
|
|
DataAuthorityId: dataAuthorities,
|
|
}
|
|
}
|
|
return result, nil
|
|
}
|
|
|
|
func (r *authorityRepo) FindChildren(ctx context.Context, authorityId uint) ([]*system.AuthorityFull, error) {
|
|
return r.FindByParentID(ctx, authorityId)
|
|
}
|
|
|
|
func (r *authorityRepo) HasUsers(ctx context.Context, authorityId uint) (bool, error) {
|
|
var count int64
|
|
err := r.db.WithContext(ctx).Model(&model.SysUserAuthority{}).
|
|
Where("sys_authority_authority_id = ?", authorityId).Count(&count).Error
|
|
return count > 0, err
|
|
}
|
|
|
|
func (r *authorityRepo) HasChildren(ctx context.Context, authorityId uint) (bool, error) {
|
|
count, err := query.SysAuthority.WithContext(ctx).
|
|
Where(query.SysAuthority.ParentID.Eq(int64(authorityId))).Count()
|
|
return count > 0, err
|
|
}
|
|
|
|
func (r *authorityRepo) GetParentAuthorityID(ctx context.Context, authorityId uint) (uint, error) {
|
|
m, err := query.SysAuthority.WithContext(ctx).
|
|
Where(query.SysAuthority.AuthorityID.Eq(int64(authorityId))).First()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if m.ParentID == nil {
|
|
return 0, nil
|
|
}
|
|
return uint(*m.ParentID), nil
|
|
}
|
|
|
|
func (r *authorityRepo) SetDataAuthority(ctx context.Context, authorityId uint, dataAuthorityIds []uint) error {
|
|
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
|
// 删除旧的数据权限
|
|
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
|
Delete(&model.SysDataAuthorityID{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 创建新的数据权限
|
|
for _, daId := range dataAuthorityIds {
|
|
da := &model.SysDataAuthorityID{
|
|
SysAuthorityAuthorityID: int64(authorityId),
|
|
DataAuthorityIDAuthorityID: int64(daId),
|
|
}
|
|
if err := tx.Create(da).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func (r *authorityRepo) SetMenuAuthority(ctx context.Context, authorityId uint, menuIds []uint) error {
|
|
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
|
// 删除旧的菜单权限
|
|
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
|
Delete(&model.SysAuthorityMenu{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 创建新的菜单权限
|
|
for _, menuId := range menuIds {
|
|
am := &model.SysAuthorityMenu{
|
|
SysAuthorityAuthorityID: int64(authorityId),
|
|
SysBaseMenuID: int64(menuId),
|
|
}
|
|
if err := tx.Create(am).Error; err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func (r *authorityRepo) GetMenuIds(ctx context.Context, authorityId uint) ([]uint, error) {
|
|
var menus []model.SysAuthorityMenu
|
|
if err := r.db.WithContext(ctx).Where("sys_authority_authority_id = ?", authorityId).
|
|
Find(&menus).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ids := make([]uint, len(menus))
|
|
for i, m := range menus {
|
|
ids[i] = uint(m.SysBaseMenuID)
|
|
}
|
|
return ids, nil
|
|
}
|
|
|
|
func (r *authorityRepo) CopyAuthorityBtns(ctx context.Context, oldAuthorityId, newAuthorityId uint) error {
|
|
var btns []model.SysAuthorityBtn
|
|
if err := r.db.WithContext(ctx).Where("authority_id = ?", oldAuthorityId).
|
|
Find(&btns).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(btns) == 0 {
|
|
return nil
|
|
}
|
|
|
|
newAuthorityIdInt64 := int64(newAuthorityId)
|
|
for i := range btns {
|
|
btns[i].AuthorityID = &newAuthorityIdInt64
|
|
}
|
|
|
|
return r.db.WithContext(ctx).Create(&btns).Error
|
|
}
|
|
|
|
func (r *authorityRepo) DeleteAuthorityRelations(ctx context.Context, authorityId uint) error {
|
|
return r.db.WithContext(ctx).Transaction(func(tx *gorm.DB) error {
|
|
// 删除菜单权限
|
|
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
|
Delete(&model.SysAuthorityMenu{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 删除数据权限
|
|
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
|
Delete(&model.SysDataAuthorityID{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 删除用户角色关联
|
|
if err := tx.Where("sys_authority_authority_id = ?", authorityId).
|
|
Delete(&model.SysUserAuthority{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
// 删除按钮权限
|
|
if err := tx.Where("authority_id = ?", authorityId).
|
|
Delete(&model.SysAuthorityBtn{}).Error; err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
})
|
|
}
|
|
|
|
// 转换函数
|
|
func toBizAuthority(m *model.SysAuthority) *system.Authority {
|
|
auth := &system.Authority{
|
|
AuthorityId: uint(m.AuthorityID),
|
|
AuthorityName: safeString(m.AuthorityName),
|
|
DefaultRouter: safeString(m.DefaultRouter),
|
|
}
|
|
if m.ParentID != nil {
|
|
parentId := uint(*m.ParentID)
|
|
auth.ParentId = &parentId
|
|
}
|
|
return auth
|
|
}
|