NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Reports for Laravel

Moderácia viacerými moderátormi

Predvolene jedno volanie Reports::resolve() alebo reject() hlásenie vybaví. Ak má najprv súhlasiť viac moderátorov, otvorte žiadosť o moderáciu: hlásenie sa stane subjektom approvals-for-laravel a o splnení podmienky rozhodne pravidlo enginu. Najprv publikujte migrácie approvals (pozrite Inštalácia).

Moderátori

Moderátori sú uložené Eloquent modely — zvyčajne váš User s traitom GivesApprovals z balíka approvals, ktorý pridá reláciu givenApprovals(). Bez problémov sa kombinuje s GivesReports:

use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Approvals\Interfaces\GivesApprovalsInterface;
use RoundlyConsulting\Approvals\Traits\GivesApprovals;
use RoundlyConsulting\Reports\Contracts\Reporter;
use RoundlyConsulting\Reports\Traits\GivesReports;

class User extends Model implements GivesApprovalsInterface, Reporter
{
    use GivesApprovals;
    use GivesReports;
}

Otvorenie žiadosti

Otvorte žiadosť o moderáciu a rozhodnutia posielajte cez tie isté resolve() a reject():

use RoundlyConsulting\Approvals\Enums\ApprovalRule;
use RoundlyConsulting\Reports\Facades\Reports;

// Require 2 of the named moderators to agree.
Reports::moderate($report)
    ->requiring([$alice, $bob, $carol])
    ->rule(ApprovalRule::Quorum)
    ->quorum(2)
    ->open();

Reports::resolve($report, by: $alice);             // 1 of 2 — report stays open
Reports::resolve($report, by: $bob, note: 'Spam'); // quorum reached → Resolved
  • requiring([...]) — moderátori, ktorých súhlas je potrebný. Otvorenie bez nich vyhodí MissingModeratorsException.
  • rule(ApprovalRule) — Unanimous, Quorum, Any alebo Weighted; predvolene moderation.default_rule.
  • quorum(int) — počet súhlasov pre Quorum alebo prah váhy pre Weighted; predvolene moderation.default_quorum.
  • open() — otvorí žiadosť a vráti príslušný ApprovalRequest.

Zoznam moderátorov sa uloží k žiadosti, preto open() odmietne žiadosť, ktorú by nikdy nebolo možné uzavrieť — nič sa neotvorí: pri prázdnom zozname MissingModeratorsException, pri moderátorovi, ktorý ešte nie je uložený, alebo pri kvóre vyššom než počet moderátorov (quorum(4) z troch) InvalidApprovalRequestException z enginu approvals.

Ako sa hlásenie vybaví

Keď je podmienka pravidla splnená, listener SyncReportStatusFromApproval hlásenie automaticky aktualizuje: schválená žiadosť ho vyrieši, zamietnutá zamietne a zrušená či expirovaná ho nechá tak. Na hlásenie sa zapíše rozhodujúci moderátor a jeho poznámka a znova sa spustia ReportResolved, ReportRejected a ReportStatusChanged — vaše listenery tak dostanú rovnaké udalosti bez ohľadu na to, či bolo hlásenie vybavené priamo, alebo cez moderáciu. Pri pravidle Unanimous stačí na zamietnutie hlásenia jediné zamietnutie.

Listener rešpektuje strict_transitions: ak sa hlásenie medzitým presunulo do stavu, z ktorého tabuľka prechod nepovoľuje, neurobí nič.

Rozhodujú len určení moderátori

Kým je žiadosť otvorená ($report->isUnderModeration()), resolve() a reject() prijmú moderátora zo zoznamu requiring([...]) alebo jeho zástupcu v approvals (rozhodnutie sa zapíše za moderátora). Ktokoľvek iný dostane ModeratorRequiredException a nič sa nezaznamená — platí to pre cudziu osobu (jej getPrevious() je UnauthorizedApprovalException z enginu approvals), pre volanie bez aktéra aj pre priamy changeStatus() či close() z otvorených stavov:

use RoundlyConsulting\Reports\Exceptions\ModeratorRequiredException;
use RoundlyConsulting\Reports\Facades\Reports;

try {
    Reports::resolve($report, by: $mallory); // not in requiring([...])
} catch (ModeratorRequiredException $e) {
    $e->report; $e->actor;                   // the report, and who was refused (null: no actor)
}

review() funguje naďalej. Po rozhodnutí žiadosti sa hlásenie opäť vybavuje priamo.

Sledovanie priebehu

Report používa trait RequiresApproval z balíka approvals, takže priebeh poslednej žiadosti prečítate priamo z hlásenia:

$progress = $report->approvalProgress();  // ?ApprovalProgress — null before a request is opened

$progress?->approved;      // approvals so far
$progress?->required;      // moderators on the request
$progress?->percentage();  // 0–100

$report->approvalRequests; // every moderation request opened on the report

Vážené pravidlá

Pri ApprovalRule::Weighted je kvórum prahom váhy, nie počtom hlasov. Moderátori deklarujú svoju váhu implementáciou rozhrania ProvidesApprovalWeight z balíka approvals — podrobnosti nájdete v dokumentácii Approvals for Laravel.

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 kryptomien

Odoslaní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.