Skip to content

Commit

Permalink
ドキュメントの更新 (2023/08/11) (#16)
Browse files Browse the repository at this point in the history
  • Loading branch information
CH3COOH authored Aug 11, 2023
1 parent 4c88e44 commit 45a851d
Show file tree
Hide file tree
Showing 5 changed files with 160 additions and 29 deletions.
20 changes: 19 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,22 @@ TodoNote は、iOS用TODO管理アプリである。
cd /PATH/todonote-ios/TodoNote
bundle install
bundle exec pod install
```
```

* `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
2 changes: 2 additions & 0 deletions document/BL/BL-A01.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
# BL-A01 アプリ起動時

11 changes: 11 additions & 0 deletions document/BL/BL-Z02.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
# BL-Z02 ネットワーク接続状態のチェック

## 入力

## 出力

* 接続中 connected
* 未接続 unavailable

## 処理

98 changes: 98 additions & 0 deletions document/Database.md
Original file line number Diff line number Diff line change
@@ -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` のレコードが残っていれば、スプラッシュ画面で「前回編集中のアイテムがある。続けて編集するか?」などのダイアログを表示してあげたい。
58 changes: 30 additions & 28 deletions document/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,58 +10,60 @@
## 現時点での制約

* Firebase Auth の匿名ログインを利用しており、Twitterアカウントでのログインなどの追加認証方法を提供していない。このため一度ログアウトしてしまうと、サーバーに保存したデータにはアクセスできなくなる。よって、現在時点では ログイン時にサーバーからのデータ取得という処理は実装していない
* 現時点では、TODOアイテムの登録・編集時にアプリを kill された場合、次回のアプリ起動時に編集中のアイテムがあるかどうか調べて、途中から復帰できない

## 画面遷移図

<img width="749" alt="screen-transition" src="https://github.com/CH3COOH/todonote-ios/assets/137952/dbdc0ac1-96f2-4873-ade5-7f9c9cbc7da1">

## 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 | ネットワーク接続状態のチェック | |

0 comments on commit 45a851d

Please sign in to comment.