Policy a rozsah agentov
Policies\TicketPolicy je autoritou API — PHP API sa jej nikdy nepýta. Registruje sa pre nakonfigurovaný model tiketu (tickets.authorization.register_policy) a dá sa vymeniť podtriedou cez tickets.authorization.policy. Jej oprávnenia stoja na Gate oprávneniach, ktoré definujete (tickets.agent, tickets.assign, tickets.manage; merge je predvolene tickets.agent); nedefinované zamieta:
| Oprávnenie | Kto |
|---|---|
viewAny | Ktokoľvek prihlásený (zoznam je obmedzený). |
view | Agent, ktorého povoľuje rozsah agentov, žiadateľ, sledujúci (watchers.can_view); ktokoľvek iný dostane 404. |
create | Ktokoľvek prihlásený (self_service), agenti vždy. |
update | Agenti; žiadateľ len subject / description (requester_can_edit) a polia, ktoré smie upravovať, kým tiket nie je vyriešený. |
delete, restore | Oprávnenie manage u agenta, ktorému rozsah agentov povoľuje na tikete pracovať. |
manageCategories, manageFields, manageTags | Oprávnenie manage. |
transition | Agenti; žiadateľ (pri participants_can_transition aj sledujúci) len requester_transitions. |
assign | Agenti s oprávnením assign; ktorýkoľvek agent pre seba (claim). |
unassign | Agenti s oprávnením assign, alebo agent, ktorý tiket drží. |
reply | Ktokoľvek, kto smie tiket vidieť, kým nie je uzavretý (409 ticket_closed). |
note, viewInternal, tag, link | Agenti. |
updateComment, deleteComment | Agenti; ktokoľvek iný len vlastnú verejnú odpoveď. |
manageWatchers | Agenti; ktokoľvek, kto smie tiket vidieť, pre seba. |
merge | Oprávnenie merge u agenta, ktorému rozsah agentov povoľuje na tikete pracovať (overuje sa pre oba tikety). |
viewTags | Agenti. |
Keď sa update pýta bez atribútov (@can('update', $ticket)), odpovie, či používateľ smie upraviť čokoľvek: predmet a popis, alebo aktívne pole zo sady polí tiketu, ktoré smie žiadateľ upravovať.
Manažéri sú agenti s rozsahom. Mazanie či obnovenie tiketu vyžaduje tickets.manage a zároveň byť agentom pre daný tiket (tickets.agent v rámci AgentScope); manažér bez tickets.agent alebo mimo rozsahu dostane rovnaké 404 ako pri skrytom tikete. Ľuďom, ktorí tikety spravujú, udeľte obe oprávnenia.
Vypnuté register_policy neznamená zamietnuť všetko: vyhľadávanie policy v Laraveli podľa názvu priradí RoundlyConsulting\Tickets\Models\Ticket k RoundlyConsulting\Tickets\Policies\TicketPolicy a policy z balíka nájde aj tak. Vlastnú zaregistrujte cez Gate::policy(Ticket::class, MyTicketPolicy::class), alebo jednoducho uveďte podtriedu v tickets.authorization.policy. Neplatná policy nezaregistruje nič a tickets:doctor to nahlási.
Rozsah agentov
Predvolene každý agent pracuje na každom tikete. Zúžiť to môžete cez Contracts\AgentScope:
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Tickets\Contracts\AgentScope;
use RoundlyConsulting\Tickets\Models\Ticket;
final readonly class ProjectMembersOnly implements AgentScope
{
public function allows(Model $agent, Ticket $ticket): bool
{
return $ticket->project_id === null
|| $agent->projects()->whereKey($ticket->project_id)->exists();
}
public function constrain(Builder $query, Model $agent): void
{
// where clauses only — they are grouped and OR-ed with the requester and watcher branches
$query->where(fn (Builder $q) => $q
->whereNull('project_id')
->orWhereIn('project_id', $agent->projects()->select('projects.id')));
}
}// config/tickets.php
'authorization' => ['agent_scope' => App\Tickets\ProjectMembersOnly::class, /* … */],allows() rozhoduje o jednom tikete; constrain() zužuje zoznam (visibleTo, index). Musia sa zhodovať — otestujte to tak, ako balík testuje vlastnú implementáciu. constrain() beží aj vnútri poddopytu na kľúče pre filtre a radenie len pre agentov, preto v ňom používajte len podmienky where na tabuľke tiketov.
Rozsah je autoritou pre otázku agenta pre tento tiket všade — v API aj v PHP API: v policy a resources, notifikáciách a zmienkach, vhodnosti riešiteľa, role autora správy, interných poznámkach, poliach len pre agentov, filtroch indexu len pre agentov a radení podľa last_activity_at, pri zlučovaní (oba tikety), druhom konci prepojenia (len číslo tiketu) aj pri mazaní a obnovovaní. Agent mimo rozsahu stále vidí tiket, ktorý založil alebo sleduje — ako žiadateľ či účastník.
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.