From fb6b54fba0044402c87052a3bbdcf5c983302dea Mon Sep 17 00:00:00 2001 From: MartinBraquet Date: Sat, 1 Nov 2025 21:26:43 +0100 Subject: [PATCH] Delete mobile subscriptions if not set up --- backend/api/src/helpers/private-messages.ts | 41 +++++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/backend/api/src/helpers/private-messages.ts b/backend/api/src/helpers/private-messages.ts index 7cb80d05..d734b82f 100644 --- a/backend/api/src/helpers/private-messages.ts +++ b/backend/api/src/helpers/private-messages.ts @@ -278,6 +278,20 @@ async function removeSubscription( ) } +async function removeMobileSubscription( + pg: SupabaseDirectClient, + token: any, + userId: string, +) { + await pg.none( + `DELETE + FROM push_subscriptions_mobile + WHERE token = $1 + AND user_id = $2`, + [token, userId] + ) +} + async function sendMobileNotifications( pg: SupabaseDirectClient, @@ -286,7 +300,7 @@ async function sendMobileNotifications( ) { const subscriptions = await getMobileSubscriptionsFromDB(pg, userId) for (const subscription of subscriptions) { - await sendPushToToken(subscription.token, payload) + await sendPushToToken(pg, userId, subscription.token, payload) } } @@ -297,7 +311,12 @@ interface PushPayload { data?: Record } -export async function sendPushToToken(token: string, payload: PushPayload) { +export async function sendPushToToken( + pg: SupabaseDirectClient, + userId: string, + token: string, + payload: PushPayload, +) { const message = { token, notification: { @@ -317,8 +336,22 @@ export async function sendPushToToken(token: string, payload: PushPayload) { const response = await fcm.send(message) console.log('Push sent successfully:', response) return response - } catch (err) { - console.error('Error sending push:', err) + } catch (err: unknown) { + // Check if it's a Firebase Messaging error + if (err instanceof Error && 'code' in err) { + const firebaseError = err as { code: string; message: string } + console.warn('Firebase error:', firebaseError.code, firebaseError.message) + + // Handle specific error cases here if needed + // For example, if token is no longer valid: + if (firebaseError.code === 'messaging/registration-token-not-registered' || + firebaseError.code === 'messaging/invalid-argument') { + console.warn('Removing invalid FCM token') + await removeMobileSubscription(pg, token, userId) + } + } else { + console.error('Unknown error:', err) + } } return }