// service.go defines application read ports and use-case orchestration. // Layer: internal/app core business-facing API. package app import ( "context" "gitea.maximumdirect.net/ejr/weatherfeeder/model" ) // Repository defines outbound data access used by weatherapi use cases. type Repository interface { LatestObservation(ctx context.Context) (*model.WeatherObservation, error) LatestHourlyForecast(ctx context.Context) (*model.WeatherForecastRun, error) LatestAlertRun(ctx context.Context) (*model.WeatherAlertRun, error) CurrentConditions(ctx context.Context, observationWindowMinutes int) (*CurrentConditions, error) } // Service provides weather read use-cases. type Service struct { repo Repository } func NewService(repo Repository) *Service { return &Service{repo: repo} } func (s *Service) LatestObservation(ctx context.Context) (*model.WeatherObservation, error) { return s.repo.LatestObservation(ctx) } func (s *Service) LatestHourlyForecast(ctx context.Context) (*model.WeatherForecastRun, error) { return s.repo.LatestHourlyForecast(ctx) } func (s *Service) LatestAlertRun(ctx context.Context) (*model.WeatherAlertRun, error) { return s.repo.LatestAlertRun(ctx) } func (s *Service) CurrentConditions(ctx context.Context) (*CurrentConditions, error) { return s.repo.CurrentConditions(ctx, ObservationWindowMinutesDefault) }