# 機能設計書 31-返信投稿

## 概要

本ドキュメントは、Wikipedia iOSアプリにおけるトークページ（議論ページ）の返信投稿機能について、その設計仕様を詳細に記載したものである。

### 本機能の処理概要

トークページ返信投稿機能は、ユーザーがWikipediaのトークページ上の既存コメントに対して返信を投稿するための機能である。

**業務上の目的・背景**：Wikipediaのトークページは、記事の編集方針や内容について編集者同士が議論を行う場である。返信投稿機能は、既存の議論に参加し、意見や情報を追加するために不可欠な機能である。モバイルアプリからシームレスに議論に参加できることで、編集者コミュニティの活性化に貢献する。

**機能の利用シーン**：
- 他の編集者のコメントに対して意見を述べたい場合
- 質問への回答を投稿したい場合
- 議論に参加して記事の編集方針について合意形成を図りたい場合

**主要な処理内容**：
1. 返信対象のコメント選択とコンポーズビューの表示
2. 返信テキストの入力と書式設定
3. 投稿前のバリデーション処理
4. MediaWiki APIを通じた返信の投稿
5. 投稿結果の処理とUIの更新

**関連システム・外部連携**：MediaWiki Action APIを使用してトークページへの返信を投稿する。具体的には`action=discussiontoolsedit`エンドポイントを使用する。

**権限による制御**：ログイン済みユーザーは自身のアカウントで投稿可能。未ログインユーザーも投稿可能だが、一時アカウント機能が有効なWikiでは一時アカウントとして投稿される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | TalkPageViewController | 主画面 | トークページ表示、返信ボタンのタップ |
| - | TalkPageReplyComposeContentView | 結果表示画面 | 返信入力UI、投稿ボタン |

## 機能種別

CRUD操作（Create） / データ連携

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| replyText | String | Yes | 返信本文テキスト | 空文字列でないこと |
| commentViewModel | TalkPageCellCommentViewModel | Yes | 返信対象のコメント情報 | 有効なコメントIDを持つこと |

### 入力データソース

- 画面入力：ユーザーがテキストビューに入力した返信本文
- システム内部：返信対象コメントのビューモデル

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 投稿結果 | Result<Void, Error> | 投稿成功または失敗 |
| 更新されたトークページデータ | TalkPageDataController | 投稿後のトークページ情報 |

### 出力先

- MediaWiki API（トークページへの返信投稿）
- 画面表示（投稿結果のフィードバック）

## 処理フロー

### 処理シーケンス

```
1. ユーザーがコメントの返信ボタンをタップ
   └─ TalkPageViewController.tappedReply(commentViewModel:accessibilityFocusView:)
2. 返信コンポーズコントローラーを表示
   └─ TalkPageReplyComposeController.setupAndDisplay()
3. ユーザーが返信テキストを入力
   └─ TalkPageReplyComposeContentView.replyTextView
4. 投稿ボタンタップ時のバリデーション
   └─ テキストが空でないことを確認
5. 投稿処理を実行
   └─ TalkPageViewController.tappedPublish(text:commentViewModel:)
6. TalkPageDataControllerを通じてAPI呼び出し
   └─ postReply(commentId:wikitext:)
7. 投稿結果の処理
   └─ 成功時：コンポーズビューを閉じ、データを再取得
   └─ 失敗時：エラーメッセージを表示
```

### フローチャート

