refactor: simplify mqtt pipeline state and remove event table
All checks were successful
Deploy to Production / deploy (push) Successful in 4m55s

This commit is contained in:
魏风
2026-03-19 22:08:16 +08:00
parent 8717b9c07b
commit e8846f4831
14 changed files with 269 additions and 118 deletions

View File

@@ -9,7 +9,6 @@ from sqlmodel import Session, col, select
from app.models import (
TerminalDeviceState,
TerminalMessageRaw,
TerminalObservationEvent,
get_datetime_utc,
)
@@ -34,7 +33,6 @@ def insert_raw_message(
payload_sha256=hashlib.sha256(payload).hexdigest(),
qos=qos,
retain=retain,
parse_status="pending",
created_at=ts,
)
session.add(row)
@@ -48,7 +46,8 @@ def fetch_pending_rows_for_update(
) -> list[TerminalMessageRaw]:
statement = (
select(TerminalMessageRaw)
.where(TerminalMessageRaw.parse_status == "pending")
.where(col(TerminalMessageRaw.parsed_at).is_(None))
.where(col(TerminalMessageRaw.parse_error).is_(None))
.order_by(col(TerminalMessageRaw.received_at))
.limit(batch_size)
)
@@ -61,17 +60,9 @@ def fetch_pending_rows_for_update(
return list(rows)
def mark_processing(*, session: Session, row: TerminalMessageRaw) -> None:
row.parse_status = "processing"
row.parse_attempts += 1
row.parse_error = None
session.add(row)
def mark_succeeded(*, session: Session, row: TerminalMessageRaw) -> None:
row.parse_status = "succeeded"
row.parsed_at = get_datetime_utc()
row.parse_error = None
row.next_retry_at = None
session.add(row)
@@ -80,15 +71,13 @@ def mark_failed(
session: Session,
row: TerminalMessageRaw,
parse_error: str,
next_retry_at: datetime | None,
) -> None:
row.parse_status = "failed"
row.parsed_at = get_datetime_utc()
row.parse_error = parse_error[:1024]
row.next_retry_at = next_retry_at
session.add(row)
def write_events_and_update_state(
def update_device_state_from_events(
*,
session: Session,
row: TerminalMessageRaw,
@@ -110,14 +99,6 @@ def write_events_and_update_state(
for event in events:
payload = event.get("payload", {})
event_type = str(event.get("event_type", "unknown"))
db_event = TerminalObservationEvent(
raw_id=row.id,
device_id=row.device_id,
event_time=row.received_at,
event_type=event_type,
payload_json=payload if isinstance(payload, dict) else {"value": payload},
)
session.add(db_event)
if event_type == "nmea_gga":
state.lat = payload.get("lat")