All checks were successful
ci/woodpecker/push/build-image Pipeline was successful
85 lines
2.9 KiB
Go
85 lines
2.9 KiB
Go
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
|
|
}
|