nightingale/models/role_operation.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
}