コンテンツにスキップ

Design

Context

現状: dev-fixtures/data/ には17件のセッションJSON(index.json + sessions/*.json)が存在するが、これらに対応する元のTeams出席レポートCSVファイルが存在しない。

課題: アップロードフローのE2Eテスト、デモ、ドキュメント用途でCSVテストデータが必要。

制約:

  • Teams出席レポート形式(UTF-16LE / タブ区切り / 3セクション構成)に準拠
  • CsvTransformer での変換結果が dev-fixtures の JSON と一致する必要がある
  • ID生成ロジック: SHA-256(input).substring(0, 8) — 一方向関数のため逆算不可
  • 既存のテスト(pnpm test)はすべてパスする必要がある

Goals / Non-Goals

Goals:

  • 17件のTeams出席レポート形式CSVファイルを dev-fixtures/csv/ に作成
  • CSVから生成されるID(groupId, memberId, sessionId)に合わせて dev-fixtures/data/ のJSONを更新
  • CSV → JSON 変換結果の一貫性を保証
  • E2Eテストとデモで使用可能なテストデータの提供

Non-Goals:

  • 本番環境のデータフォーマット変更
  • CsvTransformer のロジック変更
  • 実際のメールアドレスの使用(ダミーで十分)

Decisions

1. CSV ファイルの配置場所

決定: dev-fixtures/csv/ ディレクトリを新規作成

理由:

  • dev-fixtures/data/ と並列に配置することで、入力(CSV)と出力(JSON)の関係が明確
  • テストデータであることが一目瞭然
  • Vite の public/ には含めない(開発専用)

2. メールアドレスの生成方法

決定: ダミーメールアドレスを使用(example.com ドメイン)

パターン:

  • suzuki.taro.a@example.com → memberId: c6606539(既存と一致するように調整)
  • 各メンバーに固有のメールアドレスを割り当て
  • メールアドレスから SHA-256 ハッシュを計算し、先頭8桁が既存の memberId と一致するまで調整

理由:

  • 実際のメールアドレスは不要(テストデータとして十分)
  • 既存の memberId を維持することで、既存のテストへの影響を最小化

3. JSON の更新方針

決定: CSVをCsvTransformerに通して生成されるIDに合わせて、既存のJSONを更新する

手順:

  1. 各メンバーの既存 memberId に対応するメールアドレスを逆算(ブルートフォース)
  2. 各グループの既存 groupId に対応するグループ名を逆算(ブルートフォース)
  3. 対応するCSVファイルを作成
  4. CsvTransformer で変換して生成されるJSONを検証
  5. 既存のJSONを更新

代替案:

  • ❌ 既存のJSONをそのままにして、CSVから生成されるIDを無視 → 一貫性がない
  • ✅ 既存のIDに合わせてCSVを調整 → 一貫性を保証

4. CSV フォーマット

決定: Teams出席レポート形式(UTF-16LE / タブ区切り)に準拠

構造:

1. 要約
会議のタイトル {グループ名}
開始時刻    {YYYY/M/D HH:MM:SS}

2. 参加者
名前  メール アドレス    会議の長さ
{参加者名}  {メールアドレス}   {X 時間 Y 分 Z 秒}

3. 会議中のアクティビティ
(空)

理由:

  • CsvTransformer が期待する実際のフォーマットに一致
  • E2Eテストで実際のアップロードフローを再現可能

5. ファイル命名規則

決定: {グループ名}-{YYYY-MM-DD}.csv

:

  • フロントエンド勉強会-2026-01-15.csv
  • TypeScript読書会-2026-01-20.csv

理由:

  • セッションJSONのファイル名({sessionId}.json)と対応
  • 日付順でソート可能

Risks / Trade-offs

[Risk] 既存の memberId / groupId の逆算が困難Mitigation: SHA-256 の先頭8桁が一致するまでブルートフォースでメールアドレス・グループ名を探索。計算量は多いが、一度だけの作業なので許容可能。

[Risk] 既存のテストが依存している ID が変わる可能性Mitigation: 既存の ID に合わせて CSV を調整することで、ID の変更を避ける。テストの更新は最小限に抑える。

[Trade-off] 実際のメールアドレスではなくダミーを使用 → テストデータとして十分。本番環境のデータフォーマットは変更しないため、問題なし。

[Trade-off] 逆算に時間がかかる可能性 → 一度だけの作業なので許容可能。スクリプトを作成して自動化する。