コンテンツにスキップ

検索はプロダクションビルドでのみ利用可能です。 ローカルでテストするには、サイトをビルドしてプレビューしてください。

メッセージ

チャットメッセージは Fizz サービスが管理します。メッセージ種別、有効期限(TTL)、全文検索をサポートしています。


messageType説明送信者
normal通常のテキストメッセージ店舗 / 顧客
broadcast一括配信メッセージ店舗(自動)
advertisement広告コンテンツ店舗
systemシステム通知システム

フィールド説明
idUUIDメッセージ ID
roomIdUUID所属ルーム
contenttextメッセージ本文
senderIdtext送信者 ID
senderTypetextshop または customer
messageTypetextメッセージ種別
displayDaysint表示日数(デフォルト: 90)
metadatajsonb追加メタデータ
sentAttimestamp送信日時

メッセージ送信時に3種類のブロックを確認します。

NGタイプ店舗→顧客顧客→店舗
SHOP_NGブロックブロック
USER_NG送信可ブロック
NO_PURELOVERS_USERブロックブロック

メッセージ送信時、送信者の userRoomState.lastReadAt が自動的に更新されます。これにより送信者自身のメッセージは未読にカウントされません。


メッセージには表示日数が設定でき、期限切れのメッセージは自動的に非表示になります。

設定
デフォルト90日
最小1日
最大365日
const isExpired = (message) => {
const expiresAt = message.sentAt.getTime() + message.displayDays * 24 * 60 * 60 * 1000;
return Date.now() > expiresAt;
};
  • 期限切れメッセージは DB から削除されず、取得時にフィルタリング
  • 365日以上前のメッセージはクエリ自体から除外

// ソートキー: (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;
}

キーワードによるメッセージ全文検索が可能です。

項目
検索対象content フィールド
検索方式ILIKE '%keyword%'(大文字小文字無視)
検索範囲過去365日以内
有効期限期限切れメッセージは結果から除外
フィルタshopId による店舗限定
{
messageId: string;
roomId: string;
contactId: string;
contactName: string;
content: string; // 最初の100文字
sentAt: Date;
}

metadata フィールドは任意の JSON データを格納できます。

用途メタデータ
一括配信{ broadcastId: "xxx" }
システム通知{ notificationType: "welcome" }
リンクプレビュー{ ogTitle, ogImage, ogUrl }

メッセージ送信時に NOTIFICATION_QUEUE にイベントが投入されます。

顧客に対して以下の通知が送信されます(顧客の設定による):

  • PUSH通知
  • メール通知

店舗に対して以下の通知が送信されます(店舗の設定による):

  • BOX(アプリ内通知)
  • PUSH通知
  • LINE通知
  • メール通知

詳細は 通知システム概要 を参照してください。