backend-server-v2/codex-prompt/codex.md

288 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Progetto: GoFiber MVC + HTMX + Svelte UI Kit + GORM + AUTH + Role System + Template Separation
# OBIETTIVO
Implementare un progetto GoFiber MVC completo con:
- HTML server-rendered (html/template)
- HTMX per partial HTML
- Design System Svelte (Custom Elements)
- GORM + SQLite/Postgres selezionabile via .env
- Migrazioni + seed
- CORS
- AUTH completo (signup, login, logout, verify email, lost password, reset)
- Email transactional (SMTP + file sink in develop)
- Separazione template per:
- public (pagine accessibili senza login)
- private (solo utenti autenticati)
- admin (solo utenti role=admin)
Architettura server-first. Nessuna SPA.
---
# TEMPLATE DIRECTORY STRUCTURE (OBBLIGATORIA)
Strutturare /web/templates così:
/web/templates/
layout.html
/public/
home.html
login.html
signup.html
forgot_password.html
reset_password.html
verify_notice.html
/private/
dashboard.html
users/
index.html
_table.html
_modal.html
/admin/
dashboard.html
users.html
Il layout deve essere unico e includere:
- ui.css
- htmx.min.js
- ui.esm.js
---
# RUOLI UTENTE
Aggiungere campo Role nel model User:
- role string
- "user" default
- "admin"
Vincoli:
- Solo admin può accedere a /admin/*
- /private/* richiede autenticazione
- /public/* accessibile a tutti
---
# ROUTING CON GRUPPI
Configurare in main.go:
Public routes:
- GET /
- GET /login
- POST /login
- GET /signup
- POST /signup
- GET /forgot-password
- POST /forgot-password
- GET /reset-password
- POST /reset-password
- GET /verify-email
Private group (RequireAuth middleware):
- GET /dashboard
- GET /users
- GET /users/table
- GET /users/:id/modal
- POST /logout
Admin group (RequireAuth + RequireAdmin middleware):
- GET /admin
- GET /admin/users
---
# MIDDLEWARE
Implementare:
## RequireAuth
- verifica sessione
- se non autenticato → redirect /login
## RequireAdmin
- verifica user.Role == "admin"
- se non admin → 403 o redirect /dashboard
---
# DATABASE MODEL UPDATE
Aggiornare model User:
- ID uint
- Email string unique
- PasswordHash string
- EmailVerified bool
- Role string (default "user")
- CreatedAt
- UpdatedAt
Migrazioni devono includere nuovo campo Role.
Seed:
- In develop creare:
- admin@example.com (role=admin, email verified)
- user@example.com (role=user, email verified)
Password default esempio: "password"
---
# AUTH REQUIREMENTS (RIEPILOGO)
Signup:
- crea utente con role=user
- EmailVerified=false
- genera token verifica
- invia email o salva in sink
Login:
- verifica password
- verifica EmailVerified
- salva sessione con:
- user_id
- user_role
Logout:
- distrugge sessione
Verify email:
- valida token hash
- set EmailVerified=true
Forgot password:
- genera reset token
- invia/salva email
Reset password:
- aggiorna PasswordHash
- invalida token
---
# EMAIL TEMPLATE DIRECTORY
Creare:
/web/emails/templates/
verify_email.html
verify_email.txt
reset_password.html
reset_password.txt
In develop:
- salvare email in:
EMAIL_SINK_DIR
- nome file:
timestamp__type__to.eml
In prod:
- inviare SMTP
---
# DIRECTORY PROTEZIONE LOGICA
Controllers devono renderizzare template in base al path:
- c.Render("public/login", data)
- c.Render("private/users/index", data)
- c.Render("admin/dashboard", data)
Mai mischiare.
---
# LAYOUT
layout.html deve:
- rilevare se utente autenticato
- mostrare navbar differente:
- public: login/signup
- user: dashboard + logout
- admin: dashboard + admin + logout
Passare CurrentUser al template se autenticato.
---
# HTMX IN PRIVATE
/users:
- search con hx-get
- table partial in private/users/_table.html
- modal in private/users/_modal.html
---
# CORS
Configurato da .env
---
# BUILD HASH
Usare BUILD_HASH in query string per css/js.
---
# CRITERI DI ACCETTAZIONE
1) Template directory separata correttamente
2) Accesso diretto a /private/* senza login → redirect /login
3) Accesso a /admin/* senza role=admin → 403
4) Signup crea utente role=user
5) Seed crea admin role=admin
6) Navbar cambia in base a stato login
7) Email sink funziona in develop
8) DB driver selezionabile via .env
9) Migrazioni e seed eseguiti all'avvio
10) Nessuna logica di autorizzazione nel frontend
---
# STRUTTURA FINALE PROGETTO (SEMPLIFICATA)
/cmd/server
/internal
/config
/db
/models
/repo
/services
/auth
/mailer
/controllers
/web
/templates
/public
/private
/admin
/emails/templates
/static
/ui-kit
---
# NOTE PER CODEX
- Creare tutti i file mancanti
- Scrivere codice completo, compilabile
- Commentare le parti sicurezza (token hashing)
- Usare bcrypt
- Usare SHA256 per token hash
- Non salvare mai token in chiaro nel DB
- Creare helper per CurrentUser
- Applicare middleware correttamente
Non semplificare larchitettura.
Mantenere separazione MVC pulita.