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" ) // DNSZoneHandler handles DNS zone endpoints type DNSZoneHandler struct { svc *service.DNSService } // NewDNSZoneHandler creates a new DNS zone handler func NewDNSZoneHandler(svc *service.DNSService) *DNSZoneHandler { return &DNSZoneHandler{svc: svc} } // List handles GET /api/v1/dns/zones func (h *DNSZoneHandler) List(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) zones, err := h.svc.ListZones() if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(zones, reqID)) } // Get handles GET /api/v1/dns/zones/:zoneId func (h *DNSZoneHandler) Get(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) zoneID := c.Params("zoneId") zone, err := h.svc.GetZone(zoneID) if err != nil { apiErr := types.NewInternal(err.Error()) return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } return c.JSON(types.NewDataResponse(zone, reqID)) } // Create handles POST /api/v1/dns/zones func (h *DNSZoneHandler) Create(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) var req types.DNSZoneCreate 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.Name == "" { apiErr := types.NewValidation("name is required") return c.Status(apiErr.Status).JSON(types.NewErrorResponse(apiErr, reqID)) } zone, err := h.svc.CreateZone(&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(zone, reqID)) } // Update handles PUT /api/v1/dns/zones/:zoneId func (h *DNSZoneHandler) Update(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) zoneID := c.Params("zoneId") var req types.DNSZoneUpdate 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 err := h.svc.UpdateZone(zoneID, &req); 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": zoneID, "updated": true}, reqID)) } // Delete handles DELETE /api/v1/dns/zones/:zoneId func (h *DNSZoneHandler) Delete(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) zoneID := c.Params("zoneId") if err := h.svc.DeleteZone(zoneID); 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": zoneID, "deleted": true}, reqID)) } // Notify handles POST /api/v1/dns/zones/:zoneId/notify func (h *DNSZoneHandler) Notify(c *fiber.Ctx) error { reqID := middleware.GetRequestID(c) zoneID := c.Params("zoneId") if err := h.svc.NotifyZone(zoneID); 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": zoneID, "notified": true}, reqID)) }