4.8 KiB
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
- Template directory separata correttamente
- Accesso diretto a /private/* senza login → redirect /login
- Accesso a /admin/* senza role=admin → 403
- Signup crea utente role=user
- Seed crea admin role=admin
- Navbar cambia in base a stato login
- Email sink funziona in develop
- DB driver selezionabile via .env
- Migrazioni e seed eseguiti all'avvio
- 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.