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

4.8 KiB
Raw Blame History

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:

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.