Skip to content

feat: クラスルーム — 全作品 ZIP 一括ダウンロード #449

@takaokouji

Description

@takaokouji

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

教師クラス詳細画面のフッターに「全作品ダウンロード」ボタンを追加:

[クラスを削除]  [全作品ダウンロード]

ダウンロード中はプログレス表示:

ダウンロード中... (12/35)

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 の場合)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions