# 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.