```mermaid
flowchart TD
    A[返信ボタンタップ] --> B[コンポーズビュー表示]
    B --> C[テキスト入力]
    C --> D{投稿ボタンタップ}
    D --> E{テキスト空?}
    E -->|Yes| F[ボタン無効のまま]
    E -->|No| G[投稿処理開始]
    G --> H{ログイン状態確認}
    H -->|ログイン済み| I[投稿実行]
    H -->|未ログイン| J{一時アカウント対応Wiki?}
    J -->|Yes| I
    J -->|No| K[ログイン促進パネル表示]
    K --> I
    I --> L{投稿成功?}
    L -->|Yes| M[コンポーズビュー閉じる]
    M --> N[データ再取得]
    L -->|No| O[エラー表示]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-31-01 | 空テキスト禁止 | 返信テキストが空の場合、投稿ボタンは無効 | 常時 |
| BR-31-02 | 認証状態確認 | 一時アカウント対応Wikiでは未ログインでも投稿可能 | 一時アカウント機能有効時 |
| BR-31-03 | 破棄確認 | テキスト入力済みの状態で閉じる場合は確認ダイアログを表示 | テキスト入力済み時 |

### 計算ロジック

該当なし

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 返信投稿 | MediaWiki API | INSERT（外部API） | トークページに返信を追加 |

### テーブル別操作詳細

ローカルデータベースへの直接操作はなし。MediaWiki APIを介した外部システムへの書き込みのみ。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ネットワークエラー | 通信失敗時 | WMFAlertManagerでエラー表示 |
| - | 認証エラー | セッション切れ時 | 再ログインを促す |
| - | APIエラー | MediaWiki側でエラー発生時 | エラーメッセージを表示 |

### リトライ仕様

自動リトライは実装されていない。ユーザーが手動で再投稿を試みる必要がある。

## トランザクション仕様

MediaWiki APIへの単一リクエストのため、アプリ側でのトランザクション管理は不要。

## パフォーマンス要件

特に明示的な要件なし。ネットワーク状況に依存する。

## セキュリティ考慮事項

- 認証トークンはKeychainに安全に保存
- 一時アカウント機能による匿名ユーザーのプライバシー保護
- HTTPS通信による通信内容の暗号化

## 備考

- 書式設定ツールバーが提供され、Wikiテキスト形式での入力を支援
- アクセシビリティ対応：VoiceOver使用時は全画面表示モードに固定

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、返信対象のコメントを表すデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | TalkPageCellCommentViewModel.swift | `Wikipedia/Code/TalkPageCellCommentViewModel.swift` | 返信対象コメントのビューモデル構造 |

**読解のコツ**: SwiftのObservableObjectパターンを使用しており、`@Published`プロパティがUI更新のトリガーとなる。

#### Step 2: エントリーポイントを理解する

返信ボタンタップから処理が開始される。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | TalkPageReplyComposeController.swift | `Wikipedia/Code/TalkPageReplyComposeController.swift` | 返信コンポーズの全体制御 |

**主要処理フロー**:
1. **54-72行目**: `setupAndDisplay()`メソッドで返信ビューを初期化・表示
2. **400-443行目**: `tappedPublish()`メソッドで投稿処理を開始
3. **362-382行目**: `presentDismissConfirmationActionSheet()`で破棄確認

#### Step 3: UIコンポーネントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | TalkPageReplyComposeContentView.swift | `Wikipedia/Code/TalkPageReplyComposeContentView.swift` | 返信入力UIの実装 |

**主要処理フロー**:
- 返信テキストビュー、投稿ボタン、閉じるボタンのレイアウト
- テキスト変更時の投稿ボタン有効化判定

#### Step 4: デリゲート実装を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | TalkPageViewController.swift | `Wikipedia/Code/TalkPageViewController.swift` | デリゲートメソッドの実装 |

**主要処理フロー**:
- `TalkPageReplyComposeDelegate`プロトコルの実装
- `tappedPublish(text:commentViewModel:)`での実際の投稿処理

### プログラム呼び出し階層図

```
TalkPageViewController
    │
    ├─ tappedReply(commentViewModel:accessibilityFocusView:)
    │      └─ TalkPageReplyComposeController.setupAndDisplay()
    │              └─ TalkPageReplyComposeContentView（UIコンポーネント生成）
    │
    └─ tappedPublish(text:commentViewModel:) [デリゲートコールバック]
           └─ TalkPageDataController.postReply()
                   └─ MediaWiki API呼び出し
```

### データフロー図

```
[入力]                        [処理]                              [出力]

ユーザー入力           TalkPageReplyComposeController        MediaWiki API
(テキスト) ─────────▶  ┌────────────────────────┐  ─────────▶ (返信投稿)
                       │  テキスト検証          │
                       │  認証状態確認          │
コメントVM ───────────▶│  投稿リクエスト生成    │  ─────────▶ 画面更新
(返信対象)             └────────────────────────┘              (結果通知)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| TalkPageReplyComposeController.swift | `Wikipedia/Code/TalkPageReplyComposeController.swift` | ソース | 返信コンポーズの制御ロジック |
| TalkPageReplyComposeContentView.swift | `Wikipedia/Code/TalkPageReplyComposeContentView.swift` | ソース | 返信入力UIビュー |
| TalkPageViewController.swift | `Wikipedia/Code/TalkPageViewController.swift` | ソース | トークページ全体の制御 |
| TalkPageDataController.swift | `Wikipedia/Code/TalkPageDataController.swift` | ソース | トークページデータ操作 |
| TalkPageCellCommentViewModel.swift | `Wikipedia/Code/TalkPageCellCommentViewModel.swift` | ソース | コメントビューモデル |
| TalkPageFormattingToolbarView.swift | `Wikipedia/Code/TalkPageFormattingToolbarView.swift` | ソース | 書式設定ツールバー |
