FE_Dev / docs /web-push-implementation-plan.md
GitHub Actions
Deploy from GitHub Actions [dev] - 2025-10-31 07:28:50
68f7925
# 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<string, any>;
}
// 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<NotificationPermission>;
subscribe: () => Promise<PushSubscription | null>;
unsubscribe: () => Promise<boolean>;
getCurrentSubscription: () => Promise<PushSubscription | null>;
sendTestNotification: (title: string, body: string) => Promise<boolean>;
};
}
```
### 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統合版)