/** * POST /api/push/register-native { token, platform } → { ok } * * Stores the bundled app's FCM device token for the (staff) user so chat DMs can ring the device when * the app is backgrounded/killed. Auth reuses the app's token flow: the app sends Authorization: * Bearer + X-Logship-*; server/middleware/00.app-auth.ts maps those to cookies, and gateFromEvent() * resolves the user + asserts staff access (throws 401/403 otherwise). Web push is unaffected. */ import { gateFromEvent } from '../../utils/chatAccess' import { saveFcmToken } from '../../utils/fcmDb' export default defineEventHandler(async (event) => { if (useRuntimeConfig().chatEnabled !== true) return { ok: false } let userId: number, roleId: number try { ({ userId, roleId } = await gateFromEvent(event)) // 401/403 if not eligible staff } catch { setResponseStatus(event, 401) return { ok: false } } const body = await readBody(event) const token = String(body?.token || '').trim() if (!token) { setResponseStatus(event, 400) return { ok: false, error: 'token required' } } saveFcmToken(userId, roleId, token, String(body?.platform || 'android')) return { ok: true } })