|
| 1 | +from strawberry.types import Info |
| 2 | + |
| 3 | +from bcsd_api.filter.members import MemberFilter |
| 4 | +from bcsd_api.graphql.context import GqlContext, require_user |
| 5 | + |
| 6 | +from . import service |
| 7 | +from .schema import MemberDetail, MemberResponse |
| 8 | +from .types import ( |
| 9 | + FiltersType, |
| 10 | + MeType, |
| 11 | + MemberDetailType, |
| 12 | + MemberFilterInput, |
| 13 | + MemberType, |
| 14 | + PagedMembers, |
| 15 | +) |
| 16 | + |
| 17 | + |
| 18 | +def _to_filter(inp: MemberFilterInput) -> MemberFilter: |
| 19 | + return MemberFilter( |
| 20 | + page=inp.page, size=inp.size, |
| 21 | + sort_by=inp.sort_by, sort_order=inp.sort_order, |
| 22 | + status=inp.status, track=inp.track, |
| 23 | + team=inp.team, payment_status=inp.payment_status, |
| 24 | + name=inp.name, |
| 25 | + ) |
| 26 | + |
| 27 | + |
| 28 | +def _to_member(m: MemberResponse) -> MemberType: |
| 29 | + return MemberType( |
| 30 | + id=m.id, name=m.name, email=m.email, |
| 31 | + status=m.status, track=m.track, |
| 32 | + team=m.team, payment_status=m.payment_status, |
| 33 | + ) |
| 34 | + |
| 35 | + |
| 36 | +def _to_detail(m: MemberDetail) -> MemberDetailType: |
| 37 | + return MemberDetailType( |
| 38 | + id=m.id, name=m.name, email=m.email, |
| 39 | + status=m.status, track=m.track, |
| 40 | + team=m.team, payment_status=m.payment_status, |
| 41 | + department=m.department, student_id=m.student_id, |
| 42 | + school_email=m.school_email, phone=m.phone, |
| 43 | + join_date=m.join_date, last_updated=m.last_updated, |
| 44 | + ) |
| 45 | + |
| 46 | + |
| 47 | +def resolve_members( |
| 48 | + info: Info[GqlContext, None], |
| 49 | + filter: MemberFilterInput | None = None, |
| 50 | +) -> PagedMembers: |
| 51 | + ctx = info.context |
| 52 | + require_user(ctx) |
| 53 | + filt = _to_filter(filter) if filter else MemberFilter() |
| 54 | + paged = service.list_members(ctx.member_repo, filt) |
| 55 | + items = [_to_member(m) for m in paged.items] |
| 56 | + return PagedMembers( |
| 57 | + items=items, total=paged.total, |
| 58 | + page=paged.page, size=paged.size, |
| 59 | + ) |
| 60 | + |
| 61 | + |
| 62 | +def resolve_member(info: Info[GqlContext, None], id: str) -> MemberDetailType: |
| 63 | + require_user(info.context) |
| 64 | + m = service.get_member(info.context.member_repo, id) |
| 65 | + return _to_detail(m) |
| 66 | + |
| 67 | + |
| 68 | +def resolve_filters(info: Info[GqlContext, None]) -> FiltersType: |
| 69 | + f = service.get_filters(info.context.conn) |
| 70 | + return FiltersType( |
| 71 | + tracks=f.tracks, |
| 72 | + statuses=f.statuses, |
| 73 | + payment_statuses=f.payment_statuses, |
| 74 | + ) |
| 75 | + |
| 76 | + |
| 77 | +def resolve_tracks(info: Info[GqlContext, None]) -> list[str]: |
| 78 | + from sqlalchemy import select |
| 79 | + |
| 80 | + from bcsd_api.tables import tracks |
| 81 | + |
| 82 | + rows = info.context.conn.execute(select(tracks.c.name)) |
| 83 | + return [row.name for row in rows] |
| 84 | + |
| 85 | + |
| 86 | +def resolve_me(info: Info[GqlContext, None]) -> MeType: |
| 87 | + user = require_user(info.context) |
| 88 | + return MeType(id=user["sub"], email=user["email"]) |
0 commit comments