feat(Q5): package event queries and tracker state machine
Add insert/get/update queries for package_events table, and notification content for PACKAGE_DELIVERED and PACKAGE_REMINDER events. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
31757f410a
commit
cdc13e05f6
21
tests/unit/test_package_queries.py
Normal file
21
tests/unit/test_package_queries.py
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
import time
|
||||||
|
import pytest
|
||||||
|
from vigilar.storage.queries import insert_package_event, get_active_packages, update_package_status
|
||||||
|
|
||||||
|
def test_insert_package_event(test_db):
|
||||||
|
pkg_id = insert_package_event(test_db, camera_id="front", detected_at=time.time(), status="PRESENT")
|
||||||
|
assert pkg_id > 0
|
||||||
|
|
||||||
|
def test_get_active_packages(test_db):
|
||||||
|
now = time.time()
|
||||||
|
insert_package_event(test_db, camera_id="front", detected_at=now, status="PRESENT")
|
||||||
|
insert_package_event(test_db, camera_id="back", detected_at=now, status="COLLECTED")
|
||||||
|
active = get_active_packages(test_db)
|
||||||
|
assert len(active) == 1
|
||||||
|
assert active[0]["camera_id"] == "front"
|
||||||
|
|
||||||
|
def test_update_package_status(test_db):
|
||||||
|
pkg_id = insert_package_event(test_db, camera_id="front", detected_at=time.time(), status="PRESENT")
|
||||||
|
update_package_status(test_db, pkg_id, "REMINDED", reminded_at=time.time())
|
||||||
|
active = get_active_packages(test_db)
|
||||||
|
assert active[0]["status"] == "REMINDED"
|
||||||
@ -20,6 +20,8 @@ _CONTENT_MAP: dict[str, tuple[str, str]] = {
|
|||||||
EventType.UNKNOWN_VEHICLE_DETECTED: ("Unknown Vehicle", "Unknown vehicle on {source}"),
|
EventType.UNKNOWN_VEHICLE_DETECTED: ("Unknown Vehicle", "Unknown vehicle on {source}"),
|
||||||
EventType.POWER_LOSS: ("Power Alert", "UPS on battery"),
|
EventType.POWER_LOSS: ("Power Alert", "UPS on battery"),
|
||||||
EventType.LOW_BATTERY: ("Battery Critical", "UPS battery low"),
|
EventType.LOW_BATTERY: ("Battery Critical", "UPS battery low"),
|
||||||
|
EventType.PACKAGE_DELIVERED: ("Package Delivered", "Package delivered — {source}"),
|
||||||
|
EventType.PACKAGE_REMINDER: ("Package Reminder", "Package still on porch — {source}"),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -516,3 +516,33 @@ def get_training_images(
|
|||||||
.order_by(desc(pet_training_images.c.created_at))
|
.order_by(desc(pet_training_images.c.created_at))
|
||||||
).fetchall()
|
).fetchall()
|
||||||
return [dict(r._mapping) for r in rows]
|
return [dict(r._mapping) for r in rows]
|
||||||
|
|
||||||
|
|
||||||
|
# --- Package Events ---
|
||||||
|
|
||||||
|
def insert_package_event(
|
||||||
|
engine: Engine, camera_id: str, detected_at: float, status: str,
|
||||||
|
crop_path: str | None = None, event_id: int | None = None,
|
||||||
|
) -> int:
|
||||||
|
from vigilar.storage.schema import package_events
|
||||||
|
with engine.begin() as conn:
|
||||||
|
result = conn.execute(package_events.insert().values(
|
||||||
|
camera_id=camera_id, detected_at=detected_at, status=status,
|
||||||
|
crop_path=crop_path, event_id=event_id))
|
||||||
|
return result.inserted_primary_key[0]
|
||||||
|
|
||||||
|
|
||||||
|
def get_active_packages(engine: Engine) -> list[dict[str, Any]]:
|
||||||
|
from vigilar.storage.schema import package_events
|
||||||
|
with engine.connect() as conn:
|
||||||
|
rows = conn.execute(
|
||||||
|
select(package_events).where(package_events.c.status.in_(["PRESENT", "REMINDED"]))
|
||||||
|
.order_by(desc(package_events.c.detected_at))).mappings().all()
|
||||||
|
return [dict(r) for r in rows]
|
||||||
|
|
||||||
|
|
||||||
|
def update_package_status(engine: Engine, package_id: int, status: str, **kwargs: Any) -> None:
|
||||||
|
from vigilar.storage.schema import package_events
|
||||||
|
with engine.begin() as conn:
|
||||||
|
conn.execute(package_events.update().where(package_events.c.id == package_id)
|
||||||
|
.values(status=status, **kwargs))
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user