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

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ávnenieKto
viewAnyKtokoľvek prihlásený (zoznam je obmedzený).
viewAgent, ktorého povoľuje rozsah agentov, žiadateľ, sledujúci (watchers.can_view); ktokoľvek iný dostane 404.
createKtokoľvek prihlásený (self_service), agenti vždy.
updateAgenti; žiadateľ len subject / description (requester_can_edit) a polia, ktoré smie upravovať, kým tiket nie je vyriešený.
delete, restoreOprávnenie manage u agenta, ktorému rozsah agentov povoľuje na tikete pracovať.
manageCategories, manageFields, manageTagsOprávnenie manage.
transitionAgenti; žiadateľ (pri participants_can_transition aj sledujúci) len requester_transitions.
assignAgenti s oprávnením assign; ktorýkoľvek agent pre seba (claim).
unassignAgenti s oprávnením assign, alebo agent, ktorý tiket drží.
replyKtokoľvek, kto smie tiket vidieť, kým nie je uzavretý (409 ticket_closed).
note, viewInternal, tag, linkAgenti.
updateComment, deleteCommentAgenti; ktokoľvek iný len vlastnú verejnú odpoveď.
manageWatchersAgenti; ktokoľvek, kto smie tiket vidieť, pre seba.
mergeOprávnenie merge u agenta, ktorému rozsah agentov povoľuje na tikete pracovať (overuje sa pre oba tikety).
viewTagsAgenti.

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