lucianoandClaude Opus 4.7 bb48357179 feat: web push notifications, mobile-ready (PRD §5.6)
ADR 0003: VAPID self-hosted today, DeviceToken model agnostic to
platform so iOS/Android (Expo/APNs/FCM) plug in as new senders later.

Backend (apps/api/src/modules/notifications)
- sender.ts: NotificationSender interface, WebPushSender via VAPID
- notifications.routes.ts: GET /me/notifications/config, POST/DELETE
  /me/device-tokens, PATCH /me/notifications/settings, POST /me/notifications/test
- scheduler.ts: node-cron Mon 09:00 Europe/Rome for weekly weigh-in
  reminder; auto-cleanup of expired tokens on 404/410
- env: VAPID_PUBLIC_KEY/PRIVATE_KEY/SUBJECT (all optional → push gracefully off)

Frontend
- public/sw.js minimal (push + notificationclick)
- lib/notifications/push-client.ts: subscribe / unsubscribe / getCurrentSubscription
- profile/notifications-{actions,panel}.tsx: editorial panel with toggles,
  device list, "send test", per-device removal
- pushReady requires both permission AND active subscription (covers the
  case where the user revoked the SW but kept the browser permission)

Schema
- DeviceToken { userId, platform, endpoint, p256dh, auth, token, userAgent,
  createdAt, lastSeenAt } with unique(userId, endpoint)
- ExtendedPrismaClient type exported from @ketopath/db
- NotificationSettings zod schema in @ketopath/shared

Tooling
- lint-staged: split .js out of eslint glob so service worker is only
  formatted (it lives outside the TS project)

i18n
- Notifications namespace (it) with typed error keys

Smoke tested: POST /me/device-tokens 201, POST /me/notifications/test 200,
real push delivered to a macOS Chrome device.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-29 21:58:35 +02:00
2026-04-29 12:10:08 +02:00
2026-04-29 12:10:08 +02:00
2026-04-29 12:10:08 +02:00
2026-04-29 12:10:08 +02:00
2026-04-29 12:10:08 +02:00
2026-04-29 12:10:08 +02:00

KetoPath

Web app responsive multi-utente per la gestione personalizzata di chetogenica e digiuno intermittente.

Vedi CLAUDE.md per le convenzioni di progetto e docs/PRD_KetoPath.docx per il PRD completo.

Prerequisiti

  • Node.js >=20.11 (vedi .nvmrc)
  • pnpm >=9 (corepack enable && corepack prepare pnpm@latest --activate)

Getting started

pnpm install
pnpm typecheck
pnpm lint
pnpm format:check

Struttura del monorepo

apps/
  web/              # Next.js 14 frontend (da scaffoldare)
  api/              # Fastify backend (da scaffoldare)
packages/
  shared/           # Tipi e utility di dominio
  ui/               # Componenti UI riusabili
  db/               # Prisma client (da scaffoldare)
  tsconfig/         # tsconfig presets condivisi
  eslint-config/    # ESLint config condivisa
docs/
  PRD_KetoPath.docx

Script disponibili

  • pnpm dev — avvia tutte le app in parallelo
  • pnpm dev:web / pnpm dev:api — avvia singola app
  • pnpm build — build di produzione
  • pnpm lint / pnpm lint:fix — ESLint
  • pnpm format / pnpm format:check — Prettier
  • pnpm typecheck — tsc -b su tutto il monorepo
  • pnpm test — Vitest (unit test)
  • pnpm test:e2e — Playwright (E2E)
S
Description
No description provided
Readme
665 KiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 97.3%
CSS 1.7%
JavaScript 1%