Add origin_app to APActivity — apps only process their own activities

Each app's EventProcessor now filters by origin_app so apps don't steal
each other's pending activities. emit_activity() and publish_activity()
auto-detect the app name from Quart's current_app.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
giles
2026-02-22 20:57:46 +00:00
parent b42f5d63db
commit 86ccfd25c5
6 changed files with 57 additions and 5 deletions

View File

@@ -28,9 +28,11 @@ class EventProcessor:
def __init__(
self,
*,
app_name: str | None = None,
poll_interval: float = 2.0,
batch_size: int = 10,
):
self._app_name = app_name
self._poll_interval = poll_interval
self._batch_size = batch_size
self._task: asyncio.Task | None = None
@@ -70,12 +72,15 @@ class EventProcessor:
"""Fetch and process a batch of pending activities. Returns count processed."""
processed = 0
async with get_session() as session:
filters = [
APActivity.process_state == "pending",
APActivity.process_attempts < APActivity.process_max_attempts,
]
if self._app_name:
filters.append(APActivity.origin_app == self._app_name)
stmt = (
select(APActivity)
.where(
APActivity.process_state == "pending",
APActivity.process_attempts < APActivity.process_max_attempts,
)
.where(*filters)
.order_by(APActivity.created_at)
.limit(self._batch_size)
.with_for_update(skip_locked=True)