288 lines
4.8 KiB
Markdown
288 lines
4.8 KiB
Markdown
# 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 l’architettura.
|
||
Mantenere separazione MVC pulita. |