package handler import ( "context" "time" "github.com/gofiber/fiber/v2" "github.com/gosec/gsc-ops-api/internal/client" "github.com/gosec/gsc-ops-api/internal/database" "github.com/gosec/gsc-ops-api/internal/middleware" "github.com/gosec/gsc-ops-api/pkg/types" ) // HealthHandler handles health check endpoints type HealthHandler struct { db *database.DB ldap *client.LDAPClient pdns *client.PowerDNSClient carddav *client.CardDAVClient } // NewHealthHandler creates a new health handler func NewHealthHandler(db *database.DB, ldap *client.LDAPClient, pdns *client.PowerDNSClient, carddav *client.CardDAVClient) *HealthHandler { return &HealthHandler{db: db, ldap: ldap, pdns: pdns, carddav: carddav} } // Liveness returns 200 if the server is running func (h *HealthHandler) Liveness(c *fiber.Ctx) error { return c.JSON(types.NewDataResponse(fiber.Map{ "status": "ok", "time": time.Now().UTC(), }, middleware.GetRequestID(c))) } // Readiness checks all backend dependencies func (h *HealthHandler) Readiness(c *fiber.Ctx) error { ctx, cancel := context.WithTimeout(c.Context(), 5*time.Second) defer cancel() checks := make(map[string]string) allOK := true // Database if err := h.db.Health(ctx); err != nil { checks["database"] = "error: " + err.Error() allOK = false } else { checks["database"] = "ok" } // LDAP if h.ldap != nil { if err := h.ldap.Health(); err != nil { checks["ldap"] = "error: " + err.Error() allOK = false } else { checks["ldap"] = "ok" } } // PowerDNS if h.pdns != nil { if err := h.pdns.Health(); err != nil { checks["powerdns"] = "error: " + err.Error() allOK = false } else { checks["powerdns"] = "ok" } } // CardDAV if h.carddav != nil { if err := h.carddav.Health(ctx); err != nil { checks["carddav"] = "error: " + err.Error() allOK = false } else { checks["carddav"] = "ok" } } status := "ok" httpStatus := fiber.StatusOK if !allOK { status = "degraded" httpStatus = fiber.StatusServiceUnavailable } return c.Status(httpStatus).JSON(types.NewDataResponse(fiber.Map{ "status": status, "checks": checks, "time": time.Now().UTC(), }, middleware.GetRequestID(c))) }