This commit is contained in:
fabio 2026-02-22 17:26:56 +01:00
parent bac3d97223
commit e9d7941c7e
32 changed files with 358 additions and 0 deletions

30
.gitignore vendored Normal file
View File

@ -0,0 +1,30 @@
# Binaries
*.exe
*.exe~
*.dll
*.so
*.dylib
*.test
*.out
# Build artifacts
bin/
dist/
build/
tmp/
# Logs
*.log
# Environment
.env
.env.*
# Editors / OS
.DS_Store
.idea/
.vscode/
# Dev database/files
data/*
!data/.gitkeep

0
cmd/.gitkeep Normal file
View File

0
cmd/server/.gitkeep Normal file
View File

13
codex-prompt/prompt-0.txt Normal file
View File

@ -0,0 +1,13 @@
Sei Codex in VS Code. Lavora direttamente nel workspace.
Obiettivo: creare un boilerplate riusabile “GoFiber MVC + HTMX + Svelte Custom Elements UI kit + GORM + SQLite/Postgres + Auth + Email sink + CORS + template directory public/private/admin + role admin”.
1) Scansiona il workspace e dimmi cosa esiste già.
2) Crea/aggiorna la struttura cartelle secondo questa convenzione:
/cmd/server
/internal/{app,config,http,middleware,db,models,repo,services,controllers,auth,mailer}
/web/{templates/{public,private,admin},emails/templates,static/{vendor,ui,css}}
/ui-kit
/data (solo dev)
3) Crea una TODO checklist in README.md con i passi rimanenti.
Non implementare ancora logica: solo struttura + README e .gitignore.

24
codex-prompt/prompt-1.txt Normal file
View File

@ -0,0 +1,24 @@
Implementa internal/config e internal/app.
- Aggiungi internal/config/config.go:
- carica .env se presente (godotenv)
- espone Config con: AppName, Env (develop|prod), Port, BaseURL, BuildHash
DBDriver (sqlite|postgres), SQLitePath, PostgresDSN
CORS settings (origins/headers/methods/credentials)
SessionKey
SMTP settings + EmailSinkDir
Flags: AutoMigrate, SeedEnabled
- valida i campi essenziali (es. DB DSN se postgres)
- Aggiungi internal/app/app.go:
- crea fiber.App
- registra CORS middleware
- registra session store
- init DB (internal/db) + migrate/seed (in base ai flag)
- registra router (internal/http/router.go)
- espone NewApp(cfg) (*fiber.App, error)
- Aggiorna cmd/server/main.go per usare internal/app.
Crea/aggiorna .env.example e .gitignore (escludi .env, /data, db sqlite, email sink).
Scrivi codice compilabile.

288
codex.md Normal file
View File

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

0
data/.gitkeep Normal file
View File

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module trustcontact
go 1.25.4

0
internal/.gitkeep Normal file
View File

0
internal/app/.gitkeep Normal file
View File

0
internal/auth/.gitkeep Normal file
View File

0
internal/config/.gitkeep Normal file
View File

View File

0
internal/db/.gitkeep Normal file
View File

0
internal/http/.gitkeep Normal file
View File

0
internal/mailer/.gitkeep Normal file
View File

View File

0
internal/models/.gitkeep Normal file
View File

0
internal/repo/.gitkeep Normal file
View File

View File

0
ui-kit/.gitkeep Normal file
View File

0
web/.gitkeep Normal file
View File

0
web/emails/.gitkeep Normal file
View File

View File

0
web/static/.gitkeep Normal file
View File

0
web/static/css/.gitkeep Normal file
View File

0
web/static/ui/.gitkeep Normal file
View File

0
web/static/vendor/.gitkeep vendored Normal file
View File

0
web/templates/.gitkeep Normal file
View File

View File

View File

View File