package handler import ( "github.com/gofiber/fiber/v2" "github.com/google/uuid" "github.com/gosec/gsc-ops-api/internal/middleware" "github.com/gosec/gsc-ops-api/internal/service" "github.com/gosec/gsc-ops-api/pkg/types" ) // DBUserHandler handles database user endpoints type DBUserHandler struct { svc *service.DatabaseService } // NewDBUserHandler creates a new DB user handler func NewDBUserHandler(svc *service.DatabaseService) *DBUserHandler { return &DBUserHandler{svc: svc} } // List handles GET /api/v1/db/users func (h *DBUserHandler) List(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) params := types.ListParams{ Limit: c.QueryInt("limit", 50), Offset: c.QueryInt("offset", 0), Search: c.Query("search"), Status: c.Query("status"), } users, total, err := h.svc.ListUsers(c.Context(), params) if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewPagedResponse(users, total, params.Limit, params.Offset, reqID)) } // Get handles GET /api/v1/db/users/:id func (h *DBUserHandler) Get(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) id, err := uuid.Parse(c.Params("id")) if err != nil { apiErr := types.NewBadRequest("Invalid user ID") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } user, err := h.svc.GetUser(c.Context(), id) if err != nil { apiErr := types.NewNotFound("User not found") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(user, reqID)) } // Create handles POST /api/v1/db/users func (h *DBUserHandler) Create(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) var req types.DBUserCreate if err := c.BodyParser(&req); err != nil { apiErr := types.NewBadRequest("Invalid request body: " + err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } if req.GscSID == "" { apiErr := types.NewValidation("gscsid is required") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } user, err := h.svc.CreateUser(c.Context(), &req) if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.Status(fiber.StatusCreated).JSON(types.NewDataResponse(user, reqID)) } // Update handles PUT /api/v1/db/users/:id func (h *DBUserHandler) Update(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) id, err := uuid.Parse(c.Params("id")) if err != nil { apiErr := types.NewBadRequest("Invalid user ID") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } var req types.DBUserUpdate if err := c.BodyParser(&req); err != nil { apiErr := types.NewBadRequest("Invalid request body: " + err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } user, err := h.svc.UpdateUser(c.Context(), id, &req) if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(user, reqID)) } // Delete handles DELETE /api/v1/db/users/:id (deactivate) func (h *DBUserHandler) Delete(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) id, err := uuid.Parse(c.Params("id")) if err != nil { apiErr := types.NewBadRequest("Invalid user ID") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } if err := h.svc.DeactivateUser(c.Context(), id); err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(fiber.Map{"id": id, "deactivated": true}, reqID)) }