Compare commits

..

No commits in common. "61f0d29f37cd31ed265f9eaf804ce8a67ac2a5d3" and "5ca05c64909abe29fce2203c80808730049dc03a" have entirely different histories.

2 changed files with 30 additions and 54 deletions

View File

@ -46,11 +46,10 @@ interface PersonalTrainerAssign {
export const checkExpiredMemberships = onSchedule( export const checkExpiredMemberships = onSchedule(
{ {
schedule: "0 8,14,20 * * *", schedule: "*/5 * * * *",
timeZone: "UTC", timeZone: "UTC",
region: "#{SERVICES_RGN}#", region: "#{SERVICES_RGN}#",
}, },
async (event) => { async (event) => {
logger.info("Starting scheduled membership expiry check..."); logger.info("Starting scheduled membership expiry check...");
@ -59,17 +58,10 @@ export const checkExpiredMemberships = onSchedule(
const expiredMemberships = await findExpiredMemberships(); const expiredMemberships = await findExpiredMemberships();
const expiringMemberships = await findMembershipsExpiringIn10Days(); const expiringMemberships = await findMembershipsExpiringIn10Days();
const expiredMembershipsWithoutExpiryDate = const expiredMembershipsWithoutExpiryDate = await findExpiredMembershipsWithoutExpiryDate();
await findExpiredMembershipsWithoutExpiryDate();
if ( if (expiredMemberships.length === 0 && expiringMemberships.length === 0 && expiredMembershipsWithoutExpiryDate.length === 0) {
expiredMemberships.length === 0 && logger.info("No expired, expiring, or unprocessed expired memberships found.");
expiringMemberships.length === 0 &&
expiredMembershipsWithoutExpiryDate.length === 0
) {
logger.info(
"No expired, expiring, or unprocessed expired memberships found."
);
return; return;
} }
@ -86,29 +78,15 @@ export const checkExpiredMemberships = onSchedule(
); );
const updateResults = await Promise.allSettled( const updateResults = await Promise.allSettled(
expiredMembershipsWithoutExpiryDate.map((m) => expiredMembershipsWithoutExpiryDate.map((m) => updateExpiryDateForExpiredMembership(m.id, m.data))
updateExpiryDateForExpiredMembership(m.id, m.data)
)
); );
const expiredSuccessful = expiredResults.filter( const expiredSuccessful = expiredResults.filter(r => r.status === "fulfilled").length;
(r) => r.status === "fulfilled" const expiredFailed = expiredResults.filter(r => r.status === "rejected").length;
).length; const expiringSuccessful = expiringResults.filter(r => r.status === "fulfilled").length;
const expiredFailed = expiredResults.filter( const expiringFailed = expiringResults.filter(r => r.status === "rejected").length;
(r) => r.status === "rejected" const updateSuccessful = updateResults.filter(r => r.status === "fulfilled").length;
).length; const updateFailed = updateResults.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( logger.info(
`Completed processing. Expired - Success: ${expiredSuccessful}, Failed: ${expiredFailed}. Expiring - Success: ${expiringSuccessful}, Failed: ${expiringFailed}. Updates - Success: ${updateSuccessful}, Failed: ${updateFailed}` `Completed processing. Expired - Success: ${expiredSuccessful}, Failed: ${expiredFailed}. Expiring - Success: ${expiringSuccessful}, Failed: ${expiringFailed}. Updates - Success: ${updateSuccessful}, Failed: ${updateFailed}`
@ -119,6 +97,9 @@ export const checkExpiredMemberships = onSchedule(
} }
); );
async function findExpiredMembershipsWithoutExpiryDate(): Promise< async function findExpiredMembershipsWithoutExpiryDate(): Promise<
Array<{ id: string; data: MembershipData }> Array<{ id: string; data: MembershipData }>
> { > {
@ -129,10 +110,7 @@ async function findExpiredMembershipsWithoutExpiryDate(): Promise<
.where("status", "==", "EXPIRED") .where("status", "==", "EXPIRED")
.get(); .get();
const membershipsWithoutExpiryDate: Array<{ const membershipsWithoutExpiryDate: Array<{ id: string; data: MembershipData }> = [];
id: string;
data: MembershipData;
}> = [];
snapshot.docs.forEach((doc) => { snapshot.docs.forEach((doc) => {
const data = doc.data() as MembershipData; const data = doc.data() as MembershipData;
@ -143,10 +121,7 @@ async function findExpiredMembershipsWithoutExpiryDate(): Promise<
return membershipsWithoutExpiryDate; return membershipsWithoutExpiryDate;
} catch (error) { } catch (error) {
logger.error( logger.error("Error finding expired memberships without expiry date:", error);
"Error finding expired memberships without expiry date:",
error
);
throw error; throw error;
} }
} }
@ -155,10 +130,7 @@ async function updateExpiryDateForExpiredMembership(
membershipData: MembershipData membershipData: MembershipData
): Promise<void> { ): Promise<void> {
try { try {
if ( if (!membershipData.subscription || !membershipData.subscription.frequency) {
!membershipData.subscription ||
!membershipData.subscription.frequency
) {
logger.warn(`Skipping membership ${membershipId} - no subscription data`); logger.warn(`Skipping membership ${membershipId} - no subscription data`);
return; return;
} }
@ -184,14 +156,9 @@ async function updateExpiryDateForExpiredMembership(
updatedAt: admin.firestore.FieldValue.serverTimestamp(), updatedAt: admin.firestore.FieldValue.serverTimestamp(),
}); });
logger.info( logger.info(`Updated expiry date for expired membership ${membershipId}: ${expiryDate.toISOString()}`);
`Updated expiry date for expired membership ${membershipId}: ${expiryDate.toISOString()}`
);
} catch (error) { } catch (error) {
logger.error( logger.error(`Error updating expiry date for membership ${membershipId}:`, error);
`Error updating expiry date for membership ${membershipId}:`,
error
);
throw error; throw error;
} }
} }

View File

@ -82,6 +82,15 @@ async function getUserAndFCMToken(
if (notification.recipientId) { if (notification.recipientId) {
targetUserId = notification.recipientId; targetUserId = notification.recipientId;
logger.info(`Using top-level recipientId: ${targetUserId}`); 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) { } else if (notification.data?.phoneNumber) {
logger.info( logger.info(
`Looking up user by phone number from data: ${notification.data.phoneNumber}` `Looking up user by phone number from data: ${notification.data.phoneNumber}`