backend-server-v2/internal/controllers/users_controller.go

126 lines
2.9 KiB
Go

package controllers
import (
"fmt"
"html/template"
"path/filepath"
"strconv"
"strings"
httpmw "trustcontact/internal/http/middleware"
"trustcontact/internal/services"
"github.com/gofiber/fiber/v2"
)
type UsersController struct {
usersService *services.UsersService
}
func NewUsersController(usersService *services.UsersService) *UsersController {
return &UsersController{usersService: usersService}
}
func (uc *UsersController) Index(c *fiber.Ctx) error {
pageData, err := uc.queryPage(c)
if err != nil {
return err
}
viewData := map[string]any{
"Title": "Users",
"NavSection": "private",
"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/private/users/index.html",
"web/templates/private/users/_table.html",
)
if err != nil {
return err
}
return executeLayout(c, tmpl, viewData)
}
func (uc *UsersController) Table(c *fiber.Ctx) error {
pageData, err := uc.queryPage(c)
if err != nil {
return err
}
viewData := map[string]any{"PageData": pageData}
tmpl, err := template.ParseFiles("web/templates/private/users/_table.html")
if err != nil {
return err
}
c.Type("html", "utf-8")
return tmpl.ExecuteTemplate(c.Response().BodyWriter(), "users_table", viewData)
}
func (uc *UsersController) Modal(c *fiber.Ctx) error {
id, err := strconv.ParseUint(c.Params("id"), 10, 64)
if err != nil || id == 0 {
return c.Status(fiber.StatusBadRequest).SendString("invalid user id")
}
user, err := uc.usersService.GetByID(uint(id))
if err != nil {
return err
}
if user == nil {
return c.Status(fiber.StatusNotFound).SendString("user not found")
}
viewData := map[string]any{"User": user}
tmpl, err := template.ParseFiles("web/templates/private/users/_modal.html")
if err != nil {
return err
}
c.Type("html", "utf-8")
return tmpl.ExecuteTemplate(c.Response().BodyWriter(), "users_modal", viewData)
}
func (uc *UsersController) queryPage(c *fiber.Ctx) (*services.UsersPage, error) {
page := parseIntOrDefault(c.Query("page"), 1)
pageSize := parseIntOrDefault(c.Query("pageSize"), 10)
q := strings.TrimSpace(c.Query("q"))
sort := c.Query("sort", "id")
dir := c.Query("dir", "asc")
pageData, err := uc.usersService.List(services.UsersQuery{
Q: q,
Sort: sort,
Dir: dir,
Page: page,
PageSize: pageSize,
})
if err != nil {
return nil, fmt.Errorf("list users: %w", err)
}
return pageData, nil
}
func parseIntOrDefault(value string, fallback int) int {
parsed, err := strconv.Atoi(value)
if err != nil || parsed <= 0 {
return fallback
}
return parsed
}
func executeLayout(c *fiber.Ctx, tmpl *template.Template, viewData map[string]any) error {
httpmw.SetTemplateData(c, "NavSection", viewData["NavSection"])
c.Type("html", "utf-8")
return tmpl.ExecuteTemplate(c.Response().BodyWriter(), filepath.Base("web/templates/layout.html"), viewData)
}