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" ) // PersonalAgentHandler handles personal agent config endpoints type PersonalAgentHandler struct { svc *service.PersonalAgentService } // NewPersonalAgentHandler creates a new personal agent handler func NewPersonalAgentHandler(svc *service.PersonalAgentService) *PersonalAgentHandler { return &PersonalAgentHandler{svc: svc} } // GetMyConfig handles GET /api/v1/agents/me?userId=X&tenantId=Y func (h *PersonalAgentHandler) GetMyConfig(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) userID, err := uuid.Parse(c.Query("userId")) if err != nil { apiErr := types.NewBadRequest("Invalid or missing userId") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } tenantID, err := uuid.Parse(c.Query("tenantId")) if err != nil { apiErr := types.NewBadRequest("Invalid or missing tenantId") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } config, err := h.svc.GetConfig(c.Context(), userID, tenantID) if err != nil { apiErr := types.NewNotFound("Personal agent config not found") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(config, reqID)) } // UpsertMyConfig handles PUT /api/v1/agents/me func (h *PersonalAgentHandler) UpsertMyConfig(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) var req types.UserAgentConfigUpsert 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.UserID == uuid.Nil || req.TenantID == uuid.Nil { apiErr := types.NewValidation("userId and tenantId are required") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } if len(req.Config) == 0 { apiErr := types.NewValidation("config is required") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } config, err := h.svc.UpsertConfig(c.Context(), &req) if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(config, reqID)) } // DeleteMyConfig handles DELETE /api/v1/agents/me?userId=X&tenantId=Y func (h *PersonalAgentHandler) DeleteMyConfig(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) userID, err := uuid.Parse(c.Query("userId")) if err != nil { apiErr := types.NewBadRequest("Invalid or missing userId") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } tenantID, err := uuid.Parse(c.Query("tenantId")) if err != nil { apiErr := types.NewBadRequest("Invalid or missing tenantId") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } if err := h.svc.DeleteConfig(c.Context(), userID, tenantID); err != nil { apiErr := types.NewNotFound("Personal agent config not found") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.SendStatus(fiber.StatusNoContent) }