package httpapi import ( "context" "time" "github.com/dtoro/oikos/internal/db" "github.com/dtoro/oikos/internal/httpapi/gen" ) func (s *Server) GetFleetHealth(ctx context.Context, req gen.GetFleetHealthRequestObject) (gen.GetFleetHealthResponseObject, error) { resp := gen.GetFleetHealth200JSONResponse{} resp.Entities = []struct { Health gen.HealthSummaryEntitiesHealth `json:"health"` LastCheckAt *time.Time `json:"last_check_at"` Slug string `json:"slug"` Trend *gen.HealthSummaryEntitiesTrend `json:"trend"` Type string `json:"type"` }{} // Exclude 'check' entities (internal probes) — only entities actually // being monitored should count toward fleet health. rows, err := s.pool.Query(ctx, ` SELECT e.slug, e.type, st.health, st.last_check_at FROM entity_status st JOIN entities e ON e.id = st.entity_id WHERE e.type <> 'check' ORDER BY e.slug`) if err != nil { return nil, err } defer rows.Close() stale := 0 for rows.Next() { var slug, typ, health string var lastCheck *time.Time if err := rows.Scan(&slug, &typ, &health, &lastCheck); err != nil { return nil, err } switch health { case "healthy": resp.Summary.Healthy++ case "degraded": resp.Summary.Degraded++ case "down": resp.Summary.Down++ case "stale": stale++ default: resp.Summary.Unknown++ } resp.Entities = append(resp.Entities, struct { Health gen.HealthSummaryEntitiesHealth `json:"health"` LastCheckAt *time.Time `json:"last_check_at"` Slug string `json:"slug"` Trend *gen.HealthSummaryEntitiesTrend `json:"trend"` Type string `json:"type"` }{ Health: gen.HealthSummaryEntitiesHealth(health), LastCheckAt: lastCheck, Slug: slug, Type: typ, }) } if stale > 0 { resp.Summary.Stale = &stale } return resp, rows.Err() } func (s *Server) ExportSeeds(ctx context.Context, req gen.ExportSeedsRequestObject) (gen.ExportSeedsResponseObject, error) { exports, err := db.ExportToYAML(ctx, s.pool) if err != nil { return nil, err } return gen.ExportSeeds200JSONResponse{ Ontology: string(exports["ontology.yaml"]), Inventory: string(exports["inventory.yaml"]), Policy: string(exports["policy.yaml"]), }, nil }