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