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

Check-in pri vstupe

Kódy

Prechodom do going dostane každé RSVP kód pre check-in: EV1- a za ním 32 znakov base32 — 160 náhodných bitov z Crypto for Laravel —, uložený šifrovane s indexom SHA-256, vyhľadávaný podľa hashu a nikdy hromadne nedešifrovaný. Odchodom zo stavu going sa zneplatní. Kód je na modeli skrytý a nikdy sa neobjaví v zoznamoch správcov, doménových udalostiach, logoch ani v about.

use RoundlyConsulting\Qr\DataTransferObjects\QrOptions;

$rsvp->checkInCode();                                    // EV1-… — for the attendee's own ticket page
$rsvp->checkInQr(new QrOptions(size: 320, margin: 2));   // an inline SVG, never cached
Events::rsvps()->qr($rsvp);                              // the same image
Events::rsvps()->findByCode($scannerInput);              // the RSVP behind a code, or a URL containing one
Events::rsvps()->by($organizer)->rotateCode($rsvp);      // a new code; the old one stops working

QR je inline SVG z QR for Laravel s citlivosťou Secret, takže sa nikdy neuloží do cache, nech sú voľby akékoľvek; Svg je Htmlable, Responsable aj Stringable (toDataUri() pre značku img). Jeho obsahom je events.check_in.url s {code}, ak je nastavené — fotoaparát telefónu potom otvorí vašu aplikáciu pre vstup —, inak samotný kód. Vstup zo skenera sa oreže a prevedie na veľké písmená a použije sa prvý kód EV1-… v ňom, takže sa prečíta aj obsah s URL či prípona zo skenera. Na kódy pre check-in nikdy nepoužívajte Blade komponent x-qr-code.

{{-- the attendee's ticket page --}}
{{ $rsvp->checkInQr() }}
<p>{{ $rsvp->checkInCode() }}</p>

JSON API poskytne ten istý obrázok jeho vlastníkovi na GET /events/{event}/rsvp/qr.svg s Cache-Control: no-store.

Pri vstupe

$result = Events::for($event)->by($doorStaff)->checkIn($scannedCode, guests: 2);   // scoped to this event
$result->firstCheckIn;    // false on a repeat scan ("already in since 20:04")
$result->checkedInAt;     // CarbonImmutable (UTC) of the first check-in
$result->guests;          // the party's guests checked in so far
$result->method;          // CheckInMethod::Code (CheckInMethod::Manual by hand)
$result->attendee;        // the attendee model
$result->rsvp;            // the RSVP (checked_in_by records the staff member)

$result = Events::checkIn($scannedCode, by: $gateStaff);   // unscoped: a festival gate scanning several events
  • Check-in robia len správcovia (oprávnenie checkIn). Skenovanie bez podujatia nájde podujatie kódu a policy overí tam; kto nie je správca, dostane rovnakú odpoveď ako pri neznámom kóde, takže nič neprezradí.
  • V kontroléri pri vstupe vždy uveďte pracovníka cez by(). Handle bez by() je dôveryhodné PHP a policy preskočí — skopírovaný do kontroléra by dovolil ktorémukoľvek prihlásenému používateľovi urobiť check-in komukoľvek.
  • Skenovanie je idempotentné aj pri súbežnosti: na kód pripadne práve jeden firstCheckIn (aktualizácia porovnaj a nastav). Hostia, ktorí prídu neskôr, zvýšia checked_in_guests pri opakovanom skenovaní.
  • Zápis navyše vyžaduje, aby RSVP bolo stále going a stále malo naskenovaný kód: účastník, ktorý počas skenovania odmietne, je odobratý alebo má vymenený kód, sa odmietne. Po check-ine už účastník odísť nemôže, takže skenovanie a odmietnutie súperiace o jedno RSVP majú práve jedného víťaza.
  • Účastník sa určí skôr, než sa čokoľvek zapíše: soft-deleted účet si ponechá RSVP aj miesto, takže jeho vstupenka prejde; účastník, ktorého riadok už neexistuje, skenovanie odmietne a nič sa nezapíše.
  • Okno sa otvára events.check_in.opens_before (PT3H) pred začiatkom a zatvára events.check_in.closes_after (PT2H) po skončení; ignoreWindow: true ho preskočí.

Odmietnutia

VýnimkacodeHTTPKedy
InvalidCheckInCodeExceptioninvalid_code404Neznámy alebo zneplatnený kód — a pri skenovaní bez podujatia aj niekto, kto nie je správca.
CheckInRefusedExceptioncheck_in_refused409Známy kód, ktorý vstup odmietne; reason() je wrong_event (ktoré podujatie, sa nikdy neprezradí), not_going, event_not_active (koncept, odložené, zrušené alebo zmazané — ukončené podujatie má vstup otvorený, kým sa okno nezavrie) alebo outside_window.
RsvpNotFoundExceptionrsvp_not_found404Riadok účastníka už neexistuje — nič sa nezapíše.
use RoundlyConsulting\Events\Exceptions\CheckInRefusedException;
use RoundlyConsulting\Events\Exceptions\InvalidCheckInCodeException;

try {
    $result = Events::for($event)->by($request->user())->checkIn((string) $request->input('code'));
} catch (InvalidCheckInCodeException) {
    // an unknown or revoked code (404 invalid_code)
} catch (CheckInRefusedException $e) {
    $e->reason();   // wrong_event, not_going, event_not_active or outside_window
}

Ručne

Events::for($event)->by($organizer)->attendees()->checkIn($user, guests: 1);   // ignores the window
Events::for($event)->by($organizer)->attendees()->undoCheckIn($user);
Events::for($event)->by($organizer)->attendees()->checkedIn();                // by check-in time

Spustia sa AttendeeCheckedIn(CheckInResult) a CheckInUndone a RSVP po check-ine zostáva going — odmietnuť ho už nemožno. Obe operácie zamknú riadok RSVP vo vlastnej transakcii, takže medzi čítanie a zápis sa nedostane odmietnutie ani odobratie a dve zrušenia ohlásia jedno CheckInUndone.

Uniknutý kód

Ak unikne snímka obrazovky so vstupenkou, Events::rsvps()->rotateCode($rsvp) okamžite vydá nový kód; starý prestane fungovať aj uprostred skenovania.

Vlastný formát kódu

Pre podpísaný formát overiteľný aj offline naviažte v service provideri Contracts\CheckInCodes — issue(Rsvp $rsvp): string, extract(string $input): ?string a hash(string $code): string. Predvolený Support\RandomCheckInCodes je naviazaný cez bindIf, takže vyhrá ten váš:

// AppServiceProvider::register()
$this->app->bind(\RoundlyConsulting\Events\Contracts\CheckInCodes::class, App\Events\SignedCheckInCodes::class);

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.