/** * POST /api/chat/read body: { peer: } * Marks all messages from `peer` to the caller as read, and notifies the * caller's other tabs (multi-tab unread sync) via the presence registry. * Gated to staff. */ import { gateFromEvent } from '../../utils/chatAccess' import { markConversationRead } from '../../utils/chatDb' import { sendToUser } from '../../utils/chatPresence' export default defineEventHandler(async (event) => { const config = useRuntimeConfig() if (config.chatEnabled !== true) { setResponseStatus(event, 404) return { error: 'chat disabled' } } let userId: number try { ({ userId } = await gateFromEvent(event)) } catch (err: any) { setResponseStatus(event, err?.statusCode || 403) return { error: 'forbidden' } } const body = await readBody(event) const peer = Number(body?.peer) if (!peer) { setResponseStatus(event, 400) return { error: 'peer required' } } const changed = markConversationRead(userId, peer, Date.now()) // Keep the reader's other tabs in sync. sendToUser(userId, { type: 'read', peer }) // Tell the original sender (`peer`) their messages were read — ✓✓ receipt. sendToUser(peer, { type: 'read-receipt', peer: userId }) return { status: 200, changed } })