Skip to content

feat: きっと通知#44

Open
Riochin wants to merge 2 commits intomainfrom
feature/collect-notification
Open

feat: きっと通知#44
Riochin wants to merge 2 commits intomainfrom
feature/collect-notification

Conversation

@Riochin
Copy link
Owner

@Riochin Riochin commented Sep 14, 2025

概要

変更内容

動作確認

関連 Issue

補足

@misora-ai
Copy link

misora-ai bot commented Sep 14, 2025

コードレビュー: feat: きっと通知

👍 良い点

  • プッシュ通知機能のクライアントサイド(コンポーネント、カスタムフック、サービスワーカー)、サーバーサイド(モデル、ルーター、サービス)、インフラ(AWS SNS Terraformモジュール)にわたる包括的な実装がされています。
  • クライアントサイドでは、カスタムフック usePushNotification を用いてプッシュ通知のロジックが適切にカプセル化されており、再利用性と可読性が高いです。
  • サーバーサイドでは、ルーター、サービス、データベース、モデルが明確に分離されており、関心の分離が保たれています。
  • AWS SNSのTerraformモジュールが新しく追加され、インフラのコード化が進んでいます。
  • PostcardDetailModal では、ローディング状態やエラー状態に対するUIフィードバックが考慮されています。

🔍 改善提案

  • PRのスコープの分離: client/components/PostcardDetailModal.tsx および関連する絵葉書の編集・収集機能は、プッシュ通知とは直接関係のない機能です。単一責任の原則に従い、この機能を別のプルリクエストとして分離することを強く推奨します。これにより、レビューが容易になり、変更によるリスクも低減されます。
  • クライアントAPI統合の改善: client/components/PushNotificationManager.tsx 内で、プッシュ通知の購読情報をサーバーに送信・削除する際に、生成されたAPIクライアント(client.gen.ts)ではなく、直接 fetch APIが使用されています。OpenAPI仕様を更新し、プッシュ通知関連のエンドポイントを生成されたクライアントに含めるように修正してください。これにより、型安全性が向上し、APIの変更に対する追従が容易になります。
  • VAPID公開鍵の管理: client/hooks/usePushNotification.ts 内の VAPID_PUBLIC_KEY がハードコードされています。これは環境変数から取得するか、サーバーのエンドポイントから動的に取得するように変更し、デプロイの柔軟性と鍵のローテーションを容易にすべきです。
  • サーバーサイドの fcm_token 処理: client/components/PushNotificationManager.tsx では fcm_tokenJSON.stringify して文字列として送信していますが、サーバー側(server/routers/users.py)ではこの文字列を再度パースする必要があります。可能であれば、クライアントから直接JSONオブジェクトとして送信し、サーバー側でそのまま利用できるようにAPIの設計を見直すことを検討してください。
  • サーバーサイドのエラーハンドリングの強化: server/services/sns_service.py 内の boto3 を使用したAWS SNSの呼び出しにおいて、より具体的なエラーハンドリング(例: try-except ブロックでの特定の boto3 例外の捕捉)を追加し、堅牢性を高めることを検討してください。
  • 型の一貫性: client/components/PostcardDetailModal.tsxselectedPostcard.current_position?.lat および lon の型が string または number であることをチェックしています。APIレスポンスの型定義 PostcardDetail を確認し、数値型として一貫性を持たせるか、データ取得時に適切な型変換を行うように修正することを推奨します。
  • Terraformにおける機密情報の扱い: infra/modules/sns/variables.tf で定義されている fcm_api_key は機密情報です。本番環境では、AWS Secrets Managerのようなサービスを利用して安全に管理し、Terraformのコードやバージョン管理システムに直接値がコミットされないように徹底してください。
  • ドキュメントの追加: server/services/sns_service.pyclient/public/sw.jsscripts/generate-vapid-keys.js に、コードの目的や使用方法に関するコメントを追加すると、将来のメンテナンス性が向上します。

💡 その他のコメント

プッシュ通知機能の全体的なアプローチは非常に良く、必要な要素が網羅されています。上記の改善提案を適用することで、コードの品質、保守性、セキュリティがさらに向上するでしょう。特に、PRのスコープの分離とAPIクライアントの適切な利用は、今後の開発において重要なポイントとなります。

@misora-ai
Copy link

misora-ai bot commented Sep 14, 2025

コードレビュー: feat: きっと通知

👍 良い点

  • ドキュメントの充実: README.mdにTech Stackと詳細なAWSアーキテクチャ図が追加され、プロジェクトの全体像が非常に分かりやすくなりました。特にaws-architecture.mdとして独立したドキュメントが追加されたことで、アーキテクチャの理解が深まります。
  • インフラ設定の整理: firebase_server_keyがTerraformの変数から削除されたことは、機密情報の管理をより適切に行う上で良い変更です。

🔍 改善提案

  • セキュリティ: IAMポリシーのスコープ: infra/modules/sns/main.tfにおいて、aws_iam_policy.sns_publish_policyResource"*"に変更されています。これにより、このポリシーを持つエンティティが全てのSNSリソースに対してsns:Publish, sns:Subscribeなどのアクションを実行できるようになります。これは過剰な権限であり、セキュリティ上のリスクとなります。特定のSNSトピックやプラットフォームアプリケーションのARNに限定するなど、最小権限の原則に従ってスコープを絞るべきです。

💡 その他のコメント

  • プッシュ通知の実装詳細: SNS Platform Application for FCMが使用されなくなったとのことですが、代わりにどのような方法でWeb Push通知が実装されるのか、その全体像が気になります。クライアントサイドの変更で完結するのか、あるいは別のAWSサービスや外部サービスを利用するのか、もし可能であれば概要を共有いただけると、よりレビューしやすくなります。

Copy link
Collaborator

@itzmeowww itzmeowww left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aaaa

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants