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

Predvolene vypnuté. Zapnite ho pred štartom aplikácie:

NOTIFICATIONS_ROUTES_ENABLED=on
// config/notifications.php
'routes' => [
    'enabled' => env('NOTIFICATIONS_ROUTES_ENABLED', 'off'),
    'prefix' => 'notifications',
    'middleware' => ['api'],
    'auth_middleware' => ['auth:sanctum'],
],

Každý endpoint pracuje len s $request->user() — parameter príjemcu neexistuje. Bez používateľa, aj pri prázdnom auth_middleware, je odpoveď 401. Vstupy idú cez FormRequesty a rate limity si doplníte sami. Názvy route začínajú na notifications. Ak chcete routes zmeniť, publikujte súbor — kópia potom nahradí súbor balíka:

php artisan vendor:publish --tag="notifications-routes"   # routes/notifications.php replaces the package's file

Routes

Metóda + cestaNázovČo robí
GET /inboxinbox.indexfilter[status]=active|unread|read|archived|all, filter[context], filter[category], filter[type], per_page → stránkovaný InboxItemResource.
GET /inbox/countsinbox.countsInboxCountsResource: unread, total, contexts[{key, label, unread}].
POST /inbox/read-allinbox.read-allTelo context?, category?, type? → {"marked": n}.
POST /inbox/{item}/readinbox.readOznačí ako prečítané → {"data": item}.
DELETE /inbox/{item}/readinbox.unreadOznačí ako neprečítané → {"data": item}.
POST /inbox/{item}/archiveinbox.archiveArchivuje → {"data": item}.
DELETE /inbox/{item}/archiveinbox.unarchiveVráti z archívu → {"data": item}.
POST /inbox/{item}/acknowledgeinbox.acknowledgePotvrdí subjekt a druh položky → {"acknowledged": n}; 404, ak používateľ subjekt už nevidí; {"acknowledged": 0} pre položku bez subjektu.
GET /preferencespreferences.showPreferencesResource: druhy s kanálmi (enabled, default, locked, locked_reason), digest, quiet_hours, timezone.
PATCH /preferencespreferences.updatechannels[<type>][<channel>]=bool, categories[<category>][<channel>]=bool, digest{frequency,time}, quiet_hours{start,end}|null, timezone|null — všetko alebo nič.
GET /typestypes.indexZoznam TypeResource pre obrazovku nastavení: key, category, label, description, channels, mandatory, priority, digestible.
GET    /notifications/inbox?filter[status]=unread&filter[context]=company:3&per_page=20
GET    /notifications/inbox/counts
POST   /notifications/inbox/read-all          {"context": "company:3", "category": "requests"}
POST   /notifications/inbox/12/read
DELETE /notifications/inbox/12/read
POST   /notifications/inbox/12/archive
DELETE /notifications/inbox/12/archive
POST   /notifications/inbox/12/acknowledge
GET    /notifications/preferences
PATCH  /notifications/preferences             {"channels": {"comment.posted": {"mail": false}}, "quiet_hours": {"start": "22:00", "end": "07:00"}}
GET    /notifications/types

{item} sa hľadá v schránke používateľa, nikdy cez globálny route-model binding: id iného používateľa alebo chybné id je 404:

{ "message": "The notification was not found.", "code": "inbox_item_not_found" }

POST /inbox/{item}/acknowledge najprv znova overí prístup: používateľ, ktorý k subjektu stratil prístup — alebo ktorého položka má zmazaný subjekt či nezaregistrovaný druh — dostane rovnakú 404, takže stará položka nikdy neumlčí eskaláciu, na ktorú sa spoliehajú ostatní.

PATCH /preferences

Všetko alebo nič: požiadavka zostaví jeden PreferencesUpdate a zavolá preferences($user)->update(). Prepínače kategórií: false stlmí, true stlmenie zruší; quiet_hours: null a timezone: null ich zrušia:

{
  "channels": { "comment.posted": { "mail": false } },
  "categories": { "contracts": { "mail": false } },
  "digest": { "frequency": "daily", "time": "08:00" },
  "quiet_hours": { "start": "22:00", "end": "07:00" },
  "timezone": "Europe/Bratislava"
}

Každá časť sa overí skôr, než sa čokoľvek zapíše; odmietnutá časť je validačná chyba Laravelu pod svojím poľom a neuloží sa nič:

{ "message": "The notification \"security.alert\" is required and cannot be switched off. (and 1 more error)",
  "errors": { "channels.security.alert.mail": ["The notification \"security.alert\" is required and cannot be switched off."],
              "categories.junk": ["The notification category \"junk\" is not used by any registered type."] } }
PoleOdmietne sa, keď
channels.<type>Nezaregistrovaný druh alebo iný kanál než inbox / mail.
channels.<type>.<channel>Vypnutý povinný druh.
categories.<category>Kategória, ktorú žiadny zaregistrovaný druh nepoužíva, alebo neznámy kanál.
quiet_hours / timezoneZlý čas alebo neznáme časové pásmo; null ich zruší.

Chyby

StavVýznam
401Žiadny prihlásený používateľ — aj pri prázdnom auth_middleware.
404 inbox_item_not_foundPoložka iného používateľa, chybné id alebo potvrdenie, ktoré používateľ už nesmie urobiť.
422Validačné chyby Laravelu; doménové výnimky s preloženou správou a stabilným kódom — mandatory_notification, invalid_quiet_hours, invalid_timezone, unknown_type, unknown_notification_category, invalid_data.

Položka schránky

{
  "id": 12, "type": "request.awaiting_approval", "category": "requests", "title": "…", "body": null,
  "url": "https://app.test/requests/9", "count": 10, "data": {"reference": "PR-9"},
  "actor": {"id": 4, "type": "User"}, "subject": {"id": 9, "type": "PurchaseRequest"},
  "context": {"key": "company:3", "label": "Acme s.r.o.", "id": 3, "type": "Company"},
  "priority": {"value": "normal", "label": "Normal"}, "read_at": null, "archived_at": null,
  "first_event_at": "2026-11-09T10:00:00+00:00", "last_event_at": "2026-11-09T10:04:31+00:00"
}

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.