Akcie a DTO
Akcie v RoundlyConsulting\Approvals\Actions sú kód, ktorý spúšťa fasáda aj manažér — jednoúčelové triedy s metódou execute(), ktoré skladáte do vlastných akcií, jobov a príkazov. Mapu metód fasády na akcie nájdete v časti DI a akcie.
Signatúry akcií
use RoundlyConsulting\Approvals\Actions\ApproveAction;
use RoundlyConsulting\Approvals\Actions\CancelApprovalAction;
use RoundlyConsulting\Approvals\Actions\ExpireApprovalsAction;
use RoundlyConsulting\Approvals\Actions\RejectAction;
use RoundlyConsulting\Approvals\Actions\RequestApprovalAction;
use RoundlyConsulting\Approvals\Actions\ToggleApprovalAction;
use RoundlyConsulting\Approvals\DataTransferObjects\DecisionData;
app(ApproveAction::class)->execute($user, $post, DecisionData::approved('Looks good'));
app(RejectAction::class)->execute($user, $post, DecisionData::rejected('Needs work'));
app(RequestApprovalAction::class)->execute($user, $post); // pending Approval
app(CancelApprovalAction::class)->execute($user, $post, 'Changed my mind'); // ?Approval
app(ToggleApprovalAction::class)->execute($user, $post); // bool
app(ExpireApprovalsAction::class)->execute(); // int
app(ExpireApprovalsAction::class)->execute(subjectType: Post::class); // int — posts only| Akcia | execute() | Poznámka |
|---|---|---|
ApproveAction | ($actor, $approvable, ?DecisionData, ?ApprovalRequest): Approval | Kontrola cez Gate, menovaní schvaľovatelia, delegovanie, váha a stupeň; nahradí držané zamietnutie; opakovanie nič nezmení; vyhodnotí žiadosť. |
RejectAction | ($actor, $approvable, ?DecisionData, ?ApprovalRequest): Approval | Kontrola cez Gate, menovaní schvaľovatelia, delegovanie, váha a stupeň; nahradí držané schválenie; vyhodnotí žiadosť. |
RequestApprovalAction | ($actor, $approvable, ?DecisionData, ?ApprovalRequest): Approval | Zaznamená čakajúce rozhodnutie — alebo vráti živé rozhodnutie aktéra nezmenené; spustí ApprovalRequested. |
CancelApprovalAction | ($actor, $approvable, ?string $reason, ?ApprovalRequest): ?Approval | Stiahne živé rozhodnutie aktéra alebo to, ktoré urobil ako zástupca. |
ToggleApprovalAction | ($actor, $approvable): bool | Schváli cez ApproveAction, alebo živé schválenie stiahne a mäkko zmaže. |
OpenApprovalRequestAction | (ApprovalRequestData $data): ApprovalRequest | Otvorí jednostupňovú žiadosť a uloží jej menovaných schvaľovateľov; required_approvers je predvolene jeden na schvaľovateľa. |
RequestStagedApprovalAction | ($subject, $stages, $rejectOnStageRejection = true, ?$expiresAt, ?$workflow): ApprovalRequest | Otvorí viacstupňové schvaľovanie; každý stupeň uloží svojich menovaných schvaľovateľov. |
OpenWorkflowRequestAction | ($subject, WorkflowPreset, $approvers): ApprovalRequest | Otvorí žiadosť z načítanej šablóny. |
DelegateApprovalsAction | ($delegator, $delegate, ?$startsAt, ?$endsAt): ApprovalDelegation | Overí a uloží delegovanie; spustí ApprovalDelegated. |
RevokeApprovalDelegationAction | ($delegator, ?$delegate): int | Zruší aktívne aj naplánované delegovania; vráti ich počet. |
ExpireApprovalsAction | (?$now, ?$subjectType): int | Nechá vypršať zmeškané vyžiadania, schválenia a žiadosti — voliteľne len jedného typu subjektu; vráti ich počet. |
Pripojenie ku konkrétnej žiadosti
Akcie schválenia, zamietnutia, vyžiadania a stiahnutia prijímajú žiadosť, ku ktorej sa majú pripojiť, ako štvrtý argument — fasáda ju odovzdá cez within(). Bez neho použijú poslednú otvorenú žiadosť schvaľovaného modelu, prípadne zapíšu samostatné rozhodnutie, ak model nikdy žiadnu nemal. Žiadosť iného subjektu vyhodí InvalidApprovalRequestException a uzavretá žiadosť ClosedApprovalRequestException, a to ešte pred zápisom:
use RoundlyConsulting\Approvals\Actions\ApproveAction;
use RoundlyConsulting\Approvals\DataTransferObjects\DecisionData;
use RoundlyConsulting\Approvals\Facades\Approvals;
$request = Approvals::request($release)->from([$lead, $qa])->open();
// The action's fourth argument is what within($request) passes on the facade.
app(ApproveAction::class)->execute($lead, $release, DecisionData::approved('Ship it'), $request);DecisionData
DecisionData nesie zámer rozhodnutia. Vytvoríte ho pomenovaným konštruktorom:
| Konštruktor | Výsledok |
|---|---|
DecisionData::approved(?$reason, ?$expiresAt, ?$weight) | Schválenie — weight prebije vypočítanú váhu pre toto jedno rozhodnutie. |
DecisionData::rejected(?$reason, ?$weight) | Zamietnutie — weight funguje ako pri approved(). |
DecisionData::pending(?$expiresAt) | Čakajúce rozhodnutie. |
DecisionData::cancelled(?$reason) | Zrušenie. |
Viacstupňová žiadosť s názvom workflow
RequestStagedApprovalAction prijíma expiráciu a názov workflow, ktoré uloží na žiadosť — expiráciu nastavíte aj cez fasádu či trait, názov prijíma len akcia:
use RoundlyConsulting\Approvals\Actions\RequestStagedApprovalAction;
use RoundlyConsulting\Approvals\DataTransferObjects\StageDefinition;
use RoundlyConsulting\Approvals\Enums\ApprovalRule;
app(RequestStagedApprovalAction::class)->execute(
$release,
[
new StageDefinition([$eng1, $eng2], name: 'engineering'),
new StageDefinition([$product], ApprovalRule::Any, name: 'product'),
],
rejectOnStageRejection: true,
expiresAt: now()->addDays(3),
);ApprovalRequestData
ApprovalRequestData je nemenný vstup akcie OpenApprovalRequestAction: subjekt, schvaľovatelia (menovaní schvaľovatelia — ak nikoho nevymenujete, rozhodovať môže ktokoľvek), pravidlo, kvórum, expiresAt a voliteľne requiredApprovers (predvolene jeden na menovaného schvaľovateľa) a názov workflow.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.