目的: PRD で定義した「何を作るか」を受けて、「どう作るか」をエンジニアが実装できるレベルで定義する文書。
本リポジトリでは docs/PRD.md、docs/FEATURE_REQUIREMENTS.md と本書を技術判断の参照元とする。API 詳細は docs/API_DESIGN.md、DB 詳細は docs/DATABASE_DESIGN.md に集約し、実装されたスキーマは supabase/migrations/ と必ず一致させる。Notion 等は補助リンクとして残す。
| ドキュメント | リンク |
|---|---|
| PRD(リポジトリ) | docs/PRD.md |
| 機能要件 F-01〜F-14(リポジトリ) | docs/FEATURE_REQUIREMENTS.md |
| API 設計(リポジトリ) | docs/API_DESIGN.md |
| DB 設計(リポジトリ) | docs/DATABASE_DESIGN.md |
| アプリ構成ガイド(ディレクトリ・具体例) | docs/ARCHITECTURE_GUIDE.md |
| PRD(Notion) | 要求仕様書 (PRD) |
| UI 設計(Figma) | (未定) |
- クライアントは Supabase(Auth + PostgREST + RLS) を主な BaaS とする。Rails / Go 等の自前アプリサーバーは置かない方針で進める。
- 秘密情報を隠した HTTP 処理(外部 API キー、Webhook 受信、軽いサーバー側オーケストレーション)が必要になった場合は Supabase Edge Functions(Deno 上の TypeScript)で補う。用途・URL・認証の詳細は
docs/API_DESIGN.mdに集約する。
| 技術 | 用途 |
|---|---|
| React Native | iOS / Android 対応のモバイルアプリ開発 |
| Expo | 開発環境の簡略化・Push 通知・EAS ビルド |
| TypeScript | 型安全・保守性向上 |
| 技術 | 用途 |
|---|---|
| Supabase(PostgREST) | 認証済みクライアントからの CRUD・RLS 前提のデータアクセス |
| Supabase Edge Functions | 上記だけでは危険/不十分な処理(例: F-13 為替 API のプロキシとキャッシュ、F-10 のサーバー起点通知が必要になった場合の補助、Webhook)。Deno + TypeScript |
| 技術 | 用途 |
|---|---|
| PostgreSQL | Supabase 内蔵。ユーザーデータ・サブスク情報の永続化 |
| 技術 | 用途 |
|---|---|
| Docker | Supabase のローカル開発環境の統一(Supabase CLI が Docker 前提) |
| Supabase CLI | ローカルで Supabase を起動・マイグレーション管理 |
モバイルアプリ(Expo)はクリーンアーキテクチャの考え方で構成する(依存は常に内側へ:UI やインフラはドメイン・ユースケースに依存し、逆はない)。
| 層 | 責務 | 例(SubTrack) |
|---|---|---|
| domain | ビジネスルール・純粋関数・型。React / Supabase に依存しない | 月額換算、paused を合計から除外、入力値の妥当性 |
| application | ユースケース(1 操作の流れ)。ポートのみに依存 | 「プリセットから登録」「今日使ったを記録」「ダッシュボード用集計の実行」 |
| ports | ユースケースが必要とする抽象(インターフェース) | SubscriptionRepository、AuthSessionPort、FxRatePort |
| infrastructure | ポートの実装。外部 I/O | Supabase クライアント、fetch で Edge Functions、AsyncStorage 等 |
| presentation | 画面・フック・expo-router | app/ のルートは薄く、表示と入力、ユースケース呼び出し |
ディレクトリの目安(リポジトリでは src/ に空の雛形を用意済み。src/README.md 参照):
src/domain/… エンティティ・値オブジェクト・ドメイン関数src/application/… ユースケース(1 ファイル 1 流れ程度)src/ports/… リポジトリ・サービスインターフェースsrc/infrastructure/…supabase/等のアダプタ、DTO ↔ domain のマッパーapp/(またはpresentation/)… UI・ルーティング
リポジトリ直下の components/・hooks/ および app/ の下層の切り方は、チームで 採用済みの docs/ARCHITECTURE_GUIDE.md(推奨ツリー・UI と useXxx の分け方)に従う。
サーバー側: Postgres の RLS・ビュー・SQL 関数は引き続き「サーバー上のドメイン境界」として使う。Edge Functions は infrastructure の延長(docs/API_DESIGN.md)。
段階的導入: ルールが薄い CRUD ・単一トグルの保存だけは 画面近くに簡略実装してよい。分岐・金額・通知条件が増える処理から層を分ける。新規の複雑な機能は 原則クリーンの層に沿う。
具体例・ディレクトリの読み方は docs/ARCHITECTURE_GUIDE.md を参照。
- Push 通知(F-10 など):
expo-notificationsを利用する。Expo Go では Push の検証が限定的なため、実機での本番相当の挙動確認は EAS Build(development / preview ビルド)を前提とする。更新日リマインドのローカル検証は、同 API のスケジュール通知で代替可能。FCM / APNs のクレデンシャルは EAS プロジェクト側で管理し、アプリに秘密を埋め込まない。ユーザーがアプリを開かない日でもサーバーから確実に送る要件が固まった場合は、Edge Function + スケジュール等の併用をdocs/API_DESIGN.mdで設計する。 - Edge Functions: 常時必須ではない。 採用時は
supabase/functions/をリポジトリで管理し、エンドポイント仕様・認証方針をdocs/API_DESIGN.mdに追記する。ローカルはsupabase functions serve、デプロイはsupabase functions deploy(公式: Edge Functions)。
Supabase ダッシュボードの Table Editor 等でのスキーマ変更は原則禁止(本番・Staging に限らず、チームで再現できる形を最優先)。詳細・例外は docs/Rule.md の「データベーススキーマ(Supabase)」。
作業コマンドの詳細手順は docs/MIGRATIONS.md。クイックリファレンスは README.md。ここでは方針のみ。
supabase startでローカルスタックを起動(Docker 必須)。- スキーマ変更は
supabase/migrations/*.sqlにのみ加え、docs/DATABASE_DESIGN.mdと意図が食い違わないようにする。 - 変更の検証は
supabase db reset(ローカル DB をマイグレーションから再構築)で行う。 - 本番・Staging への適用フロー(
db push/ CI / 手動)はプロジェクト運用が固まり次第、本節に追記する。
コンポーネント間の関係・データの流れを記述する。
[Expo アプリ] ── JWT ──▶ [Supabase Auth + PostgREST + RLS] ──▶ [PostgreSQL]
│ ▲
│ (秘密が要るHTTP・Webhook・スケジュール処理)
└──────────────────────────┘──▶ [Edge Functions] ──▶ 外部 API 等
※ データの正は引き続き Postgres + マイグレーション。Edge Functions は「DB を GUI で触る」代替ではない(docs/Rule.md)。
リポジトリ上の正: docs/API_DESIGN.md。PostgREST と採用する Edge Functions の URL・契約をここに書く(現状はプレースホルダ含む)。
補助: API 設計(Notion)
リポジトリ上の正: docs/DATABASE_DESIGN.md(スキーマ草案)。実装の正は supabase/migrations/。変更時は両方を同期する。スキーマの変更は Supabase UI 上のエディタでは行わず、マイグレーションと PR で行う(原則・例外は docs/Rule.md)。
補助: DB 設計(Notion)
主要な処理の流れを記述する。
(例)
1. ユーザーがボタンをクリック
2. フロントエンドが POST /api/v1/xxx を呼び出す
3. バックエンドがバリデーション
4. DB に保存
5. レスポンスを返す
6. フロントエンドが画面を更新
UI の振る舞い・バリデーション等を記述する。Figma と合わせて参照すること。
**機能単位の仕様(前提・完了条件・エラー・ビジネスルール)**は docs/FEATURE_REQUIREMENTS.md を参照する。本節は共通パターンの例・補足とする。
| 項目 | ルール | エラーメッセージ |
|---|---|---|
| メールアドレス | 形式チェック | 「正しいメールアドレスを入力してください」 |
| (未定) |
| 状態 | 説明 | UI 上の表示 |
|---|---|---|
| loading | API 通信中 | スピナー表示 |
| error | エラー発生時 | エラーメッセージ表示 |
| success | 正常完了 | 完了メッセージ表示 |
未記入。数値・方針が決まったら追記する。
- 目標レスポンスタイム:(未定)
- 想定リクエスト数:(未定)
- 大量データ時ページネーション等:(未定)
- 認証・認可方式:(未定)
- 入力値サニタイズ:(未定)
- その他:(未定)
- エラー時のリトライ:(未定)
- ロールバック方針:(未定)
- ログ出力方針:(未定)
既存データへの影響・マイグレーション方針を記述する。
- 既存データへの影響:(未定)
- マイグレーション方針:(未定)
- ロールバック手順:(未定)
| テスト種別 | 対象 | 担当 |
|---|---|---|
| 単体テスト | ○○ ロジック | エンジニア |
| 結合テスト | API〜DB | エンジニア |
| E2E テスト | 主要ユースケース | QA |
(対象・担当はプロジェクトに合わせて具体化する。)
| 内容 | 担当 | 期限 |
|---|---|---|
| (未定) |