Skip to content

Commit 1983e42

Browse files
ImTotemclaude
andcommitted
feat(member): add distinct filter values for all searchable fields
FiltersType now includes departments, names, emails, studentIds, phones — each returns SELECT DISTINCT from members table. Empty values excluded from results. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent f3cf982 commit 1983e42

3 files changed

Lines changed: 21 additions & 1 deletion

File tree

src/bcsd_api/member/schema.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,8 @@ class MemberDetail(MemberResponse):
2727
class FiltersResponse(BaseModel):
2828
tracks: list[str]
2929
statuses: list[str]
30+
departments: list[str]
31+
names: list[str]
32+
emails: list[str]
33+
student_ids: list[str]
34+
phones: list[str]

src/bcsd_api/member/service.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from bcsd_api.exception import NotFound
44
from bcsd_api.filter.base import PagedResponse, apply_filter
55
from bcsd_api.filter.members import MemberFilter
6-
from bcsd_api.tables import statuses, tracks
6+
from bcsd_api.tables import members, statuses, tracks
77

88
from .pg_repository import PgMemberRepository
99
from .schema import FiltersResponse, MemberDetail, MemberResponse
@@ -14,6 +14,11 @@ def _names(conn: Connection, table) -> list[str]:
1414
return [row.name for row in rows]
1515

1616

17+
def _distinct(conn: Connection, column) -> list[str]:
18+
rows = conn.execute(select(column).distinct().order_by(column))
19+
return [row[0] for row in rows if row[0]]
20+
21+
1722
def list_members(
1823
repo: PgMemberRepository, filt: MemberFilter,
1924
) -> PagedResponse[MemberResponse]:
@@ -36,4 +41,9 @@ def get_filters(conn: Connection) -> FiltersResponse:
3641
return FiltersResponse(
3742
tracks=_names(conn, tracks),
3843
statuses=_names(conn, statuses),
44+
departments=_distinct(conn, members.c.department),
45+
names=_distinct(conn, members.c.name),
46+
emails=_distinct(conn, members.c.email),
47+
student_ids=_distinct(conn, members.c.student_id),
48+
phones=_distinct(conn, members.c.phone),
3949
)

src/bcsd_api/member/types.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ class MemberDetailType(MemberType):
2727
class FiltersType:
2828
tracks: list[str]
2929
statuses: list[str]
30+
departments: list[str]
31+
names: list[str]
32+
emails: list[str]
33+
student_ids: list[str]
34+
phones: list[str]
3035

3136

3237
@strawberry.type

0 commit comments

Comments
 (0)