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 }