from __future__ import annotations from typing import Any from uuid import UUID, uuid4 from sqlalchemy import select from sqlalchemy.orm import Session from app.persistence.discovery_models import CriterionDefinitionRecord def get_definition_by_key(session: Session, key: str) -> CriterionDefinitionRecord | None: return session.scalars(select(CriterionDefinitionRecord).where(CriterionDefinitionRecord.key == key)).first() def get_definition(session: Session, definition_id: UUID) -> CriterionDefinitionRecord | None: return session.get(CriterionDefinitionRecord, definition_id) def upsert_definition(session: Session, payload: dict[str, Any]) -> CriterionDefinitionRecord: key = str(payload["key"]) existing = get_definition_by_key(session, key) if existing is not None: if payload.get("label"): existing.label = str(payload["label"]) if payload.get("scoring_attribute_key"): existing.scoring_attribute_key = str(payload["scoring_attribute_key"]) if payload.get("product_category_id"): existing.product_category_id = str(payload["product_category_id"]) if payload.get("origin"): existing.origin = str(payload["origin"]) if payload.get("source"): existing.source = str(payload["source"]) return existing row = CriterionDefinitionRecord( id=payload.get("id") or uuid4(), key=key, origin=str(payload.get("origin") or "SOURCE"), source=payload.get("source"), product_category_id=payload.get("product_category_id"), label=str(payload.get("label") or key), value_type=str(payload["value_type"]), unit=payload.get("unit"), semantic=payload.get("semantic"), category=payload.get("category") or payload.get("product_category_id"), description=payload.get("description"), scoring_attribute_key=payload.get("scoring_attribute_key"), ) session.add(row) session.flush() return row