prompt-0
This commit is contained in:
parent
bac3d97223
commit
e9d7941c7e
|
|
@ -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,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.
|
||||||
|
|
@ -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.
|
||||||
|
|
@ -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.
|
||||||
Loading…
Reference in New Issue