Added a /conditions/current endpoint with computed best-guess values for current conditions
All checks were successful
ci/woodpecker/push/build-image Pipeline was successful
All checks were successful
ci/woodpecker/push/build-image Pipeline was successful
This commit is contained in:
84
internal/application/conditions/service.go
Normal file
84
internal/application/conditions/service.go
Normal file
@@ -0,0 +1,84 @@
|
||||
package conditions
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"gitea.maximumdirect.net/ejr/weatherapi/internal/application/units"
|
||||
"gitea.maximumdirect.net/ejr/weatherapi/internal/core/ports"
|
||||
"gitea.maximumdirect.net/ejr/weatherapi/internal/platform/constants"
|
||||
"gitea.maximumdirect.net/ejr/weatherfeeder/model"
|
||||
"gitea.maximumdirect.net/ejr/weatherfeeder/standards"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
repo ports.ObservationRepository
|
||||
registry *units.Registry
|
||||
window time.Duration
|
||||
}
|
||||
|
||||
func NewService(repo ports.ObservationRepository, registry *units.Registry, window time.Duration) *Service {
|
||||
return &Service{repo: repo, registry: registry, window: window}
|
||||
}
|
||||
|
||||
type Response struct {
|
||||
TemperatureC *float64 `json:"temperatureC,omitempty"`
|
||||
TemperatureF *float64 `json:"temperatureF,omitempty"`
|
||||
ApparentTemperatureC *float64 `json:"apparentTemperatureC,omitempty"`
|
||||
ApparentTemperatureF *float64 `json:"apparentTemperatureF,omitempty"`
|
||||
DewpointC *float64 `json:"dewpointC,omitempty"`
|
||||
DewpointF *float64 `json:"dewpointF,omitempty"`
|
||||
RelativeHumidity *float64 `json:"relativeHumidityPercent,omitempty"`
|
||||
WindSpeedKmh *float64 `json:"windSpeedKmh,omitempty"`
|
||||
WindSpeedMph *float64 `json:"windSpeedMph,omitempty"`
|
||||
WindDirectionDegrees *float64 `json:"windDirectionDegrees,omitempty"`
|
||||
ConditionCode *int `json:"conditionCode,omitempty"`
|
||||
ConditionText *string `json:"conditionText,omitempty"`
|
||||
IsDay *bool `json:"isDay,omitempty"`
|
||||
}
|
||||
|
||||
func (s *Service) GetCurrent(ctx context.Context, unitSystem string) (Response, error) {
|
||||
if s == nil {
|
||||
return Response{}, fmt.Errorf("conditions service is nil")
|
||||
}
|
||||
|
||||
converter, err := s.registry.Resolve(unitSystem)
|
||||
if err != nil {
|
||||
return Response{}, err
|
||||
}
|
||||
|
||||
summary, err := s.repo.GetCurrentConditionsSummary(ctx, s.window)
|
||||
if err != nil {
|
||||
return Response{}, err
|
||||
}
|
||||
|
||||
resp := Response{
|
||||
RelativeHumidity: summary.RelativeHumidity,
|
||||
WindDirectionDegrees: summary.WindDirectionDegrees,
|
||||
ConditionCode: summary.ConditionCode,
|
||||
IsDay: summary.IsDay,
|
||||
}
|
||||
if summary.ConditionCode != nil {
|
||||
resp.ConditionText = ptrString(standards.WMOText(model.WMOCode(*summary.ConditionCode), summary.IsDay))
|
||||
}
|
||||
|
||||
switch converter.System() {
|
||||
case constants.UnitSystemUS:
|
||||
resp.TemperatureF = converter.TemperatureCToOutput(summary.TemperatureC)
|
||||
resp.ApparentTemperatureF = converter.TemperatureCToOutput(summary.ApparentTemperatureC)
|
||||
resp.DewpointF = converter.TemperatureCToOutput(summary.DewpointC)
|
||||
resp.WindSpeedMph = converter.SpeedKmhToOutput(summary.WindSpeedKmh)
|
||||
default:
|
||||
resp.TemperatureC = converter.TemperatureCToOutput(summary.TemperatureC)
|
||||
resp.ApparentTemperatureC = converter.TemperatureCToOutput(summary.ApparentTemperatureC)
|
||||
resp.DewpointC = converter.TemperatureCToOutput(summary.DewpointC)
|
||||
resp.WindSpeedKmh = converter.SpeedKmhToOutput(summary.WindSpeedKmh)
|
||||
}
|
||||
|
||||
return resp, nil
|
||||
}
|
||||
|
||||
func ptrString(v string) *string {
|
||||
return &v
|
||||
}
|
||||
Reference in New Issue
Block a user