57 lines
1.2 KiB
Go
57 lines
1.2 KiB
Go
// 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
|
|
}
|