EPIC #1129 の C(Admin にクラス(学級)の検索とアーカイブ解除を追加) を担当する leaf。
背景
Admin Lambda が GROUPS_TABLE に触るのは infra/smalruby-admin/lambda/handler.ts:906-912 の 1 箇所だけで、しかも読み取り (TTL 失効データのスナップショット復元時に親クラスが完全に消えているかの確認)。liveGroup.Item が返る=生きているが archived のケースは何もしない。
結果、ClassroomGroups.status を active に戻せるのは先生用 UI の PATCH /classroom-groups/{groupId}(infra/smalruby-classroom/lambda/handler.ts:2474 付近)だけで、Admin も運用 CLI(bin/restore-classroom.ts = TTL 失効専用)もクラスのアーカイブ解除を持たない 。先生が UI 操作に到達できない問い合わせに運用者が対応できない。
やること
Admin API に クラス(ClassroomGroups)の検索・詳細・status 更新 を追加する。命名は refactor(admin): クラス(学級)と課題の用語辞典を作り、Admin の文言・識別子を全数監査して統一 #1131 の用語辞典に従い、既存の課題向けエンドポイント(/admin/classrooms)と明確に区別できるパスにする。
Admin SPA に「クラス」タブ(または既存タブ内の明確な切り替え)を追加し、アーカイブ⇄利用中の切り替えと、そのクラスに属する課題の一覧を表示する。
権限・監査ログ(audit(...))は既存の課題操作と同じ扱いにする。
破壊的操作なので確認ステップを踏む(既存の 2 段階確認パターンに合わせる)。
設計上の注意
単一ライターを壊さない : クラスの状態を書く経路が「先生 UI」と「Admin」の 2 つになる。どちらも同じ更新形(status + updatedAt)にし、restoredAt 等のスタンプ規約を揃える。
TTL を触るときは実行時点から再設定 する(過去の TTL のまま書くと即再削除される。docs/classroom/operations.md の既存規約)。
クラスをアーカイブ解除しても、中の課題の status は変えない (無関係な課題を勝手に復活させない)。
同名クラスが並ぶケースが実際に起きている(Google Classroom 連携での二重作成)。一覧ではクラス名だけで判断できないため、年度・人数・中の課題名・作成日時 を併記して区別できること。
前提
先行 leaf #1131 (用語辞典)・#1132 (親クラス状態の表示)の後に着手する。packages/admin/src/components/classrooms-view.jsx と infra/smalruby-admin/lambda/handler.ts を共有編集するため直列化が必要。
DoD
Part of #1129
EPIC #1129 の C(Admin にクラス(学級)の検索とアーカイブ解除を追加) を担当する leaf。
背景
Admin Lambda が
GROUPS_TABLEに触るのはinfra/smalruby-admin/lambda/handler.ts:906-912の 1 箇所だけで、しかも読み取り(TTL 失効データのスナップショット復元時に親クラスが完全に消えているかの確認)。liveGroup.Itemが返る=生きているがarchivedのケースは何もしない。結果、
ClassroomGroups.statusをactiveに戻せるのは先生用 UI のPATCH /classroom-groups/{groupId}(infra/smalruby-classroom/lambda/handler.ts:2474付近)だけで、Admin も運用 CLI(bin/restore-classroom.ts= TTL 失効専用)もクラスのアーカイブ解除を持たない。先生が UI 操作に到達できない問い合わせに運用者が対応できない。やること
ClassroomGroups)の検索・詳細・status更新を追加する。命名は refactor(admin): クラス(学級)と課題の用語辞典を作り、Admin の文言・識別子を全数監査して統一 #1131 の用語辞典に従い、既存の課題向けエンドポイント(/admin/classrooms)と明確に区別できるパスにする。audit(...))は既存の課題操作と同じ扱いにする。設計上の注意
status+updatedAt)にし、restoredAt等のスタンプ規約を揃える。docs/classroom/operations.mdの既存規約)。statusは変えない(無関係な課題を勝手に復活させない)。前提
先行 leaf #1131(用語辞典)・#1132(親クラス状態の表示)の後に着手する。
packages/admin/src/components/classrooms-view.jsxとinfra/smalruby-admin/lambda/handler.tsを共有編集するため直列化が必要。DoD
docs/admin/README.md(および必要ならdocs/classroom/*)を更新docs/admin/screenshots/を更新(docs/_screenshot-guidelines.mdに従う)Part of #1129