904849178d
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
6.7 KiB
6.7 KiB
Phase 2: Admin Area & Interactive Features - Context
Gathered: 2026-05-15 Status: Ready for planning
## Phase BoundaryCostruire l'area admin autenticata e le funzionalità interattive cliente. Al termine di questa fase:
- L'admin accede a
/admincon credenziale sicura e gestisce tutti i dati - Il cliente può approvare deliverable e lasciare commenti dalla sua dashboard L'area admin non è mai accessibile al cliente — path separato con sessione Auth.js. Service catalog e quote builder sono Phase 3. Claude AI è Phase 4.
Autenticazione Admin
- D-01: Auth.js v4 (
next-auth@4) — versione stabile. La v5 è ancora in beta RC al 2026-05-15. Installarenext-auth@4+@auth/drizzle-adapternon è necessario (singolo admin hardcoded, no DB table per utenti). - D-02: Credenziali admin via env vars — Singolo admin:
ADMIN_EMAIL+ADMIN_PASSWORDin.env.local. No tabellausersin DB. CredentialsProvider di Auth.js valida contro le env vars, restituisce session con{ id: "admin", email: ADMIN_EMAIL }. - D-03: Sessione JWT — Nessuna tabella session nel DB. JWT stateless firmato, scadenza 30 giorni. Non serve adapter.
- D-04: Protezione route admin —
src/proxy.tsgià gestisce/c/[token]. Aggiungere matcher/admin/:path*→ redirect a/admin/loginse no session. Il check sessione avviene nel middleware (getToken da next-auth/jwt) — nessun DB call per ogni request.
Mutation Pattern
- D-05: Server Actions — Next.js 15/16 nativo. Nessuna API route separata per le operazioni admin CRUD. Il form chiama una Server Action → Drizzle scrive DB →
revalidatePathaggiorna la pagina. Pattern consistente con l'uso di Server Components già stabilito in Phase 1. - D-06: API route solo per client interactions — Le approvazioni e i commenti del cliente passano per API routes (non Server Actions) perché il contesto del client non ha session admin. Route pattern:
POST /api/client/approveePOST /api/client/comment— validate token via header o cookie custom, non Auth.js.
Admin UI Layout
- D-07: Lista → dettaglio —
/admin→ lista clienti con badge stato pagamenti. Click su cliente →/admin/clients/[id]con dettaglio completo. - D-08: Tabs per sezioni cliente — Nella pagina dettaglio cliente, usare tabs: Panoramica | Fasi & Task | Documenti | Pagamenti | Commenti. shadcn non ha tabs installato — aggiungere
@radix-ui/react-tabs+ componente. - D-09: Sidebar assente in v1 — Nessuna sidebar globale. Nav minimal: logo + link "Clienti" + pulsante logout. Desktop-first ma responsive.
Client Interactions (DASH-05, DASH-06)
- D-10: Approvazione deliverable — Pulsante "Approva" visibile solo se
approved_atè null. Nessun modal di conferma — l'azione è semplice e l'approved_at immutabile basta come audit. POST a/api/client/approvecon{ deliverableId }, token letto da cookie o URL (il token è già inparamsnel client route). - D-11: Commenti inline — Textarea + pulsante "Invia" direttamente sotto task/deliverable. POST a
/api/client/comment. Lista commenti sopra il form, ordinati percreated_atasc. Autore mostrato come "Tu" (cliente) o "iamcavalli" (admin). No real-time — reload della pagina sufficiente in v1.
Reusable Assets da Phase 1
- Schema DB: completo e non richiede modifiche.
comments,deliverables.approved_at,paymentsgià pronti. - shadcn/ui installati: badge, button, card, input, label, select, table, textarea — usabili as-is.
- Drizzle ORM + postgres-js: pattern stabilito in Phase 1, stesso setup.
- Zod + react-hook-form: già installati, usare per tutti i form admin.
src/lib/client-view.ts: già applica data isolation — non toccare per questa fase.
Claude's Discretion
- Struttura esatta delle Server Actions (file naming:
actions.tsper domain o singolo file) - Ordine campi nei form admin (quale sequenza per nuovo cliente)
- Icone lucide-react per stati (quale icona per
da_saldare/inviata/saldato) - Colori badge admin (riutilizzare
--color-success,--color-warning,--color-infoda globals.css)
<canonical_refs>
Canonical References
Downstream agents MUST read these before planning or implementing.
Progetto & Requisiti
.planning/PROJECT.md— Contesto progetto e decisioni chiave.planning/REQUIREMENTS.md— REQ-IDs Phase 2: ADMIN-01, ADMIN-02, DASH-05, DASH-06.planning/ROADMAP.md— Success criteria Phase 2CLAUDE.md— Architectural constraints LOCKED (token/PK separati, accepted_total, approved_at immutabile, due path auth)
Codice Esistente
src/db/schema.ts— Schema completo, nessuna modifica necessaria in Phase 2src/proxy.ts— Edge middleware esistente (aggiungere matcher admin)src/lib/client-view.ts— Data isolation layer (non toccare)src/app/globals.css— Design tokens e @source not directives
Phase 1 Context
.planning/phases/01-foundation-client-dashboard/01-CONTEXT.md— Decisioni D-04 (brand hardcoded), D-05 (light & clean), D-12 (note admin-only)
</canonical_refs>
<code_context>
Existing Code Insights
Reusable Assets
src/components/ui/: badge, button, card, input, label, progress, select, separator, table, textarea — tutti prontisrc/db/schema.ts: export typesClient,Phase,Task,Deliverable,Comment,Payment,Document,Note— usare as-issrc/lib/utils.ts:cn()utility da shadcn — riusare ovunque
Pattern Stabiliti
- Server Components per fetch dati (nessun
useEffect, nessun client-side waterfall) - Drizzle query con
.innerJoin()e.where(eq(...))— vederesrc/lib/client-view.ts revalidatePathdopo mutazioni per aggiornare UI senza client state
Integration Points
src/proxy.ts: aggiungere'/admin/:path*'al matcher + logicagetTokenper redirect- Client approval/comment: POST API routes che leggono token dal path URL del referrer o body request
Package da Aggiungere
next-auth@4— Auth.js per admin session@radix-ui/react-tabs+ shadcn tabs component — per tabs nella pagina dettaglio cliente@radix-ui/react-dialog+ shadcn dialog — per eventuali modali (confirm delete, ecc.)
</code_context>
## Deferred Ideas- Brand customization panel (colori, logo admin) → Phase 3+ o post-roadmap
- Sidebar globale → non necessaria con lista→dettaglio in v1
- Real-time commenti (WebSocket/polling) → v2, non v1
- Multi-admin / ruoli → fuori scope (singolo admin in tutta la roadmap)
- Password change UI → non necessaria (env var, admin solo)
Phase: 2 — Admin Area & Interactive Features Context gathered: 2026-05-15