Skip to content

履修登録画面用の集約エンドポイント RegistrableSubjectsV1 を追加 - #70

Open
zakiPoteto wants to merge 2 commits into
mainfrom
feature/registrable-subjects-endpoint
Open

zakiPoteto wants to merge 2 commits into
mainfrom
feature/registrable-subjects-endpoint

Conversation

@zakiPoteto

@zakiPoteto zakiPoteto commented Sep 9, 2026

Copy link
Copy Markdown

背景

PR #67 のレビューで @kantacky さんから、科目登録・検索画面がアプリ側で複数エンドポイント(/v1/subjects + /v1/courseRegistrations + /v1/timetableItems)を叩いてクライアント側でaggregateしている実装への指摘があった(コメント)。

その対応として、汎用モデル(SubjectSummary)に機能を継ぎ足すのではなく、用途専用のエンドポイントを新設する方針で実装した。

やったこと

  • academic-api / app-bff-api 両方に RegistrableSubject { subject; isRegistered; slots } モデルを追加
  • GET /v1/registrableSubjects を新設。/v1/subjects と同等のフィルタ(q, grades, courses, classes, classifications, year, semesters, requirementTypes, culturalSubjectCategories)に加えて、各科目の履修登録済みかどうか(isRegistered)と時間割上のコマ(slots)を返す
  • 科目検索・登録画面は未ログインでも使える既存仕様のため、この専用エンドポイントも未ログインで呼び出せるようにした
    • academic-api側のuserIdは必須→任意に変更。指定しない場合isRegisteredは全科目false
    • app-bff-api側はBearer認証を必須にせず、FirebaseAppCheckAuthのみで呼び出せるようにした(BearerトークンがあればisRegisteredをそのユーザー基準で計算)
    • slotsは認証状態に関わらず常に計算する(timetable_itemsはユーザーに紐づかないデータのため)

Test plan

  • tsp compile . が成功することを確認
  • server側の実装は別PRで対応

関連

  • Depends on/related to SubjectSummaryにrequirementsフィールドを追加 #67 (このPRのRegistrableSubject.subjectSubject/SubjectSummaryをそのまま使うため、#67がマージされればrequirementsも自動的に含まれる)
  • kantackyさんへの返信で、この実装アプローチで意図に合っているか確認予定

zakiPoteto and others added 2 commits September 8, 2026 14:41
科目検索・登録済み判定・時間割の3エンドポイントをアプリ側でクライアント集約している既存実装(search_subject_reducer.dart)の代替として、academic-api/app-bff-apiにRegistrableSubjectsV1.listを追加する。PersonalCalendarItemsV1と同じパターン(server側で複数リポジトリを集約し1回のレスポンスで返す)を踏襲。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01ESKebxSqfazc45RBCJCGVh
科目検索画面は未ログインでも使える既存仕様のため、この専用エンドポイントも
それを維持する。userIdを必須パラメータから任意に変更し、Bearer認証も必須で
はなくす。userId/Bearerが無い場合はisRegisteredを全科目falseで返す
(slotsは認証状態によらず常に計算)。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018TpGeornAqcXew3fPTb6A6
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant