@@ -17,7 +17,7 @@ class ZootechServiceError(DomainError):
|
||||
def _emit_change(enterprise_id: str, table: str, record_id: str, payload: dict, version: int, content_hash: str) -> None:
|
||||
event = ChangeEventIn(
|
||||
event_id=str(uuid4()),
|
||||
seq=None,
|
||||
seq=0,
|
||||
domain="global",
|
||||
table=table,
|
||||
record_id=record_id,
|
||||
@@ -61,6 +61,29 @@ def patch_component(enterprise_id: str, record_id: str, body: dict) -> dict:
|
||||
return upsert_component(enterprise_id, record_id, merged)
|
||||
|
||||
|
||||
def delete_component(enterprise_id: str, record_id: str) -> None:
|
||||
existing = load_catalog_row(enterprise_id, "component", record_id)
|
||||
if not existing:
|
||||
raise ZootechServiceError("NOT_FOUND")
|
||||
version = int(existing.get("version") or 0) + 1
|
||||
payload = {**existing, "version": version, "is_deleted": True}
|
||||
content_hash = compute_content_hash(payload)
|
||||
event = ChangeEventIn(
|
||||
event_id=str(uuid4()),
|
||||
seq=0,
|
||||
domain="global",
|
||||
table="component",
|
||||
record_id=record_id,
|
||||
action="delete",
|
||||
version=version,
|
||||
content_hash=content_hash,
|
||||
payload=payload,
|
||||
emitted_at=datetime.now(UTC),
|
||||
origin_site_id=SyncEngine.ORCHESTRATOR_SITE_ID,
|
||||
)
|
||||
SyncEngine(enterprise_id, SyncEngine.ORCHESTRATOR_SITE_ID).process_push([event], origin="orchestrator")
|
||||
|
||||
|
||||
def upsert_recipe(enterprise_id: str, record_id: str | None, body: dict) -> dict:
|
||||
rid = record_id or str(uuid4())
|
||||
existing = load_catalog_row(enterprise_id, "recipe", rid)
|
||||
@@ -82,3 +105,99 @@ def upsert_recipe(enterprise_id: str, record_id: str | None, body: dict) -> dict
|
||||
payload["content_hash"] = content_hash
|
||||
_emit_change(enterprise_id, "recipe", rid, payload, version, content_hash)
|
||||
return load_catalog_row(enterprise_id, "recipe", rid) or payload
|
||||
|
||||
|
||||
def upsert_feed_dispenser(enterprise_id: str, record_id: str | None, body: dict) -> dict:
|
||||
rid = record_id or str(uuid4())
|
||||
existing = load_catalog_row(enterprise_id, "feed_dispenser", rid)
|
||||
version = int(body.get("version") or (existing or {}).get("version") or 0) + 1 if existing else 1
|
||||
payload = {
|
||||
"id": rid,
|
||||
"name": body.get("name", (existing or {}).get("name", "")),
|
||||
"farm": body.get("farm", (existing or {}).get("farm", "")),
|
||||
"operator": body.get("operator", (existing or {}).get("operator", "")),
|
||||
"type": body.get("type", (existing or {}).get("type", "dispenser")),
|
||||
"version": version,
|
||||
}
|
||||
content_hash = compute_content_hash(payload)
|
||||
payload["content_hash"] = content_hash
|
||||
_emit_change(enterprise_id, "feed_dispenser", rid, payload, version, content_hash)
|
||||
return load_catalog_row(enterprise_id, "feed_dispenser", rid) or payload
|
||||
|
||||
|
||||
def patch_feed_dispenser(enterprise_id: str, record_id: str, body: dict) -> dict:
|
||||
existing = load_catalog_row(enterprise_id, "feed_dispenser", record_id)
|
||||
if not existing:
|
||||
raise ZootechServiceError("NOT_FOUND")
|
||||
merged = {**existing, **body}
|
||||
return upsert_feed_dispenser(enterprise_id, record_id, merged)
|
||||
|
||||
|
||||
def delete_feed_dispenser(enterprise_id: str, record_id: str) -> None:
|
||||
existing = load_catalog_row(enterprise_id, "feed_dispenser", record_id)
|
||||
if not existing:
|
||||
raise ZootechServiceError("NOT_FOUND")
|
||||
version = int(existing.get("version") or 0) + 1
|
||||
payload = {**existing, "version": version, "is_deleted": True}
|
||||
content_hash = compute_content_hash(payload)
|
||||
event = ChangeEventIn(
|
||||
event_id=str(uuid4()),
|
||||
seq=0,
|
||||
domain="global",
|
||||
table="feed_dispenser",
|
||||
record_id=record_id,
|
||||
action="delete",
|
||||
version=version,
|
||||
content_hash=content_hash,
|
||||
payload=payload,
|
||||
emitted_at=datetime.now(UTC),
|
||||
origin_site_id=SyncEngine.ORCHESTRATOR_SITE_ID,
|
||||
)
|
||||
SyncEngine(enterprise_id, SyncEngine.ORCHESTRATOR_SITE_ID).process_push([event], origin="orchestrator")
|
||||
|
||||
|
||||
def upsert_feeding_period(enterprise_id: str, record_id: str | None, body: dict) -> dict:
|
||||
rid = record_id or str(uuid4())
|
||||
existing = load_catalog_row(enterprise_id, "feeding_period", rid)
|
||||
version = int(body.get("version") or (existing or {}).get("version") or 0) + 1 if existing else 1
|
||||
payload = {
|
||||
"id": rid,
|
||||
"name": body.get("name", (existing or {}).get("name", "")),
|
||||
"dispenser_id": body.get("dispenser_id", (existing or {}).get("dispenser_id")),
|
||||
"version": version,
|
||||
}
|
||||
content_hash = compute_content_hash(payload)
|
||||
payload["content_hash"] = content_hash
|
||||
_emit_change(enterprise_id, "feeding_period", rid, payload, version, content_hash)
|
||||
return load_catalog_row(enterprise_id, "feeding_period", rid) or payload
|
||||
|
||||
|
||||
def patch_feeding_period(enterprise_id: str, record_id: str, body: dict) -> dict:
|
||||
existing = load_catalog_row(enterprise_id, "feeding_period", record_id)
|
||||
if not existing:
|
||||
raise ZootechServiceError("NOT_FOUND")
|
||||
merged = {**existing, **body}
|
||||
return upsert_feeding_period(enterprise_id, record_id, merged)
|
||||
|
||||
|
||||
def delete_feeding_period(enterprise_id: str, record_id: str) -> None:
|
||||
existing = load_catalog_row(enterprise_id, "feeding_period", record_id)
|
||||
if not existing:
|
||||
raise ZootechServiceError("NOT_FOUND")
|
||||
version = int(existing.get("version") or 0) + 1
|
||||
payload = {**existing, "version": version, "is_deleted": True}
|
||||
content_hash = compute_content_hash(payload)
|
||||
event = ChangeEventIn(
|
||||
event_id=str(uuid4()),
|
||||
seq=0,
|
||||
domain="global",
|
||||
table="feeding_period",
|
||||
record_id=record_id,
|
||||
action="delete",
|
||||
version=version,
|
||||
content_hash=content_hash,
|
||||
payload=payload,
|
||||
emitted_at=datetime.now(UTC),
|
||||
origin_site_id=SyncEngine.ORCHESTRATOR_SITE_ID,
|
||||
)
|
||||
SyncEngine(enterprise_id, SyncEngine.ORCHESTRATOR_SITE_ID).process_push([event], origin="orchestrator")
|
||||
|
||||
Reference in New Issue
Block a user