feat(discovery): add domain types (Bucket, DiscoveredMarket, Pass0*)

This commit is contained in:
2026-04-18 07:23:25 +02:00
parent a9462d1695
commit f7e4bab2c3

View File

@@ -0,0 +1,86 @@
// backend/internal/domain/discovery/model.go
package discovery
import (
"time"
"github.com/google/uuid"
)
// Bucket is a scheduler row: one (land, region, year_month) tuple.
type Bucket struct {
ID uuid.UUID
Land string
Region string
YearMonth string // 'YYYY-MM'
LastQueriedAt *time.Time
LastError string
CreatedAt time.Time
}
// DiscoveredMarket is a queue entry awaiting admin review.
type DiscoveredMarket struct {
ID uuid.UUID
BucketID uuid.UUID
MarktName string
Stadt string
Bundesland string
Land string
StartDatum *time.Time
EndDatum *time.Time
Website string
Quellen []string
Extraktion string
Hinweis string
NameNormalized string
MatchedSeriesID *uuid.UUID
Status string // 'pending' | 'accepted' | 'rejected'
DiscoveredAt time.Time
ReviewedAt *time.Time
ReviewedBy *uuid.UUID
CreatedEditionID *uuid.UUID
}
// RejectedDiscovery stores a sticky rejection scoped to (normalized_name, city, year).
type RejectedDiscovery struct {
ID uuid.UUID
NameNormalized string
Stadt string
Year int
RejectedAt time.Time
RejectedBy *uuid.UUID
Reason string
}
// Pass0Response is the parsed shape of the Mistral Pass 0 agent reply.
type Pass0Response struct {
Bucket Pass0Bucket `json:"bucket"`
RechercheDatum string `json:"recherche_datum"`
QuellenGesamt []string `json:"quellen_gesamt"`
Maerkte []Pass0Market `json:"maerkte"`
}
type Pass0Bucket struct {
Land string `json:"land"`
Region string `json:"region"`
JahrMonat string `json:"jahr_monat"`
}
type Pass0Market struct {
MarktName string `json:"markt_name"`
Stadt string `json:"stadt"`
Bundesland string `json:"bundesland"`
StartDatum string `json:"start_datum"` // 'YYYY-MM-DD' or ""
EndDatum string `json:"end_datum"`
Website string `json:"website"`
Quellen []string `json:"quellen"`
Extraktion string `json:"extraktion"`
Hinweis string `json:"hinweis"`
}
// Status constants for discovered_markets.
const (
StatusPending = "pending"
StatusAccepted = "accepted"
StatusRejected = "rejected"
)