2025年12月12日2025-12-12
リアルタイム通知機能の完全実装とFirebase Functions基盤の構築
フォーム送信・コンタクト追加・アクティビティ発生時に自動でSlack/Discord/Chatworkへ通知が届くようになりました。Firebase Cloud Functions(2nd Gen)を導入し、どの経路からコンタクトが作成されても確実に通知を送信できる基盤を整備。アクティビティ通知は細かくカスタマイズ可能で、スパム通知を防ぐ仕組みも実装しました。
主な改善点
- フォーム送信時のアプリ連携通知機能を実装。フォーム設定画面で「フォーム送信時にアプリへ通知を送る」をONにすると、Slack/Discord/Chatworkに自動通知が届きます。回答内容の全フィールド情報とフォーム詳細ページへのリンクが含まれます。
- コンタクト追加時の自動通知をFirebase Cloud Functions(2nd Gen)のFirestore onCreate トリガーで実装。外部サイトに埋め込まれたフォーム・管理画面での手動作成・CSVインポートなど、どの経路からコンタクトが作成されても確実に通知が送信されます。
- アクティビティ通知設定ページ(`/settings/activity-notifications`)を新設。コンタクトとプロジェクトのアクティビティタイプ(通話・メール・会議・メモ・タスク・取引・その他)とプロパティ変更(担当者変更・フェーズ変更など)を細かく設定できます。
- 大量作成時の通知スパムを防ぐため、フォーム経由・CSVインポートで作成されるコンタクトには `notificationSuppressed` フラグを自動付与。Functions側でこのフラグをチェックし、通知を抑制します。
- Firebase Functions のセットアップを完了。Node.js 20ランタイム対応、TypeScriptビルド設定、`firebase.json` の `predeploy` フックを追加し、本番デプロイが可能な状態に整備しました。
- フォーム回答の削除機能を改善。スパム管理機能を削除し、シンプルに「個別削除」と「選択削除」のみに変更。Firestoreルールを修正し、同一アカウントのユーザーがフォーム回答と関連コンタクトを削除できるように権限を拡張しました。
- フォーム埋め込みスクリプト(`/api/forms/embed.js`)を改善し、外部サイトに埋め込んだフォームからも正しく `localhost` のAPIを呼び出すように修正。ベースURLを動的に取得するように変更しました。
- コンタクト追加通知のメッセージをリッチに実装。SlackはBlock形式、DiscordはEmbed形式、ChatworkはInfo形式で、コンタクト名・会社名・メールアドレス・ソース情報・詳細ページへのリンクを含みます。
- フォーム送信API(`/api/forms/[token]/submit`)をFirebase Admin SDKに切り替え、サーバーサイドで確実に処理できるように改善。通知送信エラーの詳細ログを追加し、デバッグが容易になりました。
- アクティビティ通知は設定に基づいて自動判定。プロパティ変更の場合は担当者変更・フェーズ変更などのカテゴリを自動識別し、設定で有効になっている項目のみ通知を送信します。
- Firestoreルールを修正し、フォーム回答(`formResponses`)の削除を同一アカウントのユーザーに許可。フォーム詳細画面から回答と関連コンタクトを安全に削除できるようになりました。