package recognition import ( "time" "github.com/food-ai/backend/internal/adapters/ai" ) // Kafka topic names for product recognition. const ( ProductTopicPaid = "ai.products.paid" ProductTopicFree = "ai.products.free" ) // ProductImagePayload is a single image stored in the product_recognition_jobs.images JSONB column. type ProductImagePayload struct { ImageBase64 string `json:"image_base64"` MimeType string `json:"mime_type"` } // ProductJobResultItem is an enriched product item stored in the result JSONB. type ProductJobResultItem struct { Name string `json:"name"` Quantity float64 `json:"quantity"` Unit string `json:"unit"` Category string `json:"category"` Confidence float64 `json:"confidence"` QuantityConfidence float64 `json:"quantity_confidence"` MappingID *string `json:"mapping_id,omitempty"` StorageDays int `json:"storage_days"` } // ProductJobResult is the JSONB payload stored in product_recognition_jobs.result. type ProductJobResult struct { JobType string `json:"job_type"` Items []ProductJobResultItem `json:"items"` Unrecognized []ai.UnrecognizedItem `json:"unrecognized,omitempty"` } // ProductJob represents an async product/receipt recognition task. type ProductJob struct { ID string UserID string UserPlan string JobType string // "receipt" | "products" Images []ProductImagePayload Lang string Status string Result *ProductJobResult Error *string CreatedAt time.Time StartedAt *time.Time CompletedAt *time.Time } // ProductJobSummary is a lightweight record for list endpoints (omits image payloads). type ProductJobSummary struct { ID string `json:"id"` JobType string `json:"job_type"` Status string `json:"status"` Result *ProductJobResult `json:"result,omitempty"` Error *string `json:"error,omitempty"` CreatedAt time.Time `json:"created_at"` }