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

Organizátori, spoluorganizátori a pozvánky

Organizátori

Organizátorom je akýkoľvek model, ktorý implementuje Contracts\Organizer — používateľ, tím, prevádzkovateľ priestoru. Concerns\OrganizesEvents dodá predvolené hodnoty:

MetódaPredvolené
eventOrganizerName(): stringAtribút name, inak kľúč (JSON-LD, kalendárové súbory, notifikácie).
eventOrganizerUrl(): ?stringnull (organizer.url v JSON-LD).
allowsEventManagementBy(Model $user): boolLen on sám.
scopeManagingEventsFor(Builder $query, Model $user)Len on sám.
eventOrganizerEmail(): ?stringVoliteľné, nie je v kontrakte — ak existuje, kalendárové súbory obsahujú ORGANIZER;CN=…:mailto:….

Pridáva aj organizedEvents(), coHostedEvents() a organizeEvent($title), čo je Events::make($title)->organizedBy($this):

$user->organizedEvents()->upcoming()->get();
$user->coHostedEvents()->with('event')->get();
Event::query()->managedBy($user)->get();       // every event the user manages, drafts included

Tímy ako organizátori

Prepíšte obe metódy správy spolu — členstvo v PHP aj v SQL —, aby sa managedBy() a policy zhodli:

use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Events\Concerns\OrganizesEvents;
use RoundlyConsulting\Events\Contracts\Organizer;

final class Team extends Model implements Organizer
{
    use OrganizesEvents;

    public function allowsEventManagementBy(Model $user): bool
    {
        return $this->members()->whereKey($user->getKey())->exists();
    }

    public function scopeManagingEventsFor(Builder $query, Model $user): void
    {
        $query->whereHas('members', fn (Builder $members) => $members->whereKey($user->getKey()));
    }
}

Potom uveďte každú triedu organizátora v events.organizers. Strana SQL — managedBy() a cez ňu visibleTo(), browse() aj filter[mine]=organizing v API — sa pýta každej uvedenej triedy a aj vlastnej triedy používateľa na scopeManagingEventsFor(). Trieda tímu, ktorá v zozname chýba, v PHP cez policy prejde, no jej členovia nikdy neuvidia jej koncepty a súkromné podujatia v zoznamoch. Verzia pre teams-for-laravel je na stránke Recepty.

Kto podujatie spravuje

Správcami sú schválení používatelia organizátora, schválení používatelia každého spoluorganizátora a držitelia events.authorization.abilities.admin (events.admin; nedefinované znamená nikto; administrátor musí byť Authenticatable). Organizovanie za tím vyžaduje súhlas tímu pre aktéra, inak InvalidOrganizerException.

Spoluorganizátori a prevod

Events::for($event)->by($organizer)->hosts()->add($partnerTeam);   // manageHosts
Events::for($event)->hosts()->remove($partnerTeam);
Events::for($event)->hosts()->all();   // EventHost rows with ->host
Events::for($event)->hosts()->has($partnerTeam);

Events::for($event)->by($organizer)->transferTo($newOrganizer, keepAsHost: true);
  • Spoluorganizátor musí byť Organizer (remove() prijme akýkoľvek model). Spoluorganizátori podujatie spravujú — typy vstupeniek, účastníkov, check-in —, nemôžu však pridávať ani odoberať spoluorganizátorov či podujatie previesť: to patrí organizátorovi (manageHosts, transfer). Spustia sa CoHostAdded a CoHostRemoved; spoluorganizátorov môžete uviesť aj pri vytvorení cez ->coHostedBy().
  • transferTo() podujatie odovzdá a spustí OrganizerTransferred. Nový organizátor musí aktéra povoliť, ak aktér nie je administrátor. Nový organizátor, ktorý bol spoluorganizátorom, ním prestane byť; keepAsHost urobí zo starého organizátora spoluorganizátora. Prevod na súčasného organizátora nič nezmení.
  • Pri events.tags.scope = organizer sa štítky podujatia v tej istej transakcii presunú do katalógu nového organizátora — nájdu sa tam podľa názvu alebo sa vytvoria so všetkými prekladmi.

