You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
-**SEO Optimization**: Dynamic sitemaps in `src/app/sitemaps/`, Open Graph tags, and schema markup
367
378
-**No test framework**: There are no automated tests — use `bun run play` for backend experimentation
368
379
-**Article soft-delete**: Articles have a `delete_scheduled_at` field. Setting it schedules permanent deletion; `article-cleanup-service.ts` processes them when the **Inngest cron** (`cleanup-expired-articles`, `0 2 * * *` UTC) fires. Use `restoreScheduleDeletedArticle` to cancel.
380
+
-**Inngest functions** (`src/lib/inngest.ts`): Two registered functions — `cleanup-expired-articles` (daily cron) and `persist-notification` (event: `app/notification.requested`). The notification function handles both pre-built payloads and minimal `reaction_request` / `comment_request` shortcuts that it resolves internally. All functions are served via `src/app/api/inngest/route.ts`.
381
+
-**Real-time notifications**: After persisting a notification, Inngest publishes to Pusher on channel `private-user.<recipient_id>` with event `REALTIME_PUSHER_EVENTS.NOTIFICATION_NEW`. Client subscribes via `src/lib/pusher/pusher.client.ts`. Pusher is optional — `pusherServer` is `null` when env vars are missing, so `publishMessage()` no-ops gracefully.
0 commit comments