126 lines
2.9 KiB
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)
|
|
}
|