From 8c4650d1bcf4ee2b502ddd448d161d7fa2f828e6 Mon Sep 17 00:00:00 2001 From: Ricky Stretch Date: Tue, 24 Mar 2026 19:16:36 -0400 Subject: [PATCH] FCM bug fix --- backend/src/routes/messages.js | 52 ++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/backend/src/routes/messages.js b/backend/src/routes/messages.js index db2bfaa..1c01435 100644 --- a/backend/src/routes/messages.js +++ b/backend/src/routes/messages.js @@ -3,6 +3,7 @@ const multer = require('multer'); const path = require('path'); const fs = require('fs'); const { query, queryOne, queryResult, exec } = require('../models/db'); +const { sendPushToUser } = require('./push'); function deleteImageFile(imageUrl) { if (!imageUrl) return; @@ -101,6 +102,32 @@ module.exports = function(io) { `, [r.rows[0].id]); message.reactions = []; io.to(R(req.schema,'group',req.params.groupId)).emit('message:new', message); + + // Push notifications + const senderName = message.user_display_name || message.user_name || 'Someone'; + const msgBody = (content?.trim() || '').slice(0, 100); + if (group.type === 'private') { + const members = await query(req.schema, + 'SELECT user_id FROM group_members WHERE group_id = $1', [req.params.groupId] + ); + for (const m of members) { + if (m.user_id === req.user.id) continue; + sendPushToUser(req.schema, m.user_id, { + title: senderName, body: msgBody, url: '/', groupId: group.id, + }).catch(() => {}); + } + } else if (group.type === 'public') { + const subUsers = await query(req.schema, + 'SELECT DISTINCT user_id FROM push_subscriptions WHERE fcm_token IS NOT NULL AND user_id != $1', + [req.user.id] + ); + for (const sub of subUsers) { + sendPushToUser(req.schema, sub.user_id, { + title: `${senderName} in ${group.name}`, body: msgBody, url: '/', groupId: group.id, + }).catch(() => {}); + } + } + res.json({ message }); } catch (e) { res.status(500).json({ error: e.message }); } }); @@ -124,6 +151,31 @@ module.exports = function(io) { ); message.reactions = []; io.to(R(req.schema,'group',req.params.groupId)).emit('message:new', message); + + // Push notifications for image messages + const senderName = message.user_display_name || message.user_name || 'Someone'; + if (group.type === 'private') { + const members = await query(req.schema, + 'SELECT user_id FROM group_members WHERE group_id = $1', [req.params.groupId] + ); + for (const m of members) { + if (m.user_id === req.user.id) continue; + sendPushToUser(req.schema, m.user_id, { + title: senderName, body: '📷 Image', url: '/', groupId: group.id, + }).catch(() => {}); + } + } else if (group.type === 'public') { + const subUsers = await query(req.schema, + 'SELECT DISTINCT user_id FROM push_subscriptions WHERE fcm_token IS NOT NULL AND user_id != $1', + [req.user.id] + ); + for (const sub of subUsers) { + sendPushToUser(req.schema, sub.user_id, { + title: `${senderName} in ${group.name}`, body: '📷 Image', url: '/', groupId: group.id, + }).catch(() => {}); + } + } + res.json({ message }); } catch (e) { res.status(500).json({ error: e.message }); } });