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 fileRoutes
| Metóda + cesta | Názov | Čo robí |
|---|---|---|
GET /inbox | inbox.index | filter[status]=active|unread|read|archived|all, filter[context], filter[category], filter[type], per_page → stránkovaný InboxItemResource. |
GET /inbox/counts | inbox.counts | InboxCountsResource: unread, total, contexts[{key, label, unread}]. |
POST /inbox/read-all | inbox.read-all | Telo context?, category?, type? → {"marked": n}. |
POST /inbox/{item}/read | inbox.read | Označí ako prečítané → {"data": item}. |
DELETE /inbox/{item}/read | inbox.unread | Označí ako neprečítané → {"data": item}. |
POST /inbox/{item}/archive | inbox.archive | Archivuje → {"data": item}. |
DELETE /inbox/{item}/archive | inbox.unarchive | Vráti z archívu → {"data": item}. |
POST /inbox/{item}/acknowledge | inbox.acknowledge | Potvrdí subjekt a druh položky → {"acknowledged": n}; 404, ak používateľ subjekt už nevidí; {"acknowledged": 0} pre položku bez subjektu. |
GET /preferences | preferences.show | PreferencesResource: druhy s kanálmi (enabled, default, locked, locked_reason), digest, quiet_hours, timezone. |
PATCH /preferences | preferences.update | channels[<type>][<channel>]=bool, categories[<category>][<channel>]=bool, digest{frequency,time}, quiet_hours{start,end}|null, timezone|null — všetko alebo nič. |
GET /types | types.index | Zoznam 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."] } }| Pole | Odmietne 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 / timezone | Zlý čas alebo neznáme časové pásmo; null ich zruší. |
Chyby
| Stav | Význam |
|---|---|
| 401 | Žiadny prihlásený používateľ — aj pri prázdnom auth_middleware. |
| 404 inbox_item_not_found | Položka iného používateľa, chybné id alebo potvrdenie, ktoré používateľ už nesmie urobiť. |
| 422 | Validač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 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.