Summary
教師が提出された全作品を一括でダウンロードできる機能。座席番号ごとにフォルダ分けされた ZIP ファイルとして取得する。
Parent: #442
背景
PR #445, #446 で作品提出の基本機能が実装済み。教師は個別に「スモウルビーで開く」で作品を確認できるが、全員分の作品を一度にダウンロードする手段がない。授業後に全作品をまとめて評価したい場合や、バックアップとして保存したい場合に必要。
技術的な課題
Lambda タイムアウト
- 現在の Lambda タイムアウトは 30 秒(API Gateway HTTP API のデフォルト)
- 35 人 × 1MB の .sb3 を読み取り → ZIP 化すると、S3 からの読み込みだけで数十秒かかる可能性
- サムネイル + スクリーンショットも含めると 35 × (1MB + 数百KB × 3) = 50MB 以上
アプローチ案
案 A: Lambda 内で ZIP 生成 → S3 に書き出し → presigned URL 返却
- Lambda のメモリを増やし(512MB〜1GB)、タイムアウトを延長(API Gateway の 30 秒制約あり)
- S3 から全ファイルを読み込み、archiver 等で ZIP 化し、一時 S3 キーに書き出し
- presigned GET URL を返す
- 問題: API Gateway HTTP API のタイムアウト 30 秒を超える可能性
案 B: 非同期(Step Functions or SQS + Lambda)
- API で「エクスポートリクエスト」を作成 → バックグラウンドで ZIP 生成
- 教師はポーリングまたは再度ボタンクリックで完了を確認
- 複雑だが、大規模クラスにも対応可能
案 C: クライアントサイドで並列ダウンロード + ZIP 化
- フロントエンドで全 presigned URL から並列にファイルを取得
- JSZip 等でブラウザ内 ZIP 化
- Lambda の変更不要だが、ブラウザのメモリ制約あり
- 35 人程度なら現実的
推奨: 案 C(クライアントサイド ZIP)
- Lambda 側の変更が最小限(既存の listSubmissions が presigned URL を返すので追加 API 不要)
- JSZip ライブラリ追加(軽量)
- ブラウザのメモリ内で完結
- 35 人 × 数 MB = 100MB 程度ならブラウザで処理可能
UI
教師クラス詳細画面のフッターに「全作品ダウンロード」ボタンを追加:
ダウンロード中はプログレス表示:
ZIP 構成
テスト2A_提出物/
├── seat-01_スプライト1/
│ ├── project.sb3
│ ├── thumbnail.png
│ ├── screenshot-0.png
│ └── screenshot-1.png
├── seat-02_スプライト1/
│ └── ...
└── ...
data-testid
| data-testid |
要素 |
説明 |
classroom-download-all |
button |
全作品ダウンロードボタン |
変更ファイル
packages/scratch-gui/src/components/classroom-modal/classroom-modal.jsx — ダウンロードボタン追加
packages/scratch-gui/src/containers/classroom-modal.jsx — ダウンロードハンドラー
package.json — JSZip 依存追加(案 C の場合)
Summary
教師が提出された全作品を一括でダウンロードできる機能。座席番号ごとにフォルダ分けされた ZIP ファイルとして取得する。
Parent: #442
背景
PR #445, #446 で作品提出の基本機能が実装済み。教師は個別に「スモウルビーで開く」で作品を確認できるが、全員分の作品を一度にダウンロードする手段がない。授業後に全作品をまとめて評価したい場合や、バックアップとして保存したい場合に必要。
技術的な課題
Lambda タイムアウト
アプローチ案
案 A: Lambda 内で ZIP 生成 → S3 に書き出し → presigned URL 返却
案 B: 非同期(Step Functions or SQS + Lambda)
案 C: クライアントサイドで並列ダウンロード + ZIP 化
推奨: 案 C(クライアントサイド ZIP)
UI
教師クラス詳細画面のフッターに「全作品ダウンロード」ボタンを追加:
ダウンロード中はプログレス表示:
ZIP 構成
data-testid
classroom-download-all変更ファイル
packages/scratch-gui/src/components/classroom-modal/classroom-modal.jsx— ダウンロードボタン追加packages/scratch-gui/src/containers/classroom-modal.jsx— ダウンロードハンドラーpackage.json— JSZip 依存追加(案 C の場合)