# Webプッシュ通知実装計画書 ## 1. プロジェクト概要 ### 現在のアーキテクチャ分析結果 - **フレームワーク**: Next.js 15 (App Router) - **言語**: TypeScript - **バックエンド**: **Hono** (型安全なAPI層) ✅ - **API統合**: `/api/rpc/[...route]/route.ts` 経由のHono統合 ✅ - **UI**: Tailwind CSS + Radix UI - **状態管理**: Zustand - **データフェッチング**: TanStack Query - **その他**: React Hook Form, Zod, Sonner (通知) ### 実装対象 ブラウザ(Chrome)におけるWebプッシュ通知機能を既存のLP生成システムに統合 ### アーキテクチャ整合性確保 🔧 **重要**: 既存システムはHonoバックエンドを使用しているため、プッシュ通知機能も同様の設計パターンに従って実装済み ## 2. 要件定義 ### 機能要件 1. **通知許可トリガー**: ユーザーがブラウザにWebプッシュ許可を求めるUI 2. **API完了通知**: API通信完了時の任意メッセージ通知 3. **ブラウザ表示**: カスタムメッセージのプッシュ通知をブラウザで確認 ### 非機能要件 - 永続化層は使用しない(メモリベース) - 現行アーキテクチャとの整合性維持 - セキュリティ(VAPID認証)対応 ## 3. 技術仕様 ### 3.1 使用技術 - **Service Worker**: プッシュイベント受信・通知表示 - **Push API**: ブラウザネイティブプッシュ通知 - **VAPID**: サーバー認証(Voluntary Application Server Identification) - **web-push**: Node.js用プッシュ通知ライブラリ - **Hono**: 型安全なAPIルート実装 ✅ - **Zod**: スキーマ検証とバリデーション ✅ ### 3.2 通信フロー(Hono統合版) ``` 1. ユーザー操作 → 通知許可要求 2. ブラウザ許可 → Service Worker登録 3. 購読情報取得 → Honoクライアント経由でサーバーに送信 4. API処理完了 → Hono API経由でプッシュ通知送信 5. Service Worker → 通知表示 ``` ### 3.3 型安全性の確保 - **スキーマ駆動開発**: Zodによるリクエスト/レスポンス検証 - **エンドツーエンド型安全性**: HonoクライアントによるAPIの型推論 - **実行時検証**: バリデーションエラーの適切なハンドリング ## 4. 実装手順 ### Phase 1: 基盤構築 1. **依存関係追加** - `web-push` パッケージをpackage.jsonに追加 2. **Service Worker実装** - `public/sw.js` 作成 - プッシュイベントハンドリング - 通知クリック処理 ### Phase 2: サーバーサイド 3. **VAPID設定** - 環境変数設定(`.env.local`) - `lib/webpush-config.ts` 作成 4. **Hono API実装** ✅ - `server/routes/push.ts` (Honoルート実装) - `/api/rpc/[...route]/route.ts` への統合 ### Phase 3: クライアントサイド 5. **型安全クライアント実装** ✅ - `api-client/push/index.ts` (Honoクライアント) - `api-client/push/queries.ts` (TanStack Queryフック) 6. **許可管理フック** ✅ - `hooks/use-notification-permission.ts` 作成・更新 - 許可状態管理・監視・Honoクライアント統合 7. **通知管理コンポーネント** - `components/notifications/push-notification-manager.tsx` 作成 - 購読・送信インターフェース ### Phase 4: 統合 8. **レイアウト統合** - `app/layout.tsx` にService Worker登録 - 通知管理コンポーネント配置 9. **機能統合** - `app/refresh-moments/improvement-result/page.tsx` 修正 - API完了時の通知トリガー追加 ## 5. ファイル構成 ``` project-root/ ├── public/ │ └── sw.js # Service Worker ✅ ├── lib/ │ └── webpush-config.ts # VAPID設定・ユーティリティ ✅ ├── server/routes/ │ └── push.ts # Hono プッシュ通知ルート ✅ ├── api-client/push/ │ ├── index.ts # 型安全Honoクライアント ✅ │ └── queries.ts # TanStack Queryフック ✅ ├── hooks/ │ └── use-notification-permission.ts # 通知許可管理フック ✅ ├── components/notifications/ │ └── push-notification-manager.tsx # 通知管理コンポーネント (予定) ├── app/ │ ├── layout.tsx # (修正予定) SW登録追加 │ ├── api/rpc/[...route]/route.ts # (修正済) Honoルート統合 ✅ │ ├── api/push/ # ⚠️ 削除が必要 (旧実装) │ └── refresh-moments/improvement-result/ │ └── page.tsx # (修正予定) 通知トリガー追加 └── .env.local # (追加) VAPID環境変数 ``` ### ✅ 実装完了済み項目 - Service Worker基盤 - VAPID設定・ユーティリティ - Honoルート統合 - 型安全クライアント - 通知許可管理フック ### 🔄 アーキテクチャ修正済み - **Direct API → Hono統合**: 既存の`/api/push/`を削除し、Honoルート(`/api/rpc/push/`)に移行 - **型安全性強化**: Zodスキーマによるバリデーション - **エンドツーエンド型推論**: HonoクライアントによるAPIの完全な型安全性 ## 6. API設計(Hono統合版) ### 6.1 購読API (`/api/rpc/push/subscribe`) **POST** `/api/rpc/push/subscribe` ```typescript // Request { subscription: { endpoint: string; keys: { p256dh: string; auth: string; }; }; } // Response { success: boolean; message: string; } ``` **DELETE** `/api/rpc/push/subscribe` (購読解除) ### 6.2 送信API (`/api/rpc/push/send`) **POST** `/api/rpc/push/send` ```typescript // Request { title: string; body: string; data?: Record; } // Response { success: boolean; message: string; sent: number; } ``` **GET** `/api/rpc/push/status` (ステータス確認) ### 6.3 型安全性の実装 全てのAPIエンドポイントは以下の特徴を持ちます: - **Zodスキーマによるバリデーション**: リクエスト/レスポンスの型安全性 - **Honoによる型推論**: クライアントからサーバーまでの完全な型安全性 - **エラーハンドリング**: 統一されたエラーレスポンス形式 ## 7. コンポーネント設計(型安全版) ### 7.1 通知許可管理フック ✅ ```typescript export function useNotificationPermission() { return { permission: NotificationPermission; isSupported: boolean; isServiceWorkerReady: boolean; requestPermission: () => Promise; subscribe: () => Promise; unsubscribe: () => Promise; getCurrentSubscription: () => Promise; sendTestNotification: (title: string, body: string) => Promise; }; } ``` ### 7.2 TanStack Queryフック ✅ ```typescript // ステータス取得 export function usePushStatus(enabled?: boolean); // 購読操作 export function usePushSubscribe(); export function usePushUnsubscribe(); // 通知送信 export function usePushSendNotification(); export function usePushSendTestNotification(); ``` ### 7.3 通知管理コンポーネント (予定) ```typescript interface PushNotificationManagerProps { onPermissionGranted?: () => void; onSubscriptionChange?: (subscription: PushSubscription | null) => void; } export function PushNotificationManager(props: PushNotificationManagerProps) ``` ## 8. 環境設定 ### 8.1 VAPID キー ```bash # .env.local VAPID_PUBLIC_KEY=your_public_key VAPID_PRIVATE_KEY=your_private_key VAPID_SUBJECT=mailto:your-email@example.com ``` ### 8.2 Next.js設定 ```typescript // next.config.ts (修正不要、現行設定で対応可能) ``` ## 9. セキュリティ考慮事項 ### 9.1 VAPID認証 - 公開鍵をクライアントに安全に配信 - 秘密鍵をサーバーサイドでのみ使用 - subject(連絡先情報)を適切に設定 ### 9.2 購読情報管理 - メモリベース管理(永続化なし) - セッション単位でのスコープ管理 - 個人情報を含まない ## 10. 動作フロー ### 10.1 初期化フロー 1. ページロード時にService Worker登録 2. ブラウザサポート確認 3. 通知許可状態チェック 4. 必要に応じて許可要求UI表示 ### 10.2 通知送信フロー 1. API処理開始(改善案生成など) 2. 処理完了検知 3. プッシュ通知送信API呼び出し 4. Service Workerでイベント受信 5. ブラウザ通知表示 ## 11. テストシナリオ ### 11.1 基本機能テスト - [ ] Service Worker正常登録 - [ ] 通知許可要求・承認 - [ ] 購読情報取得・送信 - [ ] プッシュ通知受信・表示 ### 11.2 統合テスト - [ ] 改善案生成完了時の通知 - [ ] 異なるブラウザでの動作確認 - [ ] エラーハンドリング ### 11.3 ユーザビリティテスト - [ ] 許可要求UIの自然さ - [ ] 通知メッセージの適切性 - [ ] 非対応ブラウザでの適切な処理 ## 12. 実装優先度 ### High Priority 1. Service Worker実装 2. 基本的なプッシュ通知機能 3. 改善案生成完了通知 ### Medium Priority 4. エラーハンドリング強化 5. 通知設定UI 6. 複数通知タイプ対応 ### Low Priority 7. 通知履歴機能 8. プッシュ通知の詳細カスタマイズ 9. 統計・分析機能 ## 13. 実装状況サマリー ### ✅ Phase 2完了 (Hono統合版) - **Service Worker**: プッシュ通知の受信・表示機能 - **VAPID設定**: 環境変数管理とwebpush統合 - **Hono API**: 型安全なプッシュ通知API実装 - **型安全クライアント**: HonoクライアントとTanStack Queryフック - **通知許可管理**: ブラウザ統合とAPI連携 ### 🔄 アーキテクチャ統合済み - **Honoエコシステム**: 既存のAPIアーキテクチャに完全統合 - **型安全性**: エンドツーエンドの型推論とバリデーション - **一貫性**: 既存のコードパターンとの整合性確保 ### ⏭️ 次のフェーズ (Phase 3-4) 1. 通知管理UIコンポーネント作成 2. Service Worker登録 (layout.tsx) 3. 改善案生成完了時の通知トリガー統合 4. 旧実装ファイル削除 (`/api/push/`) ### 🚀 利用可能な機能 現在の実装により以下の機能が利用可能: - ブラウザプッシュ通知許可要求 - 購読登録・解除 - カスタムメッセージ通知送信 - 通知ステータス確認 - 型安全なAPI通信 --- **作成日**: 2025-09-21 **最終更新**: 2025-09-21 **バージョン**: 2.0 (Hono統合版)