notification-bug-fix #106
| @ -57,20 +57,6 @@ | |||||||
|       ] |       ] | ||||||
|     }, |     }, | ||||||
|     |     | ||||||
|     { |  | ||||||
|       "collectionGroup": "gyms", |  | ||||||
|       "queryScope": "COLLECTION", |  | ||||||
|       "fields": [ |  | ||||||
|         { |  | ||||||
|           "fieldPath": "userId", |  | ||||||
|           "order": "ASCENDING" |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "fieldPath": "name", |  | ||||||
|           "order": "ASCENDING" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |     { | ||||||
|       "collectionGroup": "memberships", |       "collectionGroup": "memberships", | ||||||
|       "queryScope": "COLLECTION", |       "queryScope": "COLLECTION", | ||||||
|  | |||||||
| @ -53,6 +53,8 @@ export const checkExpiredMemberships = onSchedule( | |||||||
|     logger.info("Starting scheduled membership expiry check..."); |     logger.info("Starting scheduled membership expiry check..."); | ||||||
| 
 | 
 | ||||||
|     try { |     try { | ||||||
|  | 
 | ||||||
|  |       await updateDaysUntilExpiryForAllMemberships(); | ||||||
|       const expiredMemberships = await findExpiredMemberships(); |       const expiredMemberships = await findExpiredMemberships(); | ||||||
|       const expiringMemberships = await findMembershipsExpiringIn10Days(); |       const expiringMemberships = await findMembershipsExpiringIn10Days(); | ||||||
| 
 | 
 | ||||||
| @ -377,6 +379,100 @@ function calculateRenewalDateFromPayment( | |||||||
|   return renewalDate; |   return renewalDate; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | async function updateDaysUntilExpiryForAllMemberships(): Promise<void> { | ||||||
|  |   try { | ||||||
|  |     logger.info("Starting to update daysUntilExpiry for all active memberships..."); | ||||||
|  |      | ||||||
|  |     const snapshot = await app | ||||||
|  |       .firestore() | ||||||
|  |       .collection("memberships") | ||||||
|  |       .where("status", "==", "ACTIVE") | ||||||
|  |       .get(); | ||||||
|  | 
 | ||||||
|  |     const batchSize = 10; | ||||||
|  |     const docs = snapshot.docs; | ||||||
|  |     let updatedCount = 0; | ||||||
|  | 
 | ||||||
|  |     for (let i = 0; i < docs.length; i += batchSize) { | ||||||
|  |       const batch = docs.slice(i, i + batchSize); | ||||||
|  |       const batchResults = await Promise.allSettled( | ||||||
|  |         batch.map(async (doc) => { | ||||||
|  |           const data = doc.data() as MembershipData; | ||||||
|  |           const daysUntilExpiry = await calculateDaysUntilExpiry(doc.id, data); | ||||||
|  |            | ||||||
|  |           if (daysUntilExpiry !== null) { | ||||||
|  |             await app | ||||||
|  |               .firestore() | ||||||
|  |               .collection("memberships") | ||||||
|  |               .doc(doc.id) | ||||||
|  |               .update({ | ||||||
|  |                 daysUntilExpiry: daysUntilExpiry, | ||||||
|  |                 updatedAt: admin.firestore.FieldValue.serverTimestamp(), | ||||||
|  |               }); | ||||||
|  |             return doc.id; | ||||||
|  |           } | ||||||
|  |           return null; | ||||||
|  |         }) | ||||||
|  |       ); | ||||||
|  | 
 | ||||||
|  |       batchResults.forEach((result) => { | ||||||
|  |         if (result.status === "fulfilled" && result.value) { | ||||||
|  |           updatedCount++; | ||||||
|  |         } | ||||||
|  |       }); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     logger.info(`Updated daysUntilExpiry for ${updatedCount} memberships`); | ||||||
|  |   } catch (error) { | ||||||
|  |     logger.error("Error updating daysUntilExpiry for memberships:", error); | ||||||
|  |     throw error; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | async function calculateDaysUntilExpiry( | ||||||
|  |   membershipId: string, | ||||||
|  |   data: MembershipData | ||||||
|  | ): Promise<number | null> { | ||||||
|  |   try { | ||||||
|  |     if (!data.subscription || !data.subscription.frequency) { | ||||||
|  |       logger.warn( | ||||||
|  |         `Skipping expiry calculation for membership ${membershipId} with missing subscription data.` | ||||||
|  |       ); | ||||||
|  |       return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const payments = await getPaymentsForMembership(membershipId); | ||||||
|  |     if (payments.length === 0) { | ||||||
|  |       logger.warn( | ||||||
|  |         `No payments found for membership ${membershipId}, cannot determine expiry` | ||||||
|  |       ); | ||||||
|  |       return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     const latestPayment = payments[0]; | ||||||
|  |     const startDate = latestPayment.dateTimestamp; | ||||||
|  | 
 | ||||||
|  |     const expiryDate = calculateExpiryDate( | ||||||
|  |       startDate, | ||||||
|  |       data.subscription.frequency | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |     const now = new Date(); | ||||||
|  |     const timeDiff = expiryDate.getTime() - now.getTime(); | ||||||
|  |     const daysUntilExpiry = Math.ceil(timeDiff / (1000 * 3600 * 24)); | ||||||
|  | 
 | ||||||
|  |     return daysUntilExpiry; | ||||||
|  |   } catch (error) { | ||||||
|  |     logger.error( | ||||||
|  |       `Error calculating daysUntilExpiry for membership ${membershipId}:`, | ||||||
|  |       error | ||||||
|  |     ); | ||||||
|  |     return null; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| async function getTrainerAssignmentsForMembership( | async function getTrainerAssignmentsForMembership( | ||||||
|   membershipId: string |   membershipId: string | ||||||
| ): Promise<PersonalTrainerAssign[]> { | ): Promise<PersonalTrainerAssign[]> { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user