From 45a851de539c89fc2f63b6c3369b5226c72c5f68 Mon Sep 17 00:00:00 2001 From: Kenji Wada Date: Fri, 11 Aug 2023 15:57:45 +0900 Subject: [PATCH] =?UTF-8?q?=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3?= =?UTF-8?q?=E3=83=88=E3=81=AE=E6=9B=B4=E6=96=B0=20(2023/08/11)=20(#16)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #15 --- README.md | 20 ++++++++- document/BL/BL-A01.md | 2 + document/BL/BL-Z02.md | 11 +++++ document/Database.md | 98 +++++++++++++++++++++++++++++++++++++++++++ document/README.md | 58 ++++++++++++------------- 5 files changed, 160 insertions(+), 29 deletions(-) create mode 100644 document/BL/BL-A01.md create mode 100644 document/BL/BL-Z02.md create mode 100644 document/Database.md diff --git a/README.md b/README.md index 5a634bd..5662574 100644 --- a/README.md +++ b/README.md @@ -8,4 +8,22 @@ TodoNote は、iOS用TODO管理アプリである。 cd /PATH/todonote-ios/TodoNote bundle install bundle exec pod install -``` \ No newline at end of file +``` + +* `GoogleService-Info.plist` はプロジェクトには含まれていないため、ビルド前に追加すること。 + +## 開発 + +開発向けのドキュメントは [document](./document/README.md)ディレクトリに置いている。 + +### 開発環境 + +* macOS 13.4.1 (c) +* Xcode 14.3.1 + +### 構成 + +* UIの実装: SwiftUI (View) + UIKit (Navigation) +* アーキテクチャ: Clean Architecture +* パッケージマネージャ: CocoaPods +* バックエンド: Firestore \ No newline at end of file diff --git a/document/BL/BL-A01.md b/document/BL/BL-A01.md new file mode 100644 index 0000000..490404c --- /dev/null +++ b/document/BL/BL-A01.md @@ -0,0 +1,2 @@ +# BL-A01 アプリ起動時 + diff --git a/document/BL/BL-Z02.md b/document/BL/BL-Z02.md new file mode 100644 index 0000000..51e9366 --- /dev/null +++ b/document/BL/BL-Z02.md @@ -0,0 +1,11 @@ +# BL-Z02 ネットワーク接続状態のチェック + +## 入力 + +## 出力 + +* 接続中 connected +* 未接続 unavailable + +## 処理 + diff --git a/document/Database.md b/document/Database.md new file mode 100644 index 0000000..cb9f439 --- /dev/null +++ b/document/Database.md @@ -0,0 +1,98 @@ +# TODOアイテムの新規作成/編集時の考え方 + +ユーザーに対して、データをローカルで持っているのか、バックエンドに保存しているのか、意識させないようにする + +## ステーテス + +TODOアイテムは「editing」「ready」「complete」の3つのステータスを持つ。それぞれの状態は以下の通りである。 + +* `editing` は 編集中 +* `ready` は、準備完了 +* `complete` は、バックエンドへの同期済み + +## 新規アイテムの登録 + +### 開始時 + +1. 空のレコードを作成する。ステータスは `editing` とする + +### 保存時 + +1. ステータスを `editing` から `ready` へ変更 +2. バックエンドへ同期 +3. `complete` へ変更する + +### キャンセル時 + +1. `editing` のレコードを削除する + +## 既存アイテムの編集 + +### 開始時 + +* `ready` または `complete` の既存のレコードをコピーし、ステータスを `editing` とする + +### 保存時 + +1. `ready` または `complete` の既存のレコードを削除する +2. ステータスを `editing` から `ready` へ変更 +3. バックエンドへ同期 +4. ステータスを `complete` へ変更する + +### キャンセル時 + +1. `editing` のレコードを削除する + +## 編集時のサーバー同期までの流れ + +編集時のサーバー同期までの流れを図に示す。該当するユースケースは [BL-C02 TODOアイテムの登録・編集完了](./BL-C02.md) である。 + +### 前提: status=complete のレコードがある状態 + +| todo_id | status | title | +|:--------|:---------|:------------| +| 1 | complete | キャベツを買う | + +### ステップ1:既存のレコードをコピーし、ステータスを editing とする + +| todo_id | status | title | +|:--------|:---------|:------------| +| 1 | editing | キャベツを買う | +| 1 | complete | キャベツを買う | + +### ステップ2:ユーザーの入力ごとにレコードを更新する + +たとえば、タイトルを「キャベツを買う」から「りんごへ買う」に変更する。 + +| todo_id | status | title | +|:--------|:---------|:------------| +| 1 | editing | りんごを買う | +| 1 | complete | キャベツを買う | + +### ステップ3:既存のレコードを削除して、ステータスを editing から ready へ変更する + +| todo_id | status | title | +|:--------|:---------|:------------| +| 1 | ready | りんごを買う | + +### ステップ4:バックエンドへの同期 + +* バックエンドへ保存する + * 成功時:次のステップへ + * 失敗時:ステータス `ready` のまま処理を終了する + +### ステップ5:ステータスを ready から complete とする + +| todo_id | status | title | +|:--------|:---------|:------------| +| 1 | complete | りんごを買う | + +## よくある質問と答え + +### アイテムの編集中にアプリをkillされた場合、editing のレコードが残ってしまうのでは? + +答え:残ります + +そのためアプリ起動時に `editing` のレコードを一括削除する処理を実装している。 + +将来的には、`editing` のレコードが残っていれば、スプラッシュ画面で「前回編集中のアイテムがある。続けて編集するか?」などのダイアログを表示してあげたい。 \ No newline at end of file diff --git a/document/README.md b/document/README.md index 1f015c7..09a2ada 100644 --- a/document/README.md +++ b/document/README.md @@ -10,6 +10,7 @@ ## 現時点での制約 * Firebase Auth の匿名ログインを利用しており、Twitterアカウントでのログインなどの追加認証方法を提供していない。このため一度ログアウトしてしまうと、サーバーに保存したデータにはアクセスできなくなる。よって、現在時点では ログイン時にサーバーからのデータ取得という処理は実装していない +* 現時点では、TODOアイテムの登録・編集時にアプリを kill された場合、次回のアプリ起動時に編集中のアイテムがあるかどうか調べて、途中から復帰できない ## 画面遷移図 @@ -17,51 +18,52 @@ ## TODOアイテムについて -### TODOアイテムの同期 +TODOアイテムは、ローカル(アプリ内データベース) と バックエンド (Firestore) にて管理する。 + +### TODOアイテムのステータスについて * TODOアイテムは「editing」「ready」「complete」の3つのステータスを持つ * `editing` は 編集中 * `ready` は、準備完了 - * `complete` は、サーバーへの同期済み -* ステータスが `ready` のTODOアイテムは、TODO登録/編集完了時・アプリ起動時に サーバーへ同期する。オフラインでもエラーを表示しない -* ステータスが `editing` のTODOアイテムは、TODO登録画面以外では存在させない - * 登録画面上でアプリを終了させた場合、`editing`のレコードが残るため、スプラッシュ画面で削除する - * スプラッシュ画面から登録画面への導線を引きたいが、これは将来的に考える + * `complete` は、バックエンドへの同期済み ### TODOアイテムの登録/編集処理 -* TODOアイテムの新規登録時 - * ステータス `editing` のレコードを作成する - * Save ボタンの押下で、ステータスを `editing` から `ready` へ変更。サーバーへ同期後は `complete` へ変更する - * Cancel ボタンの押下で、`editing` のレコードを削除する -* 既存の TODO アイテムの編集時 - * `ready` または `complete` の既存のレコードをコピーし、ステータスを `editing` へ変更する - * Save ボタンの押下で、既存のレコードを削除し、ステータスを `editing` から `ready` へ変更。サーバーへ同期後は `complete` へ変更する - * Cancel ボタンの押下で、`editing` のレコードを削除する +登録時・編集時の処理の詳細は、[データベースの仕様](./Database.md) にて記す。以下は簡単なデータフローの説明である。 + +* ステータスが `ready` のアイテムは、TODOアイテムの保存時・アプリ起動時に バックエンドへ同期する + * オフラインでもエラーを表示しない +* ステータスが `editing` のアイテムは、TODO登録画面以外では存在させない + * 登録画面上でアプリを終了させた場合、`editing`のレコードが残るため、スプラッシュ画面で削除する + * スプラッシュ画面から登録画面への導線を引きたいが、これは将来的に考える ## 画面 | ID | 画面名 | 備考 | |:-----|:-----|:-----| -| A-1 | スプラッシュ | | -| A-2 | ログイン | Firebaseへの匿名ログイン | -| A-3 | 通知許諾 | | -| B-1 | ホーム | TODO一覧 | -| C-1 | TODO登録 | | -| S-1 | 設定 | | -| S-2 | ライセンス | LicensePlistViewController で表示 | -| S-3 | 問い合わせ | Googleフォームを SFSafariViewController で表示 | +| A-01 | スプラッシュ | | +| A-02 | ログイン | Firebaseへの匿名ログイン | +| A-03 | 通知許諾 | | +| B-01 | ホーム | TODO一覧 | +| C-01 | TODO登録 | | +| S-01 | 設定 | | +| S-02 | ライセンス | LicensePlistViewController で表示 | +| S-03 | 問い合わせ | Googleフォームを SFSafariViewController で表示 | ## ユースケース | ID | ユースケース名 | 備考 | |:-----|:-----|:-----| -| BL-A-1 | lunch | | -| BL-A-1-1 | check login | | +| BL-A01 | lunch | | +| BL-A01-1 | check login | | | BL-1-2 | check version | | | BL-1-4 | check editing | | -| BL-2 | fetch todo list | sort option | -| BL-3 | update todo | | -| BL-S01 | settings | | +| BL-B01 | fetch todo list | sort option | +| BL-B02 | TODOアイテムの削除 | | +| BL-C01 | TODOアイテムの登録・編集開始 | editing のレコードを作成する | +| BL-C02 | TODOアイテムの登録・編集完了 | Firestoreへの同期 | +| BL-C03 | TODOアイテムの編集キャンセル | editing のレコードを削除する | +| BL-S01 | settings | | | [BL-S02](./BL-S02.md) | ログアウト | | -| [BL-Z01](./BL-Z01.md) | データの同期 | ready のレコードの同期を実施する | +| [BL-Z01](./BL-Z01.md) | データの同期 | Firestore へ ready のレコードの同期を実施する | +| BL-Z02 | ネットワーク接続状態のチェック | |