126 lines
3.7 KiB
Go
126 lines
3.7 KiB
Go
package app
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/briefing"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/config"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/forecast"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/promptinput"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/report"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/state"
|
|
"gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil"
|
|
)
|
|
|
|
type InspectReportsRequest struct {
|
|
Config config.Config
|
|
Limit int
|
|
}
|
|
|
|
type InspectRunRequest struct {
|
|
Config config.Config
|
|
RunID string
|
|
}
|
|
|
|
type SourceInspection struct {
|
|
RunID string `json:"runId"`
|
|
ReportID report.ID `json:"reportId"`
|
|
SourceLocation string `json:"sourceLocation,omitempty"`
|
|
Sources []briefing.SourceMetadata `json:"sources,omitempty"`
|
|
Warnings []forecast.SourceWarning `json:"warnings,omitempty"`
|
|
}
|
|
|
|
func InspectReports(ctx context.Context, req InspectReportsRequest) ([]state.ReportRecord, error) {
|
|
store, err := defaultStore(req.Config)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return store.ListReports(ctx, req.Limit)
|
|
}
|
|
|
|
func InspectMetadata(ctx context.Context, req InspectRunRequest) (state.Metadata, error) {
|
|
inspection, err := inspectRun(ctx, req)
|
|
return inspection.metadata, err
|
|
}
|
|
|
|
func InspectBriefing(ctx context.Context, req InspectRunRequest) (briefing.Package, error) {
|
|
inspection, err := inspectRun(ctx, req)
|
|
if err != nil {
|
|
return briefing.Package{}, err
|
|
}
|
|
return inspection.store.LoadBriefing(ctx, inspection.metadata.BriefingPath)
|
|
}
|
|
|
|
func InspectDataPackage(ctx context.Context, req InspectRunRequest) (promptinput.Package, error) {
|
|
inspection, err := inspectRun(ctx, req)
|
|
if err != nil {
|
|
return promptinput.Package{}, err
|
|
}
|
|
return inspection.store.LoadDataPackage(ctx, inspection.metadata.DataPackagePath)
|
|
}
|
|
|
|
func InspectPriorSnapshot(ctx context.Context, req InspectRunRequest) (*state.PriorSnapshot, error) {
|
|
inspection, err := inspectRun(ctx, req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
resolved, err := resolvedFromMetadata(inspection.metadata)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return inspection.store.FindPriorSnapshot(ctx, resolved)
|
|
}
|
|
|
|
func InspectSources(ctx context.Context, req InspectRunRequest) (SourceInspection, error) {
|
|
inspection, err := inspectRun(ctx, req)
|
|
if err != nil {
|
|
return SourceInspection{}, err
|
|
}
|
|
metadata := inspection.metadata
|
|
return SourceInspection{
|
|
RunID: metadata.RunID,
|
|
ReportID: metadata.ReportID,
|
|
SourceLocation: metadata.SourceLocation,
|
|
Sources: metadata.Sources,
|
|
Warnings: metadata.SourceWarnings,
|
|
}, nil
|
|
}
|
|
|
|
type runInspection struct {
|
|
store *state.FilesystemStore
|
|
metadata state.Metadata
|
|
}
|
|
|
|
func inspectRun(ctx context.Context, req InspectRunRequest) (runInspection, error) {
|
|
store, err := defaultStore(req.Config)
|
|
if err != nil {
|
|
return runInspection{}, err
|
|
}
|
|
metadata, _, err := store.LoadMetadataByRunID(ctx, req.RunID)
|
|
if err != nil {
|
|
return runInspection{}, err
|
|
}
|
|
return runInspection{store: store, metadata: metadata}, nil
|
|
}
|
|
|
|
func resolvedFromMetadata(metadata state.Metadata) (report.Resolved, error) {
|
|
definition, err := report.DefaultRegistry().Lookup(metadata.ReportID)
|
|
if err != nil {
|
|
return report.Resolved{}, err
|
|
}
|
|
location, err := timeutil.LoadLocation(metadata.Timezone)
|
|
if err != nil {
|
|
return report.Resolved{}, err
|
|
}
|
|
if !metadata.ValidPeriod.IsValid() {
|
|
return report.Resolved{}, fmt.Errorf("metadata valid period for run id %q is invalid", metadata.RunID)
|
|
}
|
|
return report.Resolved{
|
|
Definition: definition,
|
|
GeneratedAt: metadata.GeneratedAt,
|
|
Timezone: location.String(),
|
|
ValidPeriod: metadata.ValidPeriod,
|
|
}, nil
|
|
}
|