From e9d7941c7e17cbd41ab5facc00468ea9d6b18b3d Mon Sep 17 00:00:00 2001 From: fabio Date: Sun, 22 Feb 2026 17:26:56 +0100 Subject: [PATCH] prompt-0 --- .gitignore | 30 ++++ cmd/.gitkeep | 0 cmd/server/.gitkeep | 0 codex-prompt/prompt-0.txt | 13 ++ codex-prompt/prompt-1.txt | 24 +++ codex.md | 288 +++++++++++++++++++++++++++++++++ data/.gitkeep | 0 go.mod | 3 + internal/.gitkeep | 0 internal/app/.gitkeep | 0 internal/auth/.gitkeep | 0 internal/config/.gitkeep | 0 internal/controllers/.gitkeep | 0 internal/db/.gitkeep | 0 internal/http/.gitkeep | 0 internal/mailer/.gitkeep | 0 internal/middleware/.gitkeep | 0 internal/models/.gitkeep | 0 internal/repo/.gitkeep | 0 internal/services/.gitkeep | 0 ui-kit/.gitkeep | 0 web/.gitkeep | 0 web/emails/.gitkeep | 0 web/emails/templates/.gitkeep | 0 web/static/.gitkeep | 0 web/static/css/.gitkeep | 0 web/static/ui/.gitkeep | 0 web/static/vendor/.gitkeep | 0 web/templates/.gitkeep | 0 web/templates/admin/.gitkeep | 0 web/templates/private/.gitkeep | 0 web/templates/public/.gitkeep | 0 32 files changed, 358 insertions(+) create mode 100644 .gitignore create mode 100644 cmd/.gitkeep create mode 100644 cmd/server/.gitkeep create mode 100644 codex-prompt/prompt-0.txt create mode 100644 codex-prompt/prompt-1.txt create mode 100644 codex.md create mode 100644 data/.gitkeep create mode 100644 go.mod create mode 100644 internal/.gitkeep create mode 100644 internal/app/.gitkeep create mode 100644 internal/auth/.gitkeep create mode 100644 internal/config/.gitkeep create mode 100644 internal/controllers/.gitkeep create mode 100644 internal/db/.gitkeep create mode 100644 internal/http/.gitkeep create mode 100644 internal/mailer/.gitkeep create mode 100644 internal/middleware/.gitkeep create mode 100644 internal/models/.gitkeep create mode 100644 internal/repo/.gitkeep create mode 100644 internal/services/.gitkeep create mode 100644 ui-kit/.gitkeep create mode 100644 web/.gitkeep create mode 100644 web/emails/.gitkeep create mode 100644 web/emails/templates/.gitkeep create mode 100644 web/static/.gitkeep create mode 100644 web/static/css/.gitkeep create mode 100644 web/static/ui/.gitkeep create mode 100644 web/static/vendor/.gitkeep create mode 100644 web/templates/.gitkeep create mode 100644 web/templates/admin/.gitkeep create mode 100644 web/templates/private/.gitkeep create mode 100644 web/templates/public/.gitkeep diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78fd76c --- /dev/null +++ b/.gitignore @@ -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 diff --git a/cmd/.gitkeep b/cmd/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/cmd/server/.gitkeep b/cmd/server/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/codex-prompt/prompt-0.txt b/codex-prompt/prompt-0.txt new file mode 100644 index 0000000..d668c41 --- /dev/null +++ b/codex-prompt/prompt-0.txt @@ -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. \ No newline at end of file diff --git a/codex-prompt/prompt-1.txt b/codex-prompt/prompt-1.txt new file mode 100644 index 0000000..4e9ffa6 --- /dev/null +++ b/codex-prompt/prompt-1.txt @@ -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. \ No newline at end of file diff --git a/codex.md b/codex.md new file mode 100644 index 0000000..f7141d6 --- /dev/null +++ b/codex.md @@ -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 l’architettura. +Mantenere separazione MVC pulita. \ No newline at end of file diff --git a/data/.gitkeep b/data/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..fa9d736 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module trustcontact + +go 1.25.4 diff --git a/internal/.gitkeep b/internal/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/app/.gitkeep b/internal/app/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/auth/.gitkeep b/internal/auth/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/config/.gitkeep b/internal/config/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/controllers/.gitkeep b/internal/controllers/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/db/.gitkeep b/internal/db/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/http/.gitkeep b/internal/http/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/mailer/.gitkeep b/internal/mailer/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/middleware/.gitkeep b/internal/middleware/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/models/.gitkeep b/internal/models/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/repo/.gitkeep b/internal/repo/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/internal/services/.gitkeep b/internal/services/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/ui-kit/.gitkeep b/ui-kit/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/.gitkeep b/web/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/emails/.gitkeep b/web/emails/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/emails/templates/.gitkeep b/web/emails/templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/static/.gitkeep b/web/static/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/static/css/.gitkeep b/web/static/css/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/static/ui/.gitkeep b/web/static/ui/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/static/vendor/.gitkeep b/web/static/vendor/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/templates/.gitkeep b/web/templates/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/templates/admin/.gitkeep b/web/templates/admin/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/templates/private/.gitkeep b/web/templates/private/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/web/templates/public/.gitkeep b/web/templates/public/.gitkeep new file mode 100644 index 0000000..e69de29