Files
weatherapi/internal/adapters/inbound/httpapi/discussion_endpoint.go
2026-03-29 08:05:16 -05:00

73 lines
2.2 KiB
Go

// discussion_endpoint.go defines the /discussion endpoint behavior.
// Layer: adapters/inbound/httpapi discussion route.
package httpapi
import (
"context"
"time"
"gitea.maximumdirect.net/ejr/feedapi/endpoint"
"gitea.maximumdirect.net/ejr/feedapi/render"
"gitea.maximumdirect.net/ejr/feedapi/response"
"gitea.maximumdirect.net/ejr/weatherapi/internal/adapters/inbound/httpapi/presenter"
"gitea.maximumdirect.net/ejr/weatherfeeder/model"
)
func discussionDefinitions(svc Service) []endpoint.Definition {
return []endpoint.Definition{
discussionDefinition(
"/discussion",
"discussion.txt.tmpl",
func(run *model.WeatherForecastDiscussion, units presenter.Units, tz *time.Location) any {
return presenter.DiscussionPayload(run, units, tz)
},
svc,
),
discussionDefinition(
"/discussion/key-messages",
"discussion_key_messages.txt.tmpl",
func(run *model.WeatherForecastDiscussion, units presenter.Units, tz *time.Location) any {
return presenter.DiscussionKeyMessagesOnlyPayload(run, units, tz)
},
svc,
),
discussionDefinition(
"/discussion/short-term",
"discussion_short_term.txt.tmpl",
func(run *model.WeatherForecastDiscussion, units presenter.Units, tz *time.Location) any {
return presenter.DiscussionShortTermOnlyPayload(run, units, tz)
},
svc,
),
discussionDefinition(
"/discussion/long-term",
"discussion_long_term.txt.tmpl",
func(run *model.WeatherForecastDiscussion, units presenter.Units, tz *time.Location) any {
return presenter.DiscussionLongTermOnlyPayload(run, units, tz)
},
svc,
),
}
}
func discussionDefinition(
path string,
templateName string,
present func(*model.WeatherForecastDiscussion, presenter.Units, *time.Location) any,
svc Service,
) endpoint.Definition {
return endpoint.GET(
path,
bindTimezoneQuery,
func(ctx context.Context, req timezoneQueryRequest) (any, error) {
run, err := svc.LatestForecastDiscussion(ctx)
if err != nil {
return nil, err
}
return response.Envelope{Data: present(run, req.Units, req.Timezone)}, nil
},
endpoint.WithProduces(render.FormatJSON, render.FormatXML, render.FormatText),
endpoint.WithTemplate(templateName),
)
}