package services import ( "context" "nearle/models" "nearle/repositories" ) type PosService interface { IngestOrders(batch models.PosOrderBatch) (*models.PosAck, error) IngestCustomers(batch models.PosCustomerBatch) (*models.PosAck, error) Catalogue(storeID, since string, page, pageSize int) (*models.PosCatalogueResponse, error) // RecordHealth stores one heartbeat. Never acknowledged back to the till: // presence is a fire-and-forget signal, and a terminal that stopped selling // because its heartbeat failed would be a worse outcome than a blank board. RecordHealth(ctx context.Context, health models.PosHealth) error TerminalHealth(ctx context.Context, terminalID string) (map[string]string, error) LocationHealth(ctx context.Context, locationID string) ([]map[string]string, error) } type posService struct { repo repositories.PosRepository presence repositories.PosPresenceRepository } func NewPosService(repo repositories.PosRepository, presence repositories.PosPresenceRepository) PosService { return &posService{repo: repo, presence: presence} } func (s *posService) RecordHealth(ctx context.Context, health models.PosHealth) error { return s.presence.Record(ctx, health) } func (s *posService) TerminalHealth(ctx context.Context, terminalID string) (map[string]string, error) { return s.presence.Terminal(ctx, terminalID) } func (s *posService) LocationHealth(ctx context.Context, locationID string) ([]map[string]string, error) { return s.presence.Location(ctx, locationID) } func (s *posService) IngestOrders(batch models.PosOrderBatch) (*models.PosAck, error) { return s.repo.IngestOrders(batch) } func (s *posService) IngestCustomers(batch models.PosCustomerBatch) (*models.PosAck, error) { return s.repo.IngestCustomers(batch) } func (s *posService) Catalogue(storeID, since string, page, pageSize int) (*models.PosCatalogueResponse, error) { return s.repo.Catalogue(storeID, since, page, pageSize) }