Pozvánky

$invitation = Events::for($event)->by($organizer)->invitations()->send($user, 'See you there!');   // invite
$invitation->plainToken;   // once — the accept link's token; only its hash is stored

Events::for($event)->invitations()->revoke($user);
Events::for($event)->invitations()->all();      // ->pending(); invite with by($actor)
  • Pri súkromnom podujatí je pozvánka vstupenkou dovnútra; pri verejnom alebo len cez odkaz je to upozornenie typu „pozvi kamaráta“.
  • Opätovné odoslanie vytvorí nový token a starý zanikne — zrušená alebo odmietnutá pozvánka znova čaká na odpoveď, prijatá zostane prijatá. Správa má najviac 1000 znakov.
  • Odkaz vyprší pri aktuálnom začiatku podujatia ($invitation->expiresAt(), čítané z harmonogramu, nikdy uložené): presun termínu ho posunie a kým je podujatie odložené, nevyprší.
  • Pozvánky odoslané, kým je podujatie konceptom, odídu pri jeho zverejnení — každá čakajúca dostane nový token a InvitationSent sa spustí znova; token získaný z plainToken na koncepte vtedy prestane fungovať.
  • Zrušenie pozvánky zmaže token. Pri súkromnom podujatí zároveň pozvanému vezme miesto, ak ešte nemá stav going: RSVP v stave interested, waitlisted alebo held prejde do not_going, miesta sa vrátia a čakacia listina sa posunie.
  • InvitationSent nesie token pre e-mail. Notifikácia invited vo fronte je šifrovaná (ShouldBeEncrypted), takže jobs a failed_jobs ho nikdy neobsahujú v čitateľnej podobe, a kanál database ho nikdy neukladá — vlastné listenery InvitationSent vo fronte šifrujte rovnako.

Odpoveď z odkazu

use RoundlyConsulting\Events\Enums\RsvpResponse;

Events::invitations()->find($token);                              // the live invitation, or null
Events::invitations()->accept($token, RsvpResponse::Going, by: $request->user());   // RSVPs the invitee
Events::invitations()->decline($token, by: $request->user());
Events::invitations()->asSystem()->accept($token);               // trusted PHP: imports, seeders, tests

Token je jednorazové tajomstvo na doručiteľa a účastníkom je vždy pozvaný z pozvánky, nikdy volajúci:

PozvanýKto smie odpovedať
Účet (Authenticatable, napr. váš User)Len tento používateľ, prihlásený: by musí byť pozvaný. Odhlásený alebo prihlásený ako niekto iný je odmietnutý — preposlaný e-mail nemôže odpovedať za neho ani zobraziť jeho kód pre check-in.
Nie účet (model Guest — pozrite Recepty)Ktokoľvek s odkazom: token je prihlasovací údaj.
Ktokoľvek, cez asSystem()Dôveryhodný kód, používateľ nie je potrebný.

Kontrola prebehne skôr, než sa čokoľvek zapíše, takže odmietnutá odpoveď ponechá token použiteľný pre skutočného pozvaného. Odpoveď a zápis pozvánky zdieľajú jednu transakciu a pozvánka sa znova načíta pod svojím zámkom: zrušenie dopadne buď pred ňou (odpoveď sa odmietne), alebo po nej (odpoveď platí) — nikdy medzi. Neznámy, chybný, zrušený, vypršaný či použitý token aj cudzí odkaz vyzerajú rovnako: InvalidInvitationException, jednotné 404. Spustia sa InvitationAccepted, InvitationDeclined a InvitationRevoked.

Účastníci bez účtu

Zúčastniť sa môže akýkoľvek model — uveďte ho v events.attendees s rovnakým typom kľúča, aký majú vaši používatelia. Recepty obsahujú model Guest pre ľudí, ktorých vaša aplikácia pozná len podľa mena a e-mailu.

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.