45 lines
1.4 KiB
Go
45 lines
1.4 KiB
Go
|
|
package meta
|
||
|
|
|
||
|
|
import (
|
||
|
|
"context"
|
||
|
|
|
||
|
|
"nadir"
|
||
|
|
"nadir/internal/auth"
|
||
|
|
|
||
|
|
"github.com/danielgtaylor/huma/v2"
|
||
|
|
)
|
||
|
|
|
||
|
|
type HealthOutput struct {
|
||
|
|
Body struct {
|
||
|
|
Status string `json:"status" example:"ok" doc:"Overall health"`
|
||
|
|
Database string `json:"database" example:"ok" doc:"Embedded SQLite session store state"`
|
||
|
|
Version string `json:"version" example:"1.0.0" doc:"Application version"`
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// RegisterHealth adds a public liveness/readiness probe. It is intentionally
|
||
|
|
// unauthenticated (no permission metadata) so load balancers and orchestrators
|
||
|
|
// can reach it. Returns 503 when the SQLite session store is unreachable, so
|
||
|
|
// probes can key off the status code without parsing the body.
|
||
|
|
func RegisterHealth(api huma.API, sessions *auth.SessionStore) {
|
||
|
|
huma.Register(api, huma.Operation{
|
||
|
|
OperationID: "health",
|
||
|
|
Method: "GET",
|
||
|
|
Path: "/api/health",
|
||
|
|
Summary: "Health check",
|
||
|
|
Description: "Public liveness/readiness probe. Reports whether the embedded " +
|
||
|
|
"SQLite session store is reachable. Returns 503 when it is not.",
|
||
|
|
Tags: []string{"Meta"},
|
||
|
|
Errors: []int{503},
|
||
|
|
}, func(ctx context.Context, _ *struct{}) (*HealthOutput, error) {
|
||
|
|
if err := sessions.Ping(); err != nil {
|
||
|
|
return nil, huma.Error503ServiceUnavailable("session database unreachable", err)
|
||
|
|
}
|
||
|
|
out := &HealthOutput{}
|
||
|
|
out.Body.Status = "ok"
|
||
|
|
out.Body.Database = "ok"
|
||
|
|
out.Body.Version = nadir.Version
|
||
|
|
return out, nil
|
||
|
|
})
|
||
|
|
}
|