From e762d0fb7983c39ce5d5829b06294ba4dd24defd Mon Sep 17 00:00:00 2001 From: Sharon Dcruz Date: Tue, 26 Aug 2025 06:27:20 +0000 Subject: [PATCH 1/3] notification-bug-fix (#112) Co-authored-by: Dhansh A S Reviewed-on: https://git.cosqnet.com/cosqnet/fitlien-services/pulls/112 Reviewed-by: Allen T J Co-authored-by: Sharon Dcruz Co-committed-by: Sharon Dcruz --- functions/src/notifications/processNotification.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/functions/src/notifications/processNotification.ts b/functions/src/notifications/processNotification.ts index fe7ce6a..6398419 100644 --- a/functions/src/notifications/processNotification.ts +++ b/functions/src/notifications/processNotification.ts @@ -82,15 +82,6 @@ async function getUserAndFCMToken( if (notification.recipientId) { targetUserId = notification.recipientId; logger.info(`Using top-level recipientId: ${targetUserId}`); - } else if (notification.data?.userId) { - targetUserId = notification.data.userId; - logger.info(`Using data.userId: ${targetUserId}`); - } else if (notification.data?.clientId) { - targetUserId = notification.data.clientId; - logger.info(`Using data.clientId: ${targetUserId}`); - } else if (notification.data?.invitorId) { - targetUserId = notification.data.invitorId; - logger.info(`Using data.invitorId: ${targetUserId}`); } else if (notification.data?.phoneNumber) { logger.info( `Looking up user by phone number from data: ${notification.data.phoneNumber}` From f0d167a67188a161296bf02ce7166ec613d5ffa2 Mon Sep 17 00:00:00 2001 From: Sharon Dcruz Date: Tue, 9 Sep 2025 09:06:58 +0000 Subject: [PATCH 2/3] notification-bug-fix (#113) Co-authored-by: Dhansh A S Reviewed-on: https://git.cosqnet.com/cosqnet/fitlien-services/pulls/113 Reviewed-by: Dhansh A S Co-authored-by: Sharon Dcruz Co-committed-by: Sharon Dcruz --- .../membershipStatusNotifications.ts | 74 +++++++++++++------ 1 file changed, 53 insertions(+), 21 deletions(-) diff --git a/functions/src/notifications/membershipStatusNotifications.ts b/functions/src/notifications/membershipStatusNotifications.ts index e8c3b01..40b5666 100644 --- a/functions/src/notifications/membershipStatusNotifications.ts +++ b/functions/src/notifications/membershipStatusNotifications.ts @@ -46,7 +46,7 @@ interface PersonalTrainerAssign { export const checkExpiredMemberships = onSchedule( { - schedule: "*/5 * * * *", + schedule: "0 0,12 * * *", timeZone: "UTC", region: "#{SERVICES_RGN}#", }, @@ -57,11 +57,18 @@ export const checkExpiredMemberships = onSchedule( await updateDaysUntilExpiryForAllMemberships(); const expiredMemberships = await findExpiredMemberships(); const expiringMemberships = await findMembershipsExpiringIn10Days(); - - const expiredMembershipsWithoutExpiryDate = await findExpiredMembershipsWithoutExpiryDate(); - if (expiredMemberships.length === 0 && expiringMemberships.length === 0 && expiredMembershipsWithoutExpiryDate.length === 0) { - logger.info("No expired, expiring, or unprocessed expired memberships found."); + const expiredMembershipsWithoutExpiryDate = + await findExpiredMembershipsWithoutExpiryDate(); + + if ( + expiredMemberships.length === 0 && + expiringMemberships.length === 0 && + expiredMembershipsWithoutExpiryDate.length === 0 + ) { + logger.info( + "No expired, expiring, or unprocessed expired memberships found." + ); return; } @@ -78,15 +85,29 @@ export const checkExpiredMemberships = onSchedule( ); const updateResults = await Promise.allSettled( - expiredMembershipsWithoutExpiryDate.map((m) => updateExpiryDateForExpiredMembership(m.id, m.data)) + expiredMembershipsWithoutExpiryDate.map((m) => + updateExpiryDateForExpiredMembership(m.id, m.data) + ) ); - const expiredSuccessful = expiredResults.filter(r => r.status === "fulfilled").length; - const expiredFailed = expiredResults.filter(r => r.status === "rejected").length; - const expiringSuccessful = expiringResults.filter(r => r.status === "fulfilled").length; - const expiringFailed = expiringResults.filter(r => r.status === "rejected").length; - const updateSuccessful = updateResults.filter(r => r.status === "fulfilled").length; - const updateFailed = updateResults.filter(r => r.status === "rejected").length; + const expiredSuccessful = expiredResults.filter( + (r) => r.status === "fulfilled" + ).length; + const expiredFailed = expiredResults.filter( + (r) => r.status === "rejected" + ).length; + const expiringSuccessful = expiringResults.filter( + (r) => r.status === "fulfilled" + ).length; + const expiringFailed = expiringResults.filter( + (r) => r.status === "rejected" + ).length; + const updateSuccessful = updateResults.filter( + (r) => r.status === "fulfilled" + ).length; + const updateFailed = updateResults.filter( + (r) => r.status === "rejected" + ).length; logger.info( `Completed processing. Expired - Success: ${expiredSuccessful}, Failed: ${expiredFailed}. Expiring - Success: ${expiringSuccessful}, Failed: ${expiringFailed}. Updates - Success: ${updateSuccessful}, Failed: ${updateFailed}` @@ -97,9 +118,6 @@ export const checkExpiredMemberships = onSchedule( } ); - - - async function findExpiredMembershipsWithoutExpiryDate(): Promise< Array<{ id: string; data: MembershipData }> > { @@ -110,7 +128,10 @@ async function findExpiredMembershipsWithoutExpiryDate(): Promise< .where("status", "==", "EXPIRED") .get(); - const membershipsWithoutExpiryDate: Array<{ id: string; data: MembershipData }> = []; + const membershipsWithoutExpiryDate: Array<{ + id: string; + data: MembershipData; + }> = []; snapshot.docs.forEach((doc) => { const data = doc.data() as MembershipData; @@ -121,7 +142,10 @@ async function findExpiredMembershipsWithoutExpiryDate(): Promise< return membershipsWithoutExpiryDate; } catch (error) { - logger.error("Error finding expired memberships without expiry date:", error); + logger.error( + "Error finding expired memberships without expiry date:", + error + ); throw error; } } @@ -130,7 +154,10 @@ async function updateExpiryDateForExpiredMembership( membershipData: MembershipData ): Promise { try { - if (!membershipData.subscription || !membershipData.subscription.frequency) { + if ( + !membershipData.subscription || + !membershipData.subscription.frequency + ) { logger.warn(`Skipping membership ${membershipId} - no subscription data`); return; } @@ -156,9 +183,14 @@ async function updateExpiryDateForExpiredMembership( updatedAt: admin.firestore.FieldValue.serverTimestamp(), }); - logger.info(`Updated expiry date for expired membership ${membershipId}: ${expiryDate.toISOString()}`); + logger.info( + `Updated expiry date for expired membership ${membershipId}: ${expiryDate.toISOString()}` + ); } catch (error) { - logger.error(`Error updating expiry date for membership ${membershipId}:`, error); + logger.error( + `Error updating expiry date for membership ${membershipId}:`, + error + ); throw error; } } @@ -1034,4 +1066,4 @@ async function getGymName(gymId: string): Promise { logger.error(`Error getting gym name for gym ${gymId}:`, error); return "Unknown Gym"; } -} \ No newline at end of file +} From ad31bc8e8038a4a44f8afecc55c6e1fb7edf8401 Mon Sep 17 00:00:00 2001 From: Sharon Dcruz Date: Thu, 11 Sep 2025 08:47:46 +0000 Subject: [PATCH 3/3] notification-bug-fix (#114) Co-authored-by: Dhansh A S Reviewed-on: https://git.cosqnet.com/cosqnet/fitlien-services/pulls/114 Reviewed-by: Dhansh A S Co-authored-by: Sharon Dcruz Co-committed-by: Sharon Dcruz --- functions/src/notifications/membershipStatusNotifications.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions/src/notifications/membershipStatusNotifications.ts b/functions/src/notifications/membershipStatusNotifications.ts index 40b5666..cc4f5ae 100644 --- a/functions/src/notifications/membershipStatusNotifications.ts +++ b/functions/src/notifications/membershipStatusNotifications.ts @@ -46,10 +46,11 @@ interface PersonalTrainerAssign { export const checkExpiredMemberships = onSchedule( { - schedule: "0 0,12 * * *", + schedule: "0 8,14,20 * * *", timeZone: "UTC", region: "#{SERVICES_RGN}#", }, + async (event) => { logger.info("Starting scheduled membership expiry check...");