package staff import ( "errors" "github.com/gofiber/fiber/v2" "github.com/jackc/pgx/v5" "github.com/techxcar/backend/internal/auth" "github.com/techxcar/backend/pkg/database" ) func RegisterRoutes(app *fiber.App, db *database.DB, secret string) { ro := []fiber.Handler{ auth.RequireAuth(secret), auth.RequireRole("tenant_admin", "manager", "technician"), auth.TenantMiddleware(db), } write := []fiber.Handler{ auth.RequireAuth(secret), auth.RequireRole("tenant_admin", "manager"), auth.TenantMiddleware(db), } app.Get("/api/v1/staff", append(ro, listStaffH())...) app.Post("/api/v1/staff", append(write, createStaffH())...) app.Put("/api/v1/staff/:id", append(write, updateStaffH())...) app.Delete("/api/v1/staff/:id", append(write, deleteStaffH())...) } func listStaffH() fiber.Handler { return func(c *fiber.Ctx) error { conn := auth.GetConn(c) list, err := ListStaff(c.Context(), conn) if err != nil { return fiber.NewError(500, "erro ao listar técnicos") } if list == nil { list = []*Staff{} } return c.JSON(fiber.Map{"data": list, "error": nil}) } } type staffBody struct { Name string `json:"name"` Email string `json:"email"` Phone string `json:"phone"` Type string `json:"type"` HourlyRate float64 `json:"hourly_rate"` Active bool `json:"active"` } func createStaffH() fiber.Handler { return func(c *fiber.Ctx) error { var b staffBody if err := c.BodyParser(&b); err != nil { return fiber.NewError(400, "corpo do pedido inválido") } if b.Name == "" { return fiber.NewError(400, "nome obrigatório") } if b.Type != "internal" && b.Type != "external" { return fiber.NewError(400, "tipo deve ser 'internal' ou 'external'") } conn := auth.GetConn(c) s, err := CreateStaff(c.Context(), conn, b.Name, b.Email, b.Phone, b.Type, b.HourlyRate) if err != nil { return fiber.NewError(500, "erro ao criar técnico") } return c.Status(201).JSON(fiber.Map{"data": s, "error": nil}) } } func updateStaffH() fiber.Handler { return func(c *fiber.Ctx) error { id := c.Params("id") var b staffBody if err := c.BodyParser(&b); err != nil { return fiber.NewError(400, "corpo do pedido inválido") } if b.Name == "" { return fiber.NewError(400, "nome obrigatório") } conn := auth.GetConn(c) s, err := UpdateStaff(c.Context(), conn, id, b.Name, b.Email, b.Phone, b.Type, b.HourlyRate, b.Active) if err != nil { return fiber.NewError(500, "erro ao actualizar técnico") } if s == nil { return fiber.NewError(404, "técnico não encontrado") } return c.JSON(fiber.Map{"data": s, "error": nil}) } } func deleteStaffH() fiber.Handler { return func(c *fiber.Ctx) error { id := c.Params("id") conn := auth.GetConn(c) err := DeleteStaff(c.Context(), conn, id) if errors.Is(err, pgx.ErrNoRows) { return fiber.NewError(404, "técnico não encontrado") } if err != nil { return fiber.NewError(500, "erro ao eliminar técnico") } return c.SendStatus(204) } }