feat: make repository reads alias-aware
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 1s
Build and Publish Multi-Context Image / build-and-push (push) Successful in 25s

Assistant: codex
Assistant-Model: gpt-5.6-sol
Assistant-Session: 01a049a4-ee9f-78e1-9d66-2cb0f9bea3e3
This commit is contained in:
tegwick 2026-08-29 10:47:51 +02:00
parent 639b9aed08
commit 2e2ae1e5d0
19 changed files with 982 additions and 94 deletions

View file

@ -13,6 +13,7 @@ from api.models.task import Task
from api.models.token_event import TokenEvent
from api.models.workplan import Workplan
from api.services.legacy_compat import meter_legacy_query_param
from api.services.repository_aliases import resolve_repository_slug
from api.schemas.token_event import (
RepoTokenSummary,
TokenAggregateRow,
@ -288,6 +289,7 @@ async def get_token_summary(
@router.get("/by-repo/", response_model=list[RepoTokenSummary])
async def get_tokens_by_repo(
repo_slug: str | None = None,
measurement_kind: str | None = None,
source_provider: str | None = None,
since: datetime | None = None,
@ -304,6 +306,12 @@ async def get_tokens_by_repo(
Only events that resolve to a repo are included.
"""
requested_repo_id = None
if repo_slug:
requested_repo_id = (
await resolve_repository_slug(session, repo_slug)
).repo.id
# Fetch all events, workstreams, repos in three queries (avoids N+1)
events_result = await session.execute(
_filter_query(
@ -341,6 +349,8 @@ async def get_tokens_by_repo(
rid = resolve_repo_id(e)
if not rid or rid not in repo_map:
continue
if requested_repo_id is not None and rid != requested_repo_id:
continue
if rid not in groups:
groups[rid] = {
"repo_id": rid,