stato intermedio

This commit is contained in:
fabio
2026-03-01 14:36:26 +01:00
parent e0ef48f6fd
commit b852f656d4
25 changed files with 4230 additions and 390 deletions

View File

@@ -1,288 +0,0 @@
# 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.