70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package useCases
|
|
|
|
import (
|
|
"RenewCMS/internal/domain/audit"
|
|
"RenewCMS/internal/domain/contenttype"
|
|
"RenewCMS/internal/domain/role"
|
|
"RenewCMS/internal/domain/user"
|
|
"context"
|
|
)
|
|
|
|
type DeleteRoleUseCase struct {
|
|
roles role.Repository
|
|
users user.Repository
|
|
contentTypes contenttype.Repository
|
|
recorder audit.Recorder
|
|
viewer roleViewer
|
|
}
|
|
|
|
type DeleteRoleCommand struct {
|
|
Caller ContentCaller
|
|
ID uint32
|
|
}
|
|
|
|
func NewDeleteRoleUseCase(roles role.Repository, users user.Repository, contentTypes contenttype.Repository, recorder audit.Recorder) *DeleteRoleUseCase {
|
|
return &DeleteRoleUseCase{roles: roles, users: users, contentTypes: contentTypes, recorder: recorder, viewer: roleViewer{roles, users, contentTypes}}
|
|
}
|
|
|
|
func (u *DeleteRoleUseCase) Delete(ctx context.Context, command DeleteRoleCommand) error {
|
|
target, err := u.roles.Get(command.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := u.check(command.Caller, target); err != nil {
|
|
return err
|
|
}
|
|
|
|
event := audit.NewEvent(audit.ActionRoleDelete, audit.CategoryRoles)
|
|
event.Target = roleTarget(target)
|
|
event.Params[audit.ParamMembers] = 0
|
|
if err := u.roles.Delete(target.ID); err != nil {
|
|
recordRoleWriteFailure(ctx, u.recorder, event, err)
|
|
return err
|
|
}
|
|
u.recorder.Record(ctx, event)
|
|
return nil
|
|
}
|
|
|
|
func (u *DeleteRoleUseCase) check(caller ContentCaller, target role.Role) error {
|
|
if err := ensureEditable(target); err != nil {
|
|
return err
|
|
}
|
|
if err := ensureNotBuiltIn(target); err != nil {
|
|
return err
|
|
}
|
|
if err := ensureNotOwnRole(u.roles, u.users, caller, target); err != nil {
|
|
return err
|
|
}
|
|
if err := ensureCovered(caller, u.contentTypes, target); err != nil {
|
|
return err
|
|
}
|
|
members, err := u.viewer.members(target.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if members > 0 {
|
|
return role.ErrRoleHasMembers
|
|
}
|
|
return nil
|
|
}
|