Fix to ensure unique document IDs when batch reports are generated
This commit is contained in:
@@ -22,6 +22,7 @@ func dailyDefinition() Definition {
|
||||
CompatiblePriorIDs: []ID{Daily},
|
||||
Modules: dailyModules(),
|
||||
resolve: resolveDaily,
|
||||
runIDDisambiguator: validStartDateRunIDDisambiguator,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -50,3 +51,14 @@ func resolveDaily(req ResolveRequest) (timeutil.Period, error) {
|
||||
}
|
||||
return timeutil.CivilDay(req.Date, req.Location), nil
|
||||
}
|
||||
|
||||
func validStartDateRunIDDisambiguator(resolved Resolved) string {
|
||||
if resolved.ValidPeriod.Start.IsZero() {
|
||||
return ""
|
||||
}
|
||||
location, err := timeutil.LoadLocation(resolved.Timezone)
|
||||
if err != nil {
|
||||
return resolved.ValidPeriod.Start.Format(timeutil.DateLayout)
|
||||
}
|
||||
return resolved.ValidPeriod.Start.In(location).Format(timeutil.DateLayout)
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package report
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"gitea.maximumdirect.net/eric/weatherreporter/internal/module"
|
||||
@@ -60,6 +61,7 @@ type Definition struct {
|
||||
Morning bool
|
||||
Evening bool
|
||||
resolve func(ResolveRequest) (timeutil.Period, error)
|
||||
runIDDisambiguator func(Resolved) string
|
||||
}
|
||||
|
||||
func (d Definition) ResolvePeriod(req ResolveRequest) (timeutil.Period, error) {
|
||||
@@ -112,7 +114,7 @@ type Metadata struct {
|
||||
|
||||
func (r Resolved) Metadata() Metadata {
|
||||
return Metadata{
|
||||
RunID: r.GeneratedAt.UTC().Format("20060102T150405.000000000Z") + "_" + string(r.Definition.ID),
|
||||
RunID: r.runID(),
|
||||
ReportID: r.Definition.ID,
|
||||
PromptID: r.Definition.PromptID,
|
||||
GeneratedAt: r.GeneratedAt,
|
||||
@@ -120,3 +122,15 @@ func (r Resolved) Metadata() Metadata {
|
||||
ValidPeriod: r.ValidPeriod,
|
||||
}
|
||||
}
|
||||
|
||||
func (r Resolved) runID() string {
|
||||
runID := r.GeneratedAt.UTC().Format("20060102T150405.000000000Z") + "_" + string(r.Definition.ID)
|
||||
if r.Definition.runIDDisambiguator == nil {
|
||||
return runID
|
||||
}
|
||||
disambiguator := strings.TrimSpace(r.Definition.runIDDisambiguator(r))
|
||||
if disambiguator == "" {
|
||||
return runID
|
||||
}
|
||||
return runID + "_" + disambiguator
|
||||
}
|
||||
|
||||
@@ -713,8 +713,41 @@ func TestResolvedMetadata(t *testing.T) {
|
||||
if metadata.PromptID != "weather.daily_generated_text" {
|
||||
t.Fatalf("PromptID = %q, want weather.daily_generated_text", metadata.PromptID)
|
||||
}
|
||||
if !strings.Contains(metadata.RunID, "daily") {
|
||||
t.Fatalf("RunID = %q, want report id", metadata.RunID)
|
||||
if metadata.RunID != "20260529T100000.000000000Z_daily_2026-05-29" {
|
||||
t.Fatalf("RunID = %q, want dated Daily report id", metadata.RunID)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDailyRunIDIncludesValidDateDisambiguator(t *testing.T) {
|
||||
location := mustLoadLocation(t)
|
||||
now := mustParse("2026-05-29T05:00:00-05:00")
|
||||
first, err := Resolve(Daily, ResolveRequest{
|
||||
Now: now,
|
||||
Location: location,
|
||||
Date: mustParse("2026-05-31T12:00:00-05:00"),
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Resolve(first) error = %v", err)
|
||||
}
|
||||
second, err := Resolve(Daily, ResolveRequest{
|
||||
Now: now,
|
||||
Location: location,
|
||||
Date: mustParse("2026-06-01T12:00:00-05:00"),
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("Resolve(second) error = %v", err)
|
||||
}
|
||||
|
||||
firstRunID := first.Metadata().RunID
|
||||
secondRunID := second.Metadata().RunID
|
||||
if firstRunID == secondRunID {
|
||||
t.Fatalf("Daily RunIDs both = %q, want distinct valid-date suffixes", firstRunID)
|
||||
}
|
||||
if firstRunID != "20260529T100000.000000000Z_daily_2026-05-31" {
|
||||
t.Fatalf("first RunID = %q, want valid-date suffix", firstRunID)
|
||||
}
|
||||
if secondRunID != "20260529T100000.000000000Z_daily_2026-06-01" {
|
||||
t.Fatalf("second RunID = %q, want valid-date suffix", secondRunID)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -731,8 +764,8 @@ func TestHourlyMetadataRunIDIncludesReportID(t *testing.T) {
|
||||
if metadata.PromptID != "weather.hourly_generated_text" {
|
||||
t.Fatalf("PromptID = %q, want weather.hourly_generated_text", metadata.PromptID)
|
||||
}
|
||||
if !strings.Contains(metadata.RunID, "hourly") {
|
||||
t.Fatalf("RunID = %q, want report id", metadata.RunID)
|
||||
if metadata.RunID != "20260529T101500.000000000Z_hourly" {
|
||||
t.Fatalf("RunID = %q, want unchanged report id shape", metadata.RunID)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user