I have this code, but some event element are not fetched, how?
const updateEventTimes = async (
productId: string,
product: Product,
db: Db,
teamId: ObjectId,
googleAccessToken?: string
) => {
if (!productId || !product || !googleAccessToken) {
await db.collection('logs').insertOne({
api: 'fetchGoogleCalendar',
createdAt: new Date(),
severity: 'log',
message: 'updateEventTimes failed',
productId,
product,
googleAccessToken,
})
return
}
// Fetch the nextSyncToken from your database
let nextSyncToken = null
let nextPageToken = null
let _eventTimes = { ...product.eventTimes }
_eventTimes = Object.keys(_eventTimes)
.filter((key) => key.length <= 4) // Keep keys that are 4 characters or less
.reduce((obj, key) => {
obj[key] = _eventTimes[key]
return obj
}, {})
do {
let url = `https://www.googleapis.com/calendar/v3/calendars/${product.googleCalendarId}/events?`
if (nextPageToken) {
url += `pageToken=${nextPageToken}`
} else if (nextSyncToken) {
url += `syncToken=${nextSyncToken}`
}
const response = await fetch(url, {
method: 'GET',
headers: {
Authorization: `Bearer ${googleAccessToken}`,
},
})
if (response.ok) {
console.log(
`Google calendar fetched for productId ${productId} at: `,
new Date()
)
const data = await response.json()
await db.collection('logs').insertOne({
api: 'fetchGoogleCalendar',
createdAt: new Date(),
severity: 'log',
message: 'Fetching calendar succeeded',
data,
})
nextPageToken = data.nextPageToken
if (data.nextSyncToken && !nextSyncToken) {
nextSyncToken = data.nextSyncToken
} else if (data.nextSyncToken && nextSyncToken) {
nextSyncToken = null
}
for (let index = 0; index < data.items.length; index++) {
const element = data.items[index]
if (element.etag) {
let newEtag = element.etag.slice(1, -1)
_eventTimes[newEtag] = {
startTime: element.start?.dateTime,
endTime: element.end?.dateTime,
enableSale: true,
additionalInfo: 'foglalt',
}
}
}
} else {
await db.collection('logs').insertOne({
api: 'fetchGoogleCalendar',
createdAt: new Date(),
severity: 'log',
message: 'Fetching calendar failed',
})
const errorText = await response.text()
console.error(
`Error fetching calendar data: ${response.status} - ${errorText}`
)
}
} while (nextPageToken || nextSyncToken)
const dynamicKey = `products.${productId}.eventTimes`
await db
.collection<Team>('teams')
.updateOne({ _id: teamId }, { $set: { [dynamicKey]: _eventTimes } })
console.log(
`Event times inserted to DB for productId: ${productId}, dynamicKey: ${dynamicKey}, teamId: ${teamId}`
)
}