diff --git a/functions/src/memberCache/memberCache.ts b/functions/src/memberCache/memberCache.ts index 71e24b9..e0322fb 100644 --- a/functions/src/memberCache/memberCache.ts +++ b/functions/src/memberCache/memberCache.ts @@ -33,34 +33,26 @@ interface PaymentData { [key: string]: any; } -interface TrainerAssignment { - id?: string; - membershipId?: string; - timeSlot?: any[]; - createdAt?: admin.firestore.Timestamp; - [key: string]: any; -} - -interface CacheEntry { - userId: string; +interface MinimalCacheEntry { membershipId: string; - memberData: { - daysUntilExpiry?: number | null; - hasPartialPayment: boolean; - createdAt?: string | null; - updatedAt?: string | null; - [key: string]: any; - }; - fields: { [key: string]: any }; + userId: string; + status: string; + displayName: string; + email?: string | null; + phoneNumber?: string | null; + alternateContact?: string | null; renewalDate?: string | null; - trainerAssignments: any[]; - timeSlots: any[]; + createdAt?: string | null; + daysUntilExpiry?: number | null; + hasPersonalTraining: boolean; + hasPartialPayment: boolean; + remainingAmount: number; lastUpdated: string; } -interface JsonCacheData { +interface MinimalJsonCacheData { gymId: string; - members: CacheEntry[]; + members: MinimalCacheEntry[]; totalMembers: number; lastUpdated: string; cacheVersion: string; @@ -104,7 +96,7 @@ export const getMemberCache = onRequest( try { const [fileBuffer] = await file.download(); - const jsonData: JsonCacheData = JSON.parse(fileBuffer.toString()); + const jsonData: MinimalJsonCacheData = JSON.parse(fileBuffer.toString()); logger.info( `Retrieved ${jsonData.totalMembers} members from cache for gym ${gymId}` @@ -118,7 +110,7 @@ export const getMemberCache = onRequest( members: [], totalMembers: 0, lastUpdated: new Date().toISOString(), - cacheVersion: "2.0", + cacheVersion: "3.0", }); } } catch (error) { @@ -166,8 +158,8 @@ export const updateMemberCache = onRequest( } for gym: ${gymId}` ); - let members: CacheEntry[] = []; - let existingData: JsonCacheData | null = null; + let members: MinimalCacheEntry[] = []; + let existingData: MinimalJsonCacheData | null = null; if (incrementalUpdate) { try { @@ -197,15 +189,15 @@ export const updateMemberCache = onRequest( if (incrementalUpdate && membershipIds && Array.isArray(membershipIds)) { await updateSpecificMembers(gymId, membershipIds, members); } else { - members = await fetchAllMembers(gymId); + members = await fetchAllMinimalMembers(gymId); } - const jsonData: JsonCacheData = { + const jsonData: MinimalJsonCacheData = { gymId, members, totalMembers: members.length, lastUpdated: new Date().toISOString(), - cacheVersion: "2.0", + cacheVersion: "3.0", }; await saveCacheToStorage(gymId, jsonData); @@ -234,8 +226,8 @@ export const updateMemberCache = onRequest( } ); -async function fetchAllMembers(gymId: string): Promise { - const members: CacheEntry[] = []; +async function fetchAllMinimalMembers(gymId: string): Promise { + const members: MinimalCacheEntry[] = []; const membershipsSnapshot = await app .firestore() @@ -258,7 +250,7 @@ async function fetchAllMembers(gymId: string): Promise { ); return null; } - return await generateCacheEntry(userId, doc.id, membershipData); + return await generateMinimalCacheEntry(userId, doc.id, membershipData); } catch (error) { logger.error(`Error processing member ${doc.id}:`, error); return null; @@ -267,7 +259,7 @@ async function fetchAllMembers(gymId: string): Promise { const batchResults = await Promise.all(batchPromises); const validResults = batchResults.filter( - (member): member is CacheEntry => member !== null + (member): member is MinimalCacheEntry => member !== null ); members.push(...validResults); } @@ -278,7 +270,7 @@ async function fetchAllMembers(gymId: string): Promise { async function updateSpecificMembers( gymId: string, membershipIds: string[], - existingMembers: CacheEntry[] + existingMembers: MinimalCacheEntry[] ): Promise { logger.info(`Updating ${membershipIds.length} specific members`); @@ -319,7 +311,7 @@ async function updateSpecificMembers( ); return null; } - return await generateCacheEntry(userId, doc.id, membershipData); + return await generateMinimalCacheEntry(userId, doc.id, membershipData); } catch (error) { logger.error(`Error processing member ${doc.id}:`, error); return null; @@ -345,7 +337,7 @@ async function updateSpecificMembers( async function saveCacheToStorage( gymId: string, - jsonData: JsonCacheData + jsonData: MinimalJsonCacheData ): Promise { const fileName = `${CACHE_FOLDER}/${gymId}.json`; const file = app.storage().bucket().file(fileName); @@ -363,13 +355,18 @@ async function saveCacheToStorage( }); } -async function generateCacheEntry( +async function generateMinimalCacheEntry( userId: string, membershipId: string, membershipData: MembershipData -): Promise { +): Promise { try { - let fields: { [key: string]: string } = {}; + let firstName = ''; + let lastName = ''; + let email = ''; + let phoneNumber = ''; + let alternateContact = ''; + try { const clientFieldsSnapshot = await app .firestore() @@ -381,12 +378,12 @@ async function generateCacheEntry( const fieldDoc = clientFieldsSnapshot.docs[0]; const fieldData = fieldDoc.data() as ClientFields; - fields = { ...fieldData.fields }; - Object.keys(fieldData).forEach((key) => { - if (key !== "fields" && !fields[key]) { - fields[key] = fieldData[key]; - } - }); + const fields = fieldData.fields || {}; + firstName = fields['first-name'] || fieldData['first-name'] || ''; + lastName = fields['last-name'] || fieldData['last-name'] || ''; + email = fields['email'] || fieldData['email'] || ''; + phoneNumber = fields['phone-number'] || fieldData['phone-number'] || ''; + alternateContact = fields['alternate-contact'] || fieldData['alternate-contact'] || ''; } } catch (error) { logger.error(`Error getting fields for user ${userId}:`, error); @@ -431,60 +428,35 @@ async function generateCacheEntry( } } + const displayName = firstName.length === 0 ? 'Unknown' : + (lastName.length === 0 ? firstName : `${firstName} ${lastName}`); + const isPartial = membershipData.isPartialPayment === true; const remaining = membershipData.remainingAmount || 0; const hasPartialPayment = isPartial && remaining > 0; - let trainerAssignments: any[] = []; - let timeSlots: any[] = []; - - if (membershipData.subscription?.hasPersonalTraining) { - try { - const assignmentsSnapshot = await app - .firestore() - .collection("personal_trainer_assignments") - .where("membershipId", "==", membershipId) - .get(); - - assignmentsSnapshot.docs.forEach((doc) => { - const data = doc.data() as TrainerAssignment; - if (data.timeSlot && Array.isArray(data.timeSlot)) { - timeSlots.push(...data.timeSlot); - } - trainerAssignments.push({ id: doc.id, ...data }); - }); - } catch (error) { - logger.error( - `Error getting trainer data for membership ${membershipId}:`, - error - ); - } - } - - const cacheEntry: CacheEntry = { - userId, + const minimalEntry: MinimalCacheEntry = { membershipId, - memberData: { - ...membershipData, - hasPartialPayment, - daysUntilExpiry, - createdAt: membershipData.createdAt - ? membershipData.createdAt.toDate().toISOString() - : null, - updatedAt: membershipData.updatedAt - ? membershipData.updatedAt.toDate().toISOString() - : null, - }, - fields, + userId, + status: membershipData.status || 'N/A', + displayName, + email: email || null, + phoneNumber: phoneNumber || null, + alternateContact: alternateContact || null, renewalDate: renewalDate ? renewalDate.toISOString() : null, - trainerAssignments, - timeSlots, + createdAt: membershipData.createdAt + ? membershipData.createdAt.toDate().toISOString() + : null, + daysUntilExpiry, + hasPersonalTraining: membershipData.subscription?.hasPersonalTraining === true, + hasPartialPayment, + remainingAmount: remaining, lastUpdated: new Date().toISOString(), }; - return cacheEntry; + return minimalEntry; } catch (error) { - logger.error("Error generating cache entry:", error); + logger.error("Error generating minimal cache entry:", error); throw error; } } @@ -523,4 +495,4 @@ function calculateRenewalDateTimeFromPayment( default: return new Date(Date.now() + 30 * 24 * 60 * 60 * 1000); } -} +} \ No newline at end of file