diff --git a/codex-prompt/prompt-8.txt b/codex-prompt/prompt-8.txt new file mode 100644 index 0000000..4a95663 --- /dev/null +++ b/codex-prompt/prompt-8.txt @@ -0,0 +1,11 @@ +Implementa area admin. + +Routes protette (RequireAuth + RequireAdmin): +- GET /admin -> admin/dashboard.html +- GET /admin/users -> pagina elenco utenti (server-rendered semplice) + +Templates: +- admin/dashboard.html +- admin/users.html + +Navbar nel layout deve mostrare link Admin solo se role=admin. \ No newline at end of file diff --git a/internal/controllers/admin_controller.go b/internal/controllers/admin_controller.go new file mode 100644 index 0000000..22b0f20 --- /dev/null +++ b/internal/controllers/admin_controller.go @@ -0,0 +1,71 @@ +package controllers + +import ( + "html/template" + + "trustcontact/internal/services" + + "github.com/gofiber/fiber/v2" +) + +type AdminController struct { + usersService *services.UsersService +} + +func NewAdminController(usersService *services.UsersService) *AdminController { + return &AdminController{usersService: usersService} +} + +func (ac *AdminController) Dashboard(c *fiber.Ctx) error { + viewData := map[string]any{ + "Title": "Admin Dashboard", + "NavSection": "admin", + } + for k, v := range localsTemplateData(c) { + viewData[k] = v + } + + tmpl, err := template.ParseFiles( + "web/templates/layout.html", + "web/templates/public/_flash.html", + "web/templates/admin/dashboard.html", + ) + if err != nil { + return err + } + + return executeLayout(c, tmpl, viewData) +} + +func (ac *AdminController) Users(c *fiber.Ctx) error { + pageData, err := ac.usersService.List(services.UsersQuery{ + Q: c.Query("q"), + Sort: c.Query("sort", "id"), + Dir: c.Query("dir", "asc"), + Page: parseIntOrDefault(c.Query("page"), 1), + PageSize: parseIntOrDefault(c.Query("pageSize"), 20), + }) + if err != nil { + return err + } + + viewData := map[string]any{ + "Title": "Admin Users", + "NavSection": "admin", + "PageData": pageData, + } + for k, v := range localsTemplateData(c) { + viewData[k] = v + } + + tmpl, err := template.ParseFiles( + "web/templates/layout.html", + "web/templates/public/_flash.html", + "web/templates/admin/users.html", + ) + if err != nil { + return err + } + + return executeLayout(c, tmpl, viewData) +} diff --git a/internal/http/router.go b/internal/http/router.go index 577765f..badc0ec 100644 --- a/internal/http/router.go +++ b/internal/http/router.go @@ -22,7 +22,9 @@ func RegisterRoutes(app *fiber.App, store *session.Store, database *gorm.DB, cfg return fmt.Errorf("init auth service: %w", err) } authController := controllers.NewAuthController(authService) - usersController := controllers.NewUsersController(services.NewUsersService(database)) + usersService := services.NewUsersService(database) + usersController := controllers.NewUsersController(usersService) + adminController := controllers.NewAdminController(usersService) app.Get("/healthz", func(c *fiber.Ctx) error { return c.SendStatus(fiber.StatusOK) @@ -50,9 +52,8 @@ func RegisterRoutes(app *fiber.App, store *session.Store, database *gorm.DB, cfg }) admin := app.Group("/admin", httpmw.RequireAuth(), httpmw.RequireAdmin()) - admin.Get("/", func(c *fiber.Ctx) error { - return c.SendString("admin area") - }) + admin.Get("/", adminController.Dashboard) + admin.Get("/users", adminController.Users) return nil } diff --git a/web/templates/admin/dashboard.html b/web/templates/admin/dashboard.html new file mode 100644 index 0000000..9819135 --- /dev/null +++ b/web/templates/admin/dashboard.html @@ -0,0 +1,8 @@ +{{define "content"}} +

Admin Dashboard

+

Area amministrazione.

+
+ Gestione utenti + Vista utenti (private) +
+{{end}} diff --git a/web/templates/admin/users.html b/web/templates/admin/users.html new file mode 100644 index 0000000..9487d03 --- /dev/null +++ b/web/templates/admin/users.html @@ -0,0 +1,53 @@ +{{define "content"}} +

Admin - Users

+

Elenco utenti server-rendered.

+ +
+ + + + + + +
+ + + + + + + + + + + + + {{range .PageData.Users}} + + + + + + + + {{else}} + + {{end}} + +
IDNameEmailRoleVerified
{{.ID}}{{if .Name}}{{.Name}}{{else}}-{{end}}{{.Email}}{{.Role}}{{if .EmailVerified}}yes{{else}}no{{end}}
Nessun utente trovato.
+ +
+
Totale: {{.PageData.Total}} utenti. Pagina {{.PageData.Page}}{{if gt .PageData.TotalPages 0}} / {{.PageData.TotalPages}}{{end}}
+
+ Prev + Next +
+
+{{end}} diff --git a/web/templates/layout.html b/web/templates/layout.html index 0f45b7d..bb75d0b 100644 --- a/web/templates/layout.html +++ b/web/templates/layout.html @@ -23,7 +23,9 @@