package app import ( "fmt" "time" "gitea.maximumdirect.net/eric/weatherreporter/internal/config" "gitea.maximumdirect.net/eric/weatherreporter/internal/timeutil" ) const runIDTimestampLayout = "20060102T150405.000000000Z" type batchNotificationIdentity struct { PipelineID string BundleID string IdempotencyKey string } func batchRunID(startedAt time.Time, batch BatchKind) string { return startedAt.UTC().Format(runIDTimestampLayout) + "_" + string(batch) } func renderBatchNotificationIdentity(cfg config.Config, batch BatchKind, runID string, startedAt time.Time) (batchNotificationIdentity, error) { values, err := batchNotificationTemplateValues(cfg, batch, runID, startedAt) if err != nil { return batchNotificationIdentity{}, err } bundleID, err := config.RenderDistributorBatchBundleID(cfg.Notify.Distributor.Batch.BundleIDTemplate, values) if err != nil { return batchNotificationIdentity{}, err } values.BundleID = bundleID pipelineID, err := config.RenderDistributorBatchPipelineID(cfg.Notify.Distributor.Batch.PipelineIDTemplate, values) if err != nil { return batchNotificationIdentity{}, err } idempotencyKey, err := config.RenderDistributorBatchIdempotencyKey(cfg.Notify.Distributor.Batch.IdempotencyKeyTemplate, values) if err != nil { return batchNotificationIdentity{}, err } return batchNotificationIdentity{ PipelineID: pipelineID, BundleID: bundleID, IdempotencyKey: idempotencyKey, }, nil } func batchNotificationTemplateValues(cfg config.Config, batch BatchKind, runID string, startedAt time.Time) (config.DistributorBatchTemplateValues, error) { location, err := timeutil.LoadLocation(cfg.WeatherAPI.Timezone) if err != nil { return config.DistributorBatchTemplateValues{}, fmt.Errorf("load batch notification timezone: %w", err) } return config.DistributorBatchTemplateValues{ LocationID: cfg.Location.ID, Batch: string(batch), BatchRunID: runID, BatchStartedDate: startedAt.In(location).Format(timeutil.DateLayout), }, nil }