// Package health provides the service readiness use case. package health import ( "context" "gl/domain/ledger" ) type Database interface { Ping(context.Context) error } type SettlementMonitor interface { Stats(context.Context) (ledger.SettlementStats, error) } type Status struct { Serving bool DatabaseReady bool SettlementEnabled bool SettlementReady bool SettlementStats ledger.SettlementStats } type Service struct { database Database settlement SettlementMonitor settlementEnabled bool } func NewService(database Database, settlement ...SettlementMonitor) *Service { service := &Service{database: database} if len(settlement) > 0 && settlement[0] != nil { service.settlement = settlement[0] service.settlementEnabled = true } return service } func (s *Service) Check(ctx context.Context) Status { status := Status{} if s.database != nil { status.DatabaseReady = s.database.Ping(ctx) == nil } status.Serving = status.DatabaseReady status.SettlementEnabled = s.settlementEnabled if status.DatabaseReady && s.settlementEnabled { stats, err := s.settlement.Stats(ctx) if err == nil { status.SettlementStats = stats status.SettlementReady = true } } return status }