kra/internal/data/system/authority.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
}