Skip to content

Commit d0678a9

Browse files
ImTotemclaude
andcommitted
fix(graphql): applications query returns PagedApplications with filter
- Add ApplicationFilter + ApplicationFilterInput for pagination/filtering - applications query: list[ApplicationType] → PagedApplications - formId is now optional filter field (was required argument) - Supports status multi-select, pagination, sorting Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 90c8a79 commit d0678a9

File tree

3 files changed

+33
-9
lines changed

3 files changed

+33
-9
lines changed

src/bcsd_api/apply/resolvers.py

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,23 @@
22
from strawberry.types import Info
33

44
from bcsd_api.authz.check import require_fee_edit
5+
from bcsd_api.filter.applications import ApplicationFilter
6+
from bcsd_api.filter.base import apply_filter
57
from bcsd_api.graphql.context import GqlContext, require_user
8+
from bcsd_api.graphql.convert import to_filter
69

710
from . import service
8-
from .schema import AnswerRequest
9-
from .types import AnswerType, ApplicationType, SubmitInput
11+
from .schema import AnswerRequest, ApplicationResponse
12+
from .types import (
13+
AnswerType,
14+
ApplicationFilterInput,
15+
ApplicationType,
16+
PagedApplications,
17+
SubmitInput,
18+
)
1019

1120

12-
def _to_app_type(app) -> ApplicationType:
21+
def _to_app_type(app: ApplicationResponse) -> ApplicationType:
1322
data = app.model_dump()
1423
data["answers"] = [AnswerType(**a) for a in data["answers"]]
1524
return ApplicationType(**data)
@@ -28,13 +37,21 @@ def resolve_submit(info: Info[GqlContext, None], input: SubmitInput) -> Applicat
2837

2938

3039
def resolve_applications(
31-
info: Info[GqlContext, None], form_id: str,
32-
) -> list[ApplicationType]:
40+
info: Info[GqlContext, None],
41+
filter: ApplicationFilterInput | None = None,
42+
) -> PagedApplications:
3343
user = require_user(info.context)
3444
require_fee_edit(info.context.authz, user["sub"])
3545
ctx = info.context
36-
apps = service.list_applications(ctx.app_repo, ctx.ans_repo, form_id)
37-
return [_to_app_type(a) for a in apps]
46+
filt = to_filter(filter, ApplicationFilter) if filter else ApplicationFilter.model_validate({})
47+
rows = ctx.app_repo.find_all()
48+
apps = [service._with_answers(ctx.ans_repo, r) for r in rows]
49+
paged = apply_filter([a.model_dump() for a in apps], filt)
50+
items = [_to_app_type(ApplicationResponse(**r)) for r in paged.items]
51+
return PagedApplications(
52+
items=items, total=paged.total,
53+
page=paged.page, size=paged.size,
54+
)
3855

3956

4057
def resolve_application(
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from .base import BaseFilter
2+
3+
4+
class ApplicationFilter(BaseFilter):
5+
status: list[str] | str | None = None
6+
form_id: str | None = None
7+
member_id: str | None = None

src/bcsd_api/graphql/schema.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from strawberry.types import ExecutionContext
77

88
from bcsd_api.apply import resolvers as apply_resolvers
9-
from bcsd_api.apply.types import ApplicationType
9+
from bcsd_api.apply.types import ApplicationType, PagedApplications
1010
from bcsd_api.exception.base import AppException
1111
from bcsd_api.form import resolvers as form_resolvers
1212
from bcsd_api.form.types import FormType
@@ -60,7 +60,7 @@ def health(self) -> str:
6060
form: FormType = strawberry.field(resolver=form_resolvers.resolve_form)
6161
forms: list[FormType] = strawberry.field(resolver=form_resolvers.resolve_forms)
6262

63-
applications: list[ApplicationType] = strawberry.field(resolver=apply_resolvers.resolve_applications)
63+
applications: PagedApplications = strawberry.field(resolver=apply_resolvers.resolve_applications)
6464
application: ApplicationType = strawberry.field(resolver=apply_resolvers.resolve_application)
6565
my_applications: list[ApplicationType] = strawberry.field(resolver=apply_resolvers.resolve_my_applications)
6666

0 commit comments

Comments
 (0)