package handler import ( "github.com/gofiber/fiber/v2" "github.com/gosec/gsc-ops-api/internal/middleware" "github.com/gosec/gsc-ops-api/internal/service" "github.com/gosec/gsc-ops-api/pkg/types" ) // PGPHandler handles PGP key endpoints type PGPHandler struct { svc *service.PGPService } // NewPGPHandler creates a new PGP handler func NewPGPHandler(svc *service.PGPService) *PGPHandler { return &PGPHandler{svc: svc} } // Search handles GET /api/v1/pgp/keys func (h *PGPHandler) Search(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) query := c.Query("search") if query == "" { query = c.Query("q") } if query == "" { apiErr := types.NewValidation("search or q query parameter is required") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } keys, err := h.svc.SearchKeys(query) if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(keys, reqID)) } // Get handles GET /api/v1/pgp/keys/:keyId func (h *PGPHandler) Get(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) keyID := c.Params("keyId") key, err := h.svc.GetKey(keyID) if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } if key == nil { apiErr := types.NewNotFound("PGP key not found: " + keyID) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(key, reqID)) } // Upload handles POST /api/v1/pgp/keys func (h *PGPHandler) Upload(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) var req types.PGPKeyUpload 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.KeyText == "" { apiErr := types.NewValidation("keyText is required") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } if err := h.svc.UploadKey(req.KeyText); 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(fiber.Map{ "uploaded": true, }, reqID)) } // Delete handles DELETE /api/v1/pgp/keys/:keyId func (h *PGPHandler) Delete(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) keyID := c.Params("keyId") if err := h.svc.DeleteKey(keyID); err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(fiber.Map{ "keyId": keyID, "deleted": true, }, reqID)) }