From 381ed3c37035300aa3c5a17e2ac8bed810c7e080 Mon Sep 17 00:00:00 2001 From: Roddy GitHub Date: Fri, 24 Jul 2026 16:13:18 +0200 Subject: [PATCH 1/4] feat(api): auto-commit get_sessions on success, rollback on exception Signed-off-by: Roddy GitHub --- apps/api/src/gw2analytics_api/database.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/api/src/gw2analytics_api/database.py b/apps/api/src/gw2analytics_api/database.py index 75321ebe..c6bfe1e6 100644 --- a/apps/api/src/gw2analytics_api/database.py +++ b/apps/api/src/gw2analytics_api/database.py @@ -115,5 +115,9 @@ def get_session() -> Iterator[Session]: session = get_sessionmaker()() try: yield session + session.commit() + except BaseException: + session.rollback() + raise finally: session.close() From 77a3687668f996e5781149e451f71efe7fcc2b89 Mon Sep 17 00:00:00 2001 From: Roddy GitHub Date: Fri, 24 Jul 2026 16:13:18 +0200 Subject: [PATCH 2/4] feat(api): preload agents + skills on GET /fights (closes list N+1) Signed-off-by: Roddy GitHub --- apps/api/src/gw2analytics_api/routes/fights/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/api/src/gw2analytics_api/routes/fights/__init__.py b/apps/api/src/gw2analytics_api/routes/fights/__init__.py index 52bd413f..658e9fea 100644 --- a/apps/api/src/gw2analytics_api/routes/fights/__init__.py +++ b/apps/api/src/gw2analytics_api/routes/fights/__init__.py @@ -200,7 +200,11 @@ def list_fights( """ rows = ( db.execute( - select(OrmFight).order_by(OrmFight.started_at.desc()).limit(limit).offset(offset), + select(OrmFight) + .options(selectinload(OrmFight.agents), selectinload(OrmFight.skills)) + .order_by(OrmFight.started_at.desc()) + .limit(limit) + .offset(offset), ) .scalars() .all() From 0b64c33bfdc4a498dea6b7afda5ad3b29d09790d Mon Sep 17 00:00:00 2001 From: Roddy GitHub Date: Fri, 24 Jul 2026 16:13:18 +0200 Subject: [PATCH 3/4] feat(api): add limit/offset pagination to GET /webhooks Signed-off-by: Roddy GitHub --- apps/api/src/gw2analytics_api/routes/webhooks.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/apps/api/src/gw2analytics_api/routes/webhooks.py b/apps/api/src/gw2analytics_api/routes/webhooks.py index f02696e2..56091b7b 100644 --- a/apps/api/src/gw2analytics_api/routes/webhooks.py +++ b/apps/api/src/gw2analytics_api/routes/webhooks.py @@ -284,12 +284,17 @@ def create_webhook( @limiter.limit("30/minute") def list_webhooks( request: Request, # noqa: ARG001 + limit: int = Query(100, ge=1, le=1000), + offset: int = Query(0, ge=0), db: Session = Depends(get_session), # noqa: B008 ) -> list[WebhookSubscriptionOut]: """List active (non-revoked) webhook subscriptions. Secrets never returned.""" rows = ( db.execute( - select(OrmWebhookSubscription).where(OrmWebhookSubscription.revoked_at.is_(None)) + select(OrmWebhookSubscription) + .where(OrmWebhookSubscription.revoked_at.is_(None)) + .limit(limit) + .offset(offset), ) .scalars() .all() From 6b3c98cbdcf2d0406b19da6c326efd02325ea2fb Mon Sep 17 00:00:00 2001 From: Roddy GitHub Date: Fri, 24 Jul 2026 16:13:18 +0200 Subject: [PATCH 4/4] chore(web): regen OpenAPI schema.d.ts for webhooks pagination Signed-off-by: Roddy GitHub --- web/src/lib/api/schema.d.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/web/src/lib/api/schema.d.ts b/web/src/lib/api/schema.d.ts index 0b4e38dc..3e423445 100644 --- a/web/src/lib/api/schema.d.ts +++ b/web/src/lib/api/schema.d.ts @@ -2897,7 +2897,10 @@ export interface operations { }; list_webhooks_api_v1_webhooks_get: { parameters: { - query?: never; + query?: { + limit?: number; + offset?: number; + }; header?: never; path?: never; cookie?: never; @@ -2913,6 +2916,15 @@ export interface operations { "application/json": components["schemas"]["WebhookSubscriptionOut"][]; }; }; + /** @description Validation Error */ + 422: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["HTTPValidationError"]; + }; + }; }; }; create_webhook_api_v1_webhooks_post: {