64 lines
1.3 KiB
Go
64 lines
1.3 KiB
Go
package models
|
|
|
|
import (
|
|
"github.com/ccfos/nightingale/v6/pkg/ctx"
|
|
"github.com/toolkits/pkg/slice"
|
|
)
|
|
|
|
type RoleOperation struct {
|
|
RoleName string
|
|
Operation string
|
|
}
|
|
|
|
func (RoleOperation) TableName() string {
|
|
return "role_operation"
|
|
}
|
|
|
|
func RoleHasOperation(ctx *ctx.Context, roles []string, operation string) (bool, error) {
|
|
if len(roles) == 0 {
|
|
return false, nil
|
|
}
|
|
|
|
return Exists(DB(ctx).Model(&RoleOperation{}).Where("operation = ? and role_name in ?", operation, roles))
|
|
}
|
|
|
|
func OperationsOfRole(ctx *ctx.Context, roles []string) ([]string, error) {
|
|
session := DB(ctx).Model(&RoleOperation{}).Select("distinct(operation) as operation")
|
|
|
|
if !slice.ContainsString(roles, AdminRole) {
|
|
session = session.Where("role_name in ?", roles)
|
|
}
|
|
|
|
var ret []string
|
|
err := session.Pluck("operation", &ret).Error
|
|
return ret, err
|
|
}
|
|
|
|
func RoleOperationBind(ctx *ctx.Context, roleName string, operation []string) error {
|
|
tx := DB(ctx).Begin()
|
|
|
|
if err := tx.Where("role_name = ?", roleName).Delete(&RoleOperation{}).Error; err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
|
|
if len(operation) == 0 {
|
|
return tx.Commit().Error
|
|
}
|
|
|
|
var ops []RoleOperation
|
|
for _, op := range operation {
|
|
ops = append(ops, RoleOperation{
|
|
RoleName: roleName,
|
|
Operation: op,
|
|
})
|
|
}
|
|
|
|
if err := tx.Create(&ops).Error; err != nil {
|
|
tx.Rollback()
|
|
return err
|
|
}
|
|
|
|
return tx.Commit().Error
|
|
}
|