@blackcode_sa/metaestetics-api 1.14.28 → 1.14.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -11188,17 +11188,27 @@ var BookingAdmin = class {
11188
11188
  startTime: start.toDate().toISOString(),
11189
11189
  endTime: end.toDate().toISOString()
11190
11190
  });
11191
- const MAX_EVENT_DURATION_MS = 24 * 60 * 60 * 1e3;
11191
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1e3;
11192
11192
  const queryStart = admin16.firestore.Timestamp.fromMillis(
11193
11193
  start.toMillis() - MAX_EVENT_DURATION_MS
11194
11194
  );
11195
- const eventsRef = this.db.collection(`clinics/${clinicId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<", end).orderBy("eventTime.start");
11195
+ const eventsRef = this.db.collection(`clinics/${clinicId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<=", end).orderBy("eventTime.start");
11196
11196
  const snapshot = await eventsRef.get();
11197
11197
  const events = snapshot.docs.map((doc3) => ({
11198
11198
  ...doc3.data(),
11199
11199
  id: doc3.id
11200
11200
  })).filter((event) => {
11201
- return event.eventTime.end.toMillis() > start.toMillis();
11201
+ const overlaps = event.eventTime.end.toMillis() > start.toMillis();
11202
+ if (!overlaps) {
11203
+ Logger.debug("[BookingAdmin] Filtered out non-overlapping event", {
11204
+ eventId: event.id,
11205
+ eventStart: event.eventTime.start.toDate().toISOString(),
11206
+ eventEnd: event.eventTime.end.toDate().toISOString(),
11207
+ queryStart: start.toDate().toISOString(),
11208
+ queryEnd: end.toDate().toISOString()
11209
+ });
11210
+ }
11211
+ return overlaps;
11202
11212
  });
11203
11213
  Logger.debug("[BookingAdmin] Retrieved clinic calendar events", {
11204
11214
  clinicId,
@@ -11234,17 +11244,27 @@ var BookingAdmin = class {
11234
11244
  startTime: start.toDate().toISOString(),
11235
11245
  endTime: end.toDate().toISOString()
11236
11246
  });
11237
- const MAX_EVENT_DURATION_MS = 24 * 60 * 60 * 1e3;
11247
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1e3;
11238
11248
  const queryStart = admin16.firestore.Timestamp.fromMillis(
11239
11249
  start.toMillis() - MAX_EVENT_DURATION_MS
11240
11250
  );
11241
- const eventsRef = this.db.collection(`practitioners/${practitionerId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<", end).orderBy("eventTime.start");
11251
+ const eventsRef = this.db.collection(`practitioners/${practitionerId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<=", end).orderBy("eventTime.start");
11242
11252
  const snapshot = await eventsRef.get();
11243
11253
  const events = snapshot.docs.map((doc3) => ({
11244
11254
  ...doc3.data(),
11245
11255
  id: doc3.id
11246
11256
  })).filter((event) => {
11247
- return event.eventTime.end.toMillis() > start.toMillis();
11257
+ const overlaps = event.eventTime.end.toMillis() > start.toMillis();
11258
+ if (!overlaps) {
11259
+ Logger.debug("[BookingAdmin] Filtered out non-overlapping practitioner event", {
11260
+ eventId: event.id,
11261
+ eventStart: event.eventTime.start.toDate().toISOString(),
11262
+ eventEnd: event.eventTime.end.toDate().toISOString(),
11263
+ queryStart: start.toDate().toISOString(),
11264
+ queryEnd: end.toDate().toISOString()
11265
+ });
11266
+ }
11267
+ return overlaps;
11248
11268
  });
11249
11269
  Logger.debug("[BookingAdmin] Retrieved practitioner calendar events", {
11250
11270
  practitionerId,
@@ -11115,17 +11115,27 @@ var BookingAdmin = class {
11115
11115
  startTime: start.toDate().toISOString(),
11116
11116
  endTime: end.toDate().toISOString()
11117
11117
  });
11118
- const MAX_EVENT_DURATION_MS = 24 * 60 * 60 * 1e3;
11118
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1e3;
11119
11119
  const queryStart = admin16.firestore.Timestamp.fromMillis(
11120
11120
  start.toMillis() - MAX_EVENT_DURATION_MS
11121
11121
  );
11122
- const eventsRef = this.db.collection(`clinics/${clinicId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<", end).orderBy("eventTime.start");
11122
+ const eventsRef = this.db.collection(`clinics/${clinicId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<=", end).orderBy("eventTime.start");
11123
11123
  const snapshot = await eventsRef.get();
11124
11124
  const events = snapshot.docs.map((doc3) => ({
11125
11125
  ...doc3.data(),
11126
11126
  id: doc3.id
11127
11127
  })).filter((event) => {
11128
- return event.eventTime.end.toMillis() > start.toMillis();
11128
+ const overlaps = event.eventTime.end.toMillis() > start.toMillis();
11129
+ if (!overlaps) {
11130
+ Logger.debug("[BookingAdmin] Filtered out non-overlapping event", {
11131
+ eventId: event.id,
11132
+ eventStart: event.eventTime.start.toDate().toISOString(),
11133
+ eventEnd: event.eventTime.end.toDate().toISOString(),
11134
+ queryStart: start.toDate().toISOString(),
11135
+ queryEnd: end.toDate().toISOString()
11136
+ });
11137
+ }
11138
+ return overlaps;
11129
11139
  });
11130
11140
  Logger.debug("[BookingAdmin] Retrieved clinic calendar events", {
11131
11141
  clinicId,
@@ -11161,17 +11171,27 @@ var BookingAdmin = class {
11161
11171
  startTime: start.toDate().toISOString(),
11162
11172
  endTime: end.toDate().toISOString()
11163
11173
  });
11164
- const MAX_EVENT_DURATION_MS = 24 * 60 * 60 * 1e3;
11174
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1e3;
11165
11175
  const queryStart = admin16.firestore.Timestamp.fromMillis(
11166
11176
  start.toMillis() - MAX_EVENT_DURATION_MS
11167
11177
  );
11168
- const eventsRef = this.db.collection(`practitioners/${practitionerId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<", end).orderBy("eventTime.start");
11178
+ const eventsRef = this.db.collection(`practitioners/${practitionerId}/calendar`).where("eventTime.start", ">=", queryStart).where("eventTime.start", "<=", end).orderBy("eventTime.start");
11169
11179
  const snapshot = await eventsRef.get();
11170
11180
  const events = snapshot.docs.map((doc3) => ({
11171
11181
  ...doc3.data(),
11172
11182
  id: doc3.id
11173
11183
  })).filter((event) => {
11174
- return event.eventTime.end.toMillis() > start.toMillis();
11184
+ const overlaps = event.eventTime.end.toMillis() > start.toMillis();
11185
+ if (!overlaps) {
11186
+ Logger.debug("[BookingAdmin] Filtered out non-overlapping practitioner event", {
11187
+ eventId: event.id,
11188
+ eventStart: event.eventTime.start.toDate().toISOString(),
11189
+ eventEnd: event.eventTime.end.toDate().toISOString(),
11190
+ queryStart: start.toDate().toISOString(),
11191
+ queryEnd: end.toDate().toISOString()
11192
+ });
11193
+ }
11194
+ return overlaps;
11175
11195
  });
11176
11196
  Logger.debug("[BookingAdmin] Retrieved practitioner calendar events", {
11177
11197
  practitionerId,
package/dist/index.js CHANGED
@@ -16780,15 +16780,37 @@ async function searchCalendarEventsUtil(db, params) {
16780
16780
  constraints.push((0, import_firestore45.where)("eventType", "==", filters.eventType));
16781
16781
  }
16782
16782
  if (filters.dateRange) {
16783
- constraints.push((0, import_firestore45.where)("eventTime.start", ">=", filters.dateRange.start));
16783
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1e3;
16784
+ const extendedStart = import_firestore45.Timestamp.fromMillis(
16785
+ filters.dateRange.start.toMillis() - MAX_EVENT_DURATION_MS
16786
+ );
16787
+ constraints.push((0, import_firestore45.where)("eventTime.start", ">=", extendedStart));
16784
16788
  constraints.push((0, import_firestore45.where)("eventTime.start", "<=", filters.dateRange.end));
16785
16789
  }
16786
16790
  try {
16787
16791
  const finalQuery = (0, import_firestore45.query)(collectionRef, ...constraints);
16788
16792
  const querySnapshot = await (0, import_firestore45.getDocs)(finalQuery);
16789
- const events = querySnapshot.docs.map(
16793
+ let events = querySnapshot.docs.map(
16790
16794
  (doc47) => ({ id: doc47.id, ...doc47.data() })
16791
16795
  );
16796
+ if (filters.dateRange) {
16797
+ events = events.filter((event) => {
16798
+ const overlaps = event.eventTime.end.toMillis() > filters.dateRange.start.toMillis();
16799
+ if (!overlaps) {
16800
+ console.debug(
16801
+ `[searchCalendarEventsUtil] Filtered out non-overlapping event:`,
16802
+ {
16803
+ eventId: event.id,
16804
+ eventStart: event.eventTime.start.toDate().toISOString(),
16805
+ eventEnd: event.eventTime.end.toDate().toISOString(),
16806
+ queryStart: filters.dateRange.start.toDate().toISOString(),
16807
+ queryEnd: filters.dateRange.end.toDate().toISOString()
16808
+ }
16809
+ );
16810
+ }
16811
+ return overlaps;
16812
+ });
16813
+ }
16792
16814
  return events;
16793
16815
  } catch (error) {
16794
16816
  console.error("Error searching calendar events:", error);
package/dist/index.mjs CHANGED
@@ -16926,15 +16926,37 @@ async function searchCalendarEventsUtil(db, params) {
16926
16926
  constraints.push(where25("eventType", "==", filters.eventType));
16927
16927
  }
16928
16928
  if (filters.dateRange) {
16929
- constraints.push(where25("eventTime.start", ">=", filters.dateRange.start));
16929
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1e3;
16930
+ const extendedStart = Timestamp26.fromMillis(
16931
+ filters.dateRange.start.toMillis() - MAX_EVENT_DURATION_MS
16932
+ );
16933
+ constraints.push(where25("eventTime.start", ">=", extendedStart));
16930
16934
  constraints.push(where25("eventTime.start", "<=", filters.dateRange.end));
16931
16935
  }
16932
16936
  try {
16933
16937
  const finalQuery = query25(collectionRef, ...constraints);
16934
16938
  const querySnapshot = await getDocs25(finalQuery);
16935
- const events = querySnapshot.docs.map(
16939
+ let events = querySnapshot.docs.map(
16936
16940
  (doc47) => ({ id: doc47.id, ...doc47.data() })
16937
16941
  );
16942
+ if (filters.dateRange) {
16943
+ events = events.filter((event) => {
16944
+ const overlaps = event.eventTime.end.toMillis() > filters.dateRange.start.toMillis();
16945
+ if (!overlaps) {
16946
+ console.debug(
16947
+ `[searchCalendarEventsUtil] Filtered out non-overlapping event:`,
16948
+ {
16949
+ eventId: event.id,
16950
+ eventStart: event.eventTime.start.toDate().toISOString(),
16951
+ eventEnd: event.eventTime.end.toDate().toISOString(),
16952
+ queryStart: filters.dateRange.start.toDate().toISOString(),
16953
+ queryEnd: filters.dateRange.end.toDate().toISOString()
16954
+ }
16955
+ );
16956
+ }
16957
+ return overlaps;
16958
+ });
16959
+ }
16938
16960
  return events;
16939
16961
  } catch (error) {
16940
16962
  console.error("Error searching calendar events:", error);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@blackcode_sa/metaestetics-api",
3
3
  "private": false,
4
- "version": "1.14.28",
4
+ "version": "1.14.29",
5
5
  "description": "Firebase authentication service with anonymous upgrade support",
6
6
  "main": "dist/index.js",
7
7
  "module": "dist/index.mjs",
@@ -339,26 +339,44 @@ export class BookingAdmin {
339
339
  endTime: end.toDate().toISOString(),
340
340
  });
341
341
 
342
- const MAX_EVENT_DURATION_MS = 24 * 60 * 60 * 1000;
342
+ // Increased to 30 days to handle long blocking events (e.g., holidays, extended time off)
343
+ // This ensures we catch blocking events that start before our query range but overlap with it
344
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1000;
343
345
  const queryStart = admin.firestore.Timestamp.fromMillis(
344
346
  start.toMillis() - MAX_EVENT_DURATION_MS
345
347
  );
346
348
 
349
+ // Query for events that:
350
+ // 1. Start before or during our query range (eventTime.start < end)
351
+ // 2. We'll post-filter to ensure they overlap (eventTime.end > start)
347
352
  const eventsRef = this.db
348
353
  .collection(`clinics/${clinicId}/calendar`)
349
354
  .where("eventTime.start", ">=", queryStart)
350
- .where("eventTime.start", "<", end)
355
+ .where("eventTime.start", "<=", end)
351
356
  .orderBy("eventTime.start");
352
357
 
353
358
  const snapshot = await eventsRef.get();
354
359
 
360
+ // Post-filter to ensure events actually overlap with our query range
361
+ // An event overlaps if: eventTime.start < queryEnd AND eventTime.end > queryStart
355
362
  const events = snapshot.docs
356
363
  .map((doc) => ({
357
364
  ...doc.data(),
358
365
  id: doc.id,
359
366
  }))
360
367
  .filter((event: any) => {
361
- return event.eventTime.end.toMillis() > start.toMillis();
368
+ // Event overlaps if it ends after our start time
369
+ const overlaps = event.eventTime.end.toMillis() > start.toMillis();
370
+ if (!overlaps) {
371
+ Logger.debug("[BookingAdmin] Filtered out non-overlapping event", {
372
+ eventId: event.id,
373
+ eventStart: event.eventTime.start.toDate().toISOString(),
374
+ eventEnd: event.eventTime.end.toDate().toISOString(),
375
+ queryStart: start.toDate().toISOString(),
376
+ queryEnd: end.toDate().toISOString(),
377
+ });
378
+ }
379
+ return overlaps;
362
380
  });
363
381
 
364
382
  Logger.debug("[BookingAdmin] Retrieved clinic calendar events", {
@@ -403,26 +421,44 @@ export class BookingAdmin {
403
421
  endTime: end.toDate().toISOString(),
404
422
  });
405
423
 
406
- const MAX_EVENT_DURATION_MS = 24 * 60 * 60 * 1000;
424
+ // Increased to 30 days to handle long blocking events (e.g., holidays, extended time off)
425
+ // This ensures we catch blocking events that start before our query range but overlap with it
426
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1000;
407
427
  const queryStart = admin.firestore.Timestamp.fromMillis(
408
428
  start.toMillis() - MAX_EVENT_DURATION_MS
409
429
  );
410
430
 
431
+ // Query for events that:
432
+ // 1. Start before or during our query range (eventTime.start <= end)
433
+ // 2. We'll post-filter to ensure they overlap (eventTime.end > start)
411
434
  const eventsRef = this.db
412
435
  .collection(`practitioners/${practitionerId}/calendar`)
413
436
  .where("eventTime.start", ">=", queryStart)
414
- .where("eventTime.start", "<", end)
437
+ .where("eventTime.start", "<=", end)
415
438
  .orderBy("eventTime.start");
416
439
 
417
440
  const snapshot = await eventsRef.get();
418
441
 
442
+ // Post-filter to ensure events actually overlap with our query range
443
+ // An event overlaps if: eventTime.start < queryEnd AND eventTime.end > queryStart
419
444
  const events = snapshot.docs
420
445
  .map((doc) => ({
421
446
  ...doc.data(),
422
447
  id: doc.id,
423
448
  }))
424
449
  .filter((event: any) => {
425
- return event.eventTime.end.toMillis() > start.toMillis();
450
+ // Event overlaps if it ends after our start time
451
+ const overlaps = event.eventTime.end.toMillis() > start.toMillis();
452
+ if (!overlaps) {
453
+ Logger.debug("[BookingAdmin] Filtered out non-overlapping practitioner event", {
454
+ eventId: event.id,
455
+ eventStart: event.eventTime.start.toDate().toISOString(),
456
+ eventEnd: event.eventTime.end.toDate().toISOString(),
457
+ queryStart: start.toDate().toISOString(),
458
+ queryEnd: end.toDate().toISOString(),
459
+ });
460
+ }
461
+ return overlaps;
426
462
  });
427
463
 
428
464
  Logger.debug("[BookingAdmin] Retrieved practitioner calendar events", {
@@ -622,7 +622,15 @@ export async function searchCalendarEventsUtil(
622
622
  }
623
623
  if (filters.dateRange) {
624
624
  // Firestore requires range filters on the same field
625
- constraints.push(where("eventTime.start", ">=", filters.dateRange.start));
625
+ // We query for events that start within or before the date range
626
+ // Then post-filter to ensure they overlap (eventTime.end > dateRange.start)
627
+ // To catch events that start before but overlap, we extend the query start backwards
628
+ const MAX_EVENT_DURATION_MS = 30 * 24 * 60 * 60 * 1000; // 30 days for long blocking events
629
+ const extendedStart = Timestamp.fromMillis(
630
+ filters.dateRange.start.toMillis() - MAX_EVENT_DURATION_MS
631
+ );
632
+
633
+ constraints.push(where("eventTime.start", ">=", extendedStart));
626
634
  constraints.push(where("eventTime.start", "<=", filters.dateRange.end));
627
635
  // Note: You might need to order by eventTime.start for range filters to work efficiently
628
636
  // constraints.push(orderBy("eventTime.start"));
@@ -633,10 +641,32 @@ export async function searchCalendarEventsUtil(
633
641
  const finalQuery = query(collectionRef, ...constraints);
634
642
  const querySnapshot = await getDocs(finalQuery);
635
643
 
636
- const events = querySnapshot.docs.map(
644
+ let events = querySnapshot.docs.map(
637
645
  (doc) => ({ id: doc.id, ...doc.data() } as CalendarEvent)
638
646
  );
639
647
 
648
+ // Post-filter to ensure events actually overlap with the date range (if provided)
649
+ // An event overlaps if: eventTime.start < dateRange.end AND eventTime.end > dateRange.start
650
+ if (filters.dateRange) {
651
+ events = events.filter((event) => {
652
+ const overlaps =
653
+ event.eventTime.end.toMillis() > filters.dateRange!.start.toMillis();
654
+ if (!overlaps) {
655
+ console.debug(
656
+ `[searchCalendarEventsUtil] Filtered out non-overlapping event:`,
657
+ {
658
+ eventId: event.id,
659
+ eventStart: event.eventTime.start.toDate().toISOString(),
660
+ eventEnd: event.eventTime.end.toDate().toISOString(),
661
+ queryStart: filters.dateRange!.start.toDate().toISOString(),
662
+ queryEnd: filters.dateRange!.end.toDate().toISOString(),
663
+ }
664
+ );
665
+ }
666
+ return overlaps;
667
+ });
668
+ }
669
+
640
670
  return events;
641
671
  } catch (error) {
642
672
  console.error("Error searching calendar events:", error);