ba-cafe-timer

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

README.md (4523B)


      1 # Cafe Timer (hw-ba-cafe)
      2 
      3 Next.jsで構築された、Cloudflare Pages 上で動作するカフェタイマー PWA です。
      4 
      5 ## 技術スタック
      6 
      7 * **Framework:** Next.js (App Router)
      8 * **Deployment:** Cloudflare Pages
      9 * **Build Tool:** @cloudflare/next-on-pages
     10 * **Database:** Firebase Firestore
     11 * **Push Notification:** OneSignal
     12 * **Styling:** Tailwind CSS
     13 
     14 ## セットアップ & 開発
     15 
     16 ### 1. 依存関係のインストール
     17 ```
     18 bun i
     19 ```
     20 
     21 ### 2. 開発サーバーの起動
     22 ```
     23 bun dev
     24 ```
     25 
     26 ### 3. Check
     27 ```
     28 bun lint
     29 ```
     30 and
     31 ```
     32 bun pages:build
     33 ```
     34 
     35 ## ビルド & デプロイ
     36 Cloudflare Pages でのビルドには特定の設定が必要です。
     37 
     38 ### Cloudflare Pages ビルド設定
     39 - Build command: `npx @cloudflare/next-on-pages@1`
     40 - Build output directory: `.vercel/output/static`
     41 - Compatibility Date: `2024-12-30`
     42 - Compatibility Flags: `nodejs_compat`
     43 
     44 ### 設定
     45 1. output 設定の禁止: `next.config.ts`で`output: 'standalone'`や`output: 'export'`は設定しません。設定すると、Cloudflare 向けのビルドプロセスと競合し、404エラーの原因となります。
     46 
     47 ## プロジェクト構成案:Firebase × Cloudflare × OneSignal
     48 
     49 ### 1. システム概要
     50 
     51 ユーザーがアプリ上のボタンをタップすると、その履歴を即座に保存し、正確に3時間後にプッシュ通知を送信する。複雑な遅延処理の管理を自前で持たず、外部サービスのスケジュール機能にオフロードすることで、サーバーレスかつ低コストで堅牢な仕組みを実現する。
     52 
     53 ### 2. 技術選定と役割
     54 
     55 | コンポーネント | 選定ツール | 担当機能 |
     56 | --- | --- | --- |
     57 | **Frontend** | Next.js (TypeScript) | UI、Google認証のトリガー、Firestoreへの書き込み、通知予約APIの呼び出し |
     58 | **Authentication** | Firebase Auth | Googleログインによるユーザー識別とセッション管理 |
     59 | **Database** | Firebase Firestore | ユーザーごとのタップ履歴保存、セキュリティルールによる権限管理 |
     60 | **Edge Functions** | Cloudflare Pages Functions | OneSignal APIキーの秘匿、通知予約リクエストのプロキシ |
     61 | **Push Engine** | OneSignal | `send_after` パラメータによる3時間後の通知スケジューリング、通知配信 |
     62 
     63 ### 3. データフロー
     64 
     65 1. **Auth**: ユーザーがGoogleアカウントでサインイン。Firebase UIDを取得。
     66 2. **Save**: ボタンタップ時、FrontendからFirestoreの `/users/{uid}/taps` へレコードを書き込み。
     67 3. **Request**: Frontendから Cloudflare Pages Functions (`/api/schedule`) へ `uid` を送信。
     68 4. **Schedule**: FunctionsがOneSignal APIを叩き、「3時間後」の時刻を指定して通知を予約。
     69 5. **Delivery**: 3時間経過後、OneSignalが自動的にターゲット(`external_id == uid`)へ通知を配信。
     70 
     71 #### 4. 実装上の重要ポイント
     72 
     73 * **APIキーの保護**: OneSignalの `REST API Key` はブラウザ側に露出させず、必ずCloudflareの環境変数として管理し、Functions経由でのみ使用する。
     74 * **IDの紐付け**: OneSignalのSDKを使用して、Firebaseの `uid` をOneSignalの `external_user_id` としてセットしておく。これにより、APIから特定のユーザーを簡単に指定できる。
     75 * **冪等性の考慮**: 連打による通知の重複を防ぐ場合、FirestoreのドキュメントIDやOneSignalの `idempotency_key` の活用を検討する。
     76 
     77 
     78 ```mermaid
     79 graph TD
     80     User((ユーザー))
     81     
     82     subgraph Frontend [Next.js / Cloudflare Pages]
     83         UI[タップボタン]
     84         SDK[Firebase SDK / OneSignal SDK]
     85     end
     86 
     87     subgraph Auth_DB [Firebase]
     88         Auth{Google Auth}
     89         Firestore[(Firestore)]
     90     end
     91 
     92     subgraph Backend [Cloudflare Pages Functions]
     93         API[API Route /api/schedule]
     94     end
     95 
     96     subgraph Notification [OneSignal]
     97         Scheduler[配信スケジューラー]
     98     end
     99 
    100     User -->|Googleログイン| Auth
    101     Auth -->|UID取得| SDK
    102     User -->|ボタンタップ| UI
    103     UI -->|履歴保存| Firestore
    104     UI -->|通知予約リクエスト| API
    105     API -->|APIキーを付与して送信| Scheduler
    106     Scheduler -.->|3時間待機| Scheduler
    107     Scheduler -->|プッシュ通知| User
    108 
    109     classDef highlight fill:#f9f,stroke:#333,stroke-width:2px;
    110     class API highlight;
    111 ```