メッセージ
チャットメッセージは Fizz サービスが管理します。メッセージ種別、有効期限(TTL)、全文検索をサポートしています。
メッセージ種別
Section titled “メッセージ種別”messageType | 説明 | 送信者 |
|---|---|---|
normal | 通常のテキストメッセージ | 店舗 / 顧客 |
broadcast | 一括配信メッセージ | 店舗(自動) |
advertisement | 広告コンテンツ | 店舗 |
system | システム通知 | システム |
メッセージ構造
Section titled “メッセージ構造”| フィールド | 型 | 説明 |
|---|---|---|
id | UUID | メッセージ ID |
roomId | UUID | 所属ルーム |
content | text | メッセージ本文 |
senderId | text | 送信者 ID |
senderType | text | shop または customer |
messageType | text | メッセージ種別 |
displayDays | int | 表示日数(デフォルト: 90) |
metadata | jsonb | 追加メタデータ |
sentAt | timestamp | 送信日時 |
メッセージ送信フロー
Section titled “メッセージ送信フロー”チャットNG チェック
Section titled “チャットNG チェック”メッセージ送信時に3種類のブロックを確認します。
| NGタイプ | 店舗→顧客 | 顧客→店舗 |
|---|---|---|
SHOP_NG | ブロック | ブロック |
USER_NG | 送信可 | ブロック |
NO_PURELOVERS_USER | ブロック | ブロック |
送信者の自動既読
Section titled “送信者の自動既読”メッセージ送信時、送信者の userRoomState.lastReadAt が自動的に更新されます。これにより送信者自身のメッセージは未読にカウントされません。
メッセージ有効期限 (displayDays)
Section titled “メッセージ有効期限 (displayDays)”メッセージには表示日数が設定でき、期限切れのメッセージは自動的に非表示になります。
| 設定 | 値 |
|---|---|
| デフォルト | 90日 |
| 最小 | 1日 |
| 最大 | 365日 |
有効期限の計算
Section titled “有効期限の計算”const isExpired = (message) => { const expiresAt = message.sentAt.getTime() + message.displayDays * 24 * 60 * 60 * 1000; return Date.now() > expiresAt;};- 期限切れメッセージは DB から削除されず、取得時にフィルタリング
- 365日以上前のメッセージはクエリ自体から除外
メッセージ取得
Section titled “メッセージ取得”カーソルページネーション
Section titled “カーソルページネーション”// ソートキー: (sentAt DESC, id DESC)// 新しいメッセージから順に取得
const messages = await db.query.chatMessage.findMany({ where: { roomId, sentAt: gte(oneYearAgo) // 365日制限 }, orderBy: { sentAt: 'desc' }, limit: limit + 1, // hasMore 判定 with: { attachments: true }});
// 有効期限フィルタconst filtered = messages.filter((m) => !isExpired(m));{ messages: ChatMessage[]; nextCursor: string | null; // 次ページの message.id hasMore: boolean;}メッセージ検索
Section titled “メッセージ検索”キーワードによるメッセージ全文検索が可能です。
| 項目 | 値 |
|---|---|
| 検索対象 | content フィールド |
| 検索方式 | ILIKE '%keyword%'(大文字小文字無視) |
| 検索範囲 | 過去365日以内 |
| 有効期限 | 期限切れメッセージは結果から除外 |
| フィルタ | shopId による店舗限定 |
{ messageId: string; roomId: string; contactId: string; contactName: string; content: string; // 最初の100文字 sentAt: Date;}メッセージメタデータ
Section titled “メッセージメタデータ”metadata フィールドは任意の JSON データを格納できます。
| 用途 | メタデータ |
|---|---|
| 一括配信 | { broadcastId: "xxx" } |
| システム通知 | { notificationType: "welcome" } |
| リンクプレビュー | { ogTitle, ogImage, ogUrl } |
メッセージ送信時に NOTIFICATION_QUEUE にイベントが投入されます。
店舗→顧客メッセージ
Section titled “店舗→顧客メッセージ”顧客に対して以下の通知が送信されます(顧客の設定による):
- PUSH通知
- メール通知
顧客→店舗メッセージ
Section titled “顧客→店舗メッセージ”店舗に対して以下の通知が送信されます(店舗の設定による):
- BOX(アプリ内通知)
- PUSH通知
- LINE通知
- メール通知
詳細は 通知システム概要 を参照してください。
- 添付ファイル - ファイル送信
- 既読管理 - 未読カウント
- 一括配信 - broadcast タイプのメッセージ
- Fizz RPC メソッド - メッセージ関連 RPC