Files
GL/application/health/service.go
T
nfel 88e227f80c
CI/CD Stage / stage (push) Failing after 1m12s
feat(gl): add standalone ledger authority mode
2026-10-06 22:40:07 +03:30

65 lines
1.5 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 SettlementAuthority interface {
SettlementAllowed(context.Context) (bool, 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
if authority, ok := s.settlement.(SettlementAuthority); ok {
allowed, authorityErr := authority.SettlementAllowed(ctx)
status.SettlementReady = authorityErr == nil && allowed
}
}
}
return status
}