@blackcode_sa/metaestetics-api 1.12.62 → 1.12.64
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.
- package/dist/admin/index.d.mts +4 -2
- package/dist/admin/index.d.ts +4 -2
- package/dist/admin/index.js +4 -45
- package/dist/admin/index.mjs +4 -45
- package/dist/backoffice/index.d.mts +86 -1
- package/dist/backoffice/index.d.ts +86 -1
- package/dist/backoffice/index.js +308 -0
- package/dist/backoffice/index.mjs +306 -0
- package/dist/index.d.mts +99 -3
- package/dist/index.d.ts +99 -3
- package/dist/index.js +545 -281
- package/dist/index.mjs +867 -603
- package/package.json +119 -119
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +128 -128
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1844 -1844
- package/src/admin/aggregation/appointment/index.ts +1 -1
- package/src/admin/aggregation/clinic/README.md +52 -52
- package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +703 -703
- package/src/admin/aggregation/clinic/index.ts +1 -1
- package/src/admin/aggregation/forms/README.md +13 -13
- package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
- package/src/admin/aggregation/forms/index.ts +1 -1
- package/src/admin/aggregation/index.ts +8 -8
- package/src/admin/aggregation/patient/README.md +27 -27
- package/src/admin/aggregation/patient/index.ts +1 -1
- package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
- package/src/admin/aggregation/practitioner/README.md +42 -42
- package/src/admin/aggregation/practitioner/index.ts +1 -1
- package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
- package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
- package/src/admin/aggregation/procedure/README.md +43 -43
- package/src/admin/aggregation/procedure/index.ts +1 -1
- package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
- package/src/admin/aggregation/reviews/index.ts +1 -1
- package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +641 -689
- package/src/admin/booking/README.md +125 -125
- package/src/admin/booking/booking.admin.ts +1037 -1037
- package/src/admin/booking/booking.calculator.ts +712 -712
- package/src/admin/booking/booking.types.ts +59 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +7 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +1 -1
- package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
- package/src/admin/documentation-templates/index.ts +1 -1
- package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
- package/src/admin/free-consultation/index.ts +1 -1
- package/src/admin/index.ts +75 -75
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +95 -95
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
- package/src/admin/mailing/appointment/index.ts +1 -1
- package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
- package/src/admin/mailing/base.mailing.service.ts +208 -208
- package/src/admin/mailing/index.ts +3 -3
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
- package/src/admin/mailing/practitionerInvite/index.ts +2 -2
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
- package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
- package/src/admin/notifications/index.ts +1 -1
- package/src/admin/notifications/notifications.admin.ts +710 -710
- package/src/admin/requirements/README.md +128 -128
- package/src/admin/requirements/index.ts +1 -1
- package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
- package/src/admin/users/index.ts +1 -1
- package/src/admin/users/user-profile.admin.ts +405 -405
- package/src/backoffice/constants/certification.constants.ts +13 -13
- package/src/backoffice/constants/index.ts +1 -1
- package/src/backoffice/errors/backoffice.errors.ts +181 -181
- package/src/backoffice/errors/index.ts +1 -1
- package/src/backoffice/expo-safe/README.md +26 -26
- package/src/backoffice/expo-safe/index.ts +41 -41
- package/src/backoffice/index.ts +5 -5
- package/src/backoffice/services/FIXES_README.md +102 -102
- package/src/backoffice/services/README.md +40 -40
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +318 -318
- package/src/backoffice/services/constants.service.ts +385 -385
- package/src/backoffice/services/documentation-template.service.ts +202 -202
- package/src/backoffice/services/index.ts +11 -8
- package/src/backoffice/services/migrate-products.ts +116 -116
- package/src/backoffice/services/product.service.ts +553 -553
- package/src/backoffice/services/requirement.service.ts +235 -235
- package/src/backoffice/services/subcategory.service.ts +395 -395
- package/src/backoffice/services/technology.service.ts +1083 -1070
- package/src/backoffice/types/README.md +12 -12
- package/src/backoffice/types/admin-constants.types.ts +69 -69
- package/src/backoffice/types/brand.types.ts +29 -29
- package/src/backoffice/types/category.types.ts +62 -62
- package/src/backoffice/types/documentation-templates.types.ts +28 -28
- package/src/backoffice/types/index.ts +10 -10
- package/src/backoffice/types/procedure-product.types.ts +38 -38
- package/src/backoffice/types/product.types.ts +240 -240
- package/src/backoffice/types/requirement.types.ts +63 -63
- package/src/backoffice/types/static/README.md +18 -18
- package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
- package/src/backoffice/types/static/certification.types.ts +37 -37
- package/src/backoffice/types/static/contraindication.types.ts +19 -19
- package/src/backoffice/types/static/index.ts +6 -6
- package/src/backoffice/types/static/pricing.types.ts +16 -16
- package/src/backoffice/types/static/procedure-family.types.ts +14 -14
- package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
- package/src/backoffice/types/subcategory.types.ts +34 -34
- package/src/backoffice/types/technology.types.ts +163 -161
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -163
- package/src/config/__mocks__/firebase.ts +99 -99
- package/src/config/firebase.ts +78 -78
- package/src/config/index.ts +9 -9
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +200 -200
- package/src/errors/clinic.errors.ts +32 -32
- package/src/errors/firebase.errors.ts +47 -47
- package/src/errors/user.errors.ts +99 -99
- package/src/index.backup.ts +407 -407
- package/src/index.ts +6 -6
- package/src/locales/en.ts +31 -31
- package/src/recommender/admin/index.ts +1 -1
- package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
- package/src/recommender/front/index.ts +1 -1
- package/src/recommender/front/services/onboarding.service.ts +5 -5
- package/src/recommender/front/services/recommender.service.ts +3 -3
- package/src/recommender/index.ts +1 -1
- package/src/services/PATIENTAUTH.MD +197 -197
- package/src/services/README.md +106 -106
- package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
- package/src/services/__tests__/auth/auth.setup.ts +293 -293
- package/src/services/__tests__/auth.service.test.ts +346 -346
- package/src/services/__tests__/base.service.test.ts +77 -77
- package/src/services/__tests__/user.service.test.ts +528 -528
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2505 -2082
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +552 -552
- package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
- package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +353 -353
- package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
- package/src/services/auth/auth.service.ts +989 -989
- package/src/services/auth/auth.v2.service.ts +961 -961
- package/src/services/auth/index.ts +7 -7
- package/src/services/auth/utils/error.utils.ts +90 -90
- package/src/services/auth/utils/firebase.utils.ts +49 -49
- package/src/services/auth/utils/index.ts +21 -21
- package/src/services/auth/utils/practitioner.utils.ts +125 -125
- package/src/services/base.service.ts +41 -41
- package/src/services/calendar/calendar.service.ts +1077 -1077
- package/src/services/calendar/calendar.v2.service.ts +1683 -1683
- package/src/services/calendar/calendar.v3.service.ts +313 -313
- package/src/services/calendar/externalCalendar.service.ts +178 -178
- package/src/services/calendar/index.ts +5 -5
- package/src/services/calendar/synced-calendars.service.ts +743 -743
- package/src/services/calendar/utils/appointment.utils.ts +265 -265
- package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
- package/src/services/calendar/utils/clinic.utils.ts +237 -237
- package/src/services/calendar/utils/docs.utils.ts +157 -157
- package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
- package/src/services/calendar/utils/index.ts +8 -8
- package/src/services/calendar/utils/patient.utils.ts +198 -198
- package/src/services/calendar/utils/practitioner.utils.ts +221 -221
- package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
- package/src/services/clinic/README.md +204 -204
- package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
- package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
- package/src/services/clinic/billing-transactions.service.ts +217 -217
- package/src/services/clinic/clinic-admin.service.ts +202 -202
- package/src/services/clinic/clinic-group.service.ts +310 -310
- package/src/services/clinic/clinic.service.ts +708 -708
- package/src/services/clinic/index.ts +5 -5
- package/src/services/clinic/practitioner-invite.service.ts +519 -519
- package/src/services/clinic/utils/admin.utils.ts +551 -551
- package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
- package/src/services/clinic/utils/clinic.utils.ts +949 -949
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +446 -446
- package/src/services/clinic/utils/index.ts +11 -11
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +84 -84
- package/src/services/clinic/utils/tag.utils.ts +124 -124
- package/src/services/documentation-templates/documentation-template.service.ts +537 -537
- package/src/services/documentation-templates/filled-document.service.ts +587 -587
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +13 -13
- package/src/services/media/index.ts +1 -1
- package/src/services/media/media.service.ts +418 -418
- package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
- package/src/services/notifications/index.ts +1 -1
- package/src/services/notifications/notification.service.ts +215 -215
- package/src/services/patient/README.md +48 -48
- package/src/services/patient/To-Do.md +43 -43
- package/src/services/patient/__tests__/patient.service.test.ts +294 -294
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +883 -883
- package/src/services/patient/patientRequirements.service.ts +285 -285
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/clinic.utils.ts +80 -80
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/index.ts +9 -9
- package/src/services/patient/utils/location.utils.ts +126 -126
- package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
- package/src/services/patient/utils/medical.utils.ts +458 -458
- package/src/services/patient/utils/practitioner.utils.ts +260 -260
- package/src/services/patient/utils/profile.utils.ts +510 -510
- package/src/services/patient/utils/sensitive.utils.ts +260 -260
- package/src/services/patient/utils/token.utils.ts +211 -211
- package/src/services/practitioner/README.md +145 -145
- package/src/services/practitioner/index.ts +1 -1
- package/src/services/practitioner/practitioner.service.ts +1742 -1742
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +1682 -1682
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +636 -683
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +489 -489
- package/src/services/user/user.v2.service.ts +466 -466
- package/src/types/appointment/index.ts +481 -453
- package/src/types/calendar/index.ts +258 -258
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +489 -489
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +44 -44
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +265 -265
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/index.ts +275 -273
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +206 -206
- package/src/types/procedure/index.ts +181 -181
- package/src/types/profile/index.ts +39 -39
- package/src/types/reviews/index.ts +130 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +38 -38
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/appointment.schema.ts +574 -574
- package/src/validations/calendar.schema.ts +225 -225
- package/src/validations/clinic.schema.ts +493 -493
- package/src/validations/common.schema.ts +25 -25
- package/src/validations/documentation-templates/index.ts +1 -1
- package/src/validations/documentation-templates/template.schema.ts +220 -220
- package/src/validations/documentation-templates.schema.ts +10 -10
- package/src/validations/index.ts +20 -20
- package/src/validations/media.schema.ts +10 -10
- package/src/validations/notification.schema.ts +90 -90
- package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
- package/src/validations/patient/medical-info.schema.ts +125 -125
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -216
- package/src/validations/practitioner.schema.ts +222 -222
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +124 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/reviews.schema.ts +189 -195
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,345 +1,345 @@
|
|
|
1
|
-
import * as admin from "firebase-admin";
|
|
2
|
-
import { Appointment, APPOINTMENTS_COLLECTION } from "../../types/appointment";
|
|
3
|
-
import {
|
|
4
|
-
CalendarEventStatus,
|
|
5
|
-
CalendarEventTime,
|
|
6
|
-
CALENDAR_COLLECTION,
|
|
7
|
-
} from "../../types/calendar";
|
|
8
|
-
import { Timestamp as FirebaseClientTimestamp } from "@firebase/firestore";
|
|
9
|
-
import { Logger } from "../logger";
|
|
10
|
-
import { PRACTITIONERS_COLLECTION } from "../../types/practitioner";
|
|
11
|
-
import { PATIENTS_COLLECTION } from "../../types/patient";
|
|
12
|
-
import { CLINICS_COLLECTION } from "../../types/clinic";
|
|
13
|
-
import { TimestampUtils } from "../../utils/TimestampUtils";
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* @class CalendarAdminService
|
|
17
|
-
* @description Handles administrative tasks for calendar events linked to appointments,
|
|
18
|
-
* such as status updates, time changes, or deletions, subsequent to their initial creation.
|
|
19
|
-
*/
|
|
20
|
-
export class CalendarAdminService {
|
|
21
|
-
private db: admin.firestore.Firestore;
|
|
22
|
-
|
|
23
|
-
constructor(firestore?: admin.firestore.Firestore) {
|
|
24
|
-
this.db = firestore || admin.firestore();
|
|
25
|
-
Logger.info("[CalendarAdminService] Initialized.");
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Updates the status of all three calendar events (practitioner, patient, clinic)
|
|
30
|
-
* associated with a given appointment.
|
|
31
|
-
*
|
|
32
|
-
* @param appointment - The appointment object containing references to its calendar events.
|
|
33
|
-
* @param newStatus - The new CalendarEventStatus to set.
|
|
34
|
-
* @returns {Promise<void>} A promise that resolves when all updates are attempted.
|
|
35
|
-
*/
|
|
36
|
-
async updateAppointmentCalendarEventsStatus(
|
|
37
|
-
appointment: Appointment,
|
|
38
|
-
newStatus: CalendarEventStatus
|
|
39
|
-
): Promise<void> {
|
|
40
|
-
Logger.info(
|
|
41
|
-
`[CalendarAdminService] Updating calendar event statuses for appointment ${appointment.id} to ${newStatus}`
|
|
42
|
-
);
|
|
43
|
-
const batch = this.db.batch();
|
|
44
|
-
const serverTimestamp = admin.firestore.FieldValue.serverTimestamp();
|
|
45
|
-
let updatesAdded = 0;
|
|
46
|
-
|
|
47
|
-
// Get the shared calendar event ID
|
|
48
|
-
const calendarEventId = appointment.calendarEventId;
|
|
49
|
-
|
|
50
|
-
if (!calendarEventId) {
|
|
51
|
-
Logger.warn(
|
|
52
|
-
`[CalendarAdminService] Missing calendar event ID for appointment ${appointment.id}`
|
|
53
|
-
);
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// Update practitioner calendar event
|
|
58
|
-
if (appointment.practitionerId) {
|
|
59
|
-
const practitionerEventRef = this.db.doc(
|
|
60
|
-
`${PRACTITIONERS_COLLECTION}/${appointment.practitionerId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
61
|
-
);
|
|
62
|
-
batch.update(practitionerEventRef, {
|
|
63
|
-
status: newStatus,
|
|
64
|
-
updatedAt: serverTimestamp,
|
|
65
|
-
});
|
|
66
|
-
updatesAdded++;
|
|
67
|
-
Logger.debug(
|
|
68
|
-
`[CalendarAdminService] Added practitioner calendar event status update to batch`
|
|
69
|
-
);
|
|
70
|
-
} else {
|
|
71
|
-
Logger.warn(
|
|
72
|
-
`[CalendarAdminService] Missing practitioner ID for appointment ${appointment.id}`
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
// Update patient calendar event
|
|
77
|
-
if (appointment.patientId) {
|
|
78
|
-
const patientEventRef = this.db.doc(
|
|
79
|
-
`${PATIENTS_COLLECTION}/${appointment.patientId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
80
|
-
);
|
|
81
|
-
batch.update(patientEventRef, {
|
|
82
|
-
status: newStatus,
|
|
83
|
-
updatedAt: serverTimestamp,
|
|
84
|
-
});
|
|
85
|
-
updatesAdded++;
|
|
86
|
-
Logger.debug(
|
|
87
|
-
`[CalendarAdminService] Added patient calendar event status update to batch`
|
|
88
|
-
);
|
|
89
|
-
} else {
|
|
90
|
-
Logger.warn(
|
|
91
|
-
`[CalendarAdminService] Missing patient ID for appointment ${appointment.id}`
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
// Update clinic calendar event
|
|
96
|
-
if (appointment.clinicBranchId) {
|
|
97
|
-
const clinicEventRef = this.db.doc(
|
|
98
|
-
`${CLINICS_COLLECTION}/${appointment.clinicBranchId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
99
|
-
);
|
|
100
|
-
batch.update(clinicEventRef, {
|
|
101
|
-
status: newStatus,
|
|
102
|
-
updatedAt: serverTimestamp,
|
|
103
|
-
});
|
|
104
|
-
updatesAdded++;
|
|
105
|
-
Logger.debug(
|
|
106
|
-
`[CalendarAdminService] Added clinic calendar event status update to batch`
|
|
107
|
-
);
|
|
108
|
-
} else {
|
|
109
|
-
Logger.warn(
|
|
110
|
-
`[CalendarAdminService] Missing clinic ID for appointment ${appointment.id}`
|
|
111
|
-
);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
// Only commit if we have updates to make
|
|
115
|
-
if (updatesAdded > 0) {
|
|
116
|
-
try {
|
|
117
|
-
await batch.commit();
|
|
118
|
-
Logger.info(
|
|
119
|
-
`[CalendarAdminService] Successfully updated ${updatesAdded} calendar event statuses for appointment ${appointment.id}.`
|
|
120
|
-
);
|
|
121
|
-
} catch (error) {
|
|
122
|
-
Logger.error(
|
|
123
|
-
`[CalendarAdminService] Error updating calendar event statuses for appointment ${appointment.id}:`,
|
|
124
|
-
error
|
|
125
|
-
);
|
|
126
|
-
throw error; // Re-throw to allow caller to handle
|
|
127
|
-
}
|
|
128
|
-
} else {
|
|
129
|
-
Logger.warn(
|
|
130
|
-
`[CalendarAdminService] No calendar event status updates were made for appointment ${appointment.id}`
|
|
131
|
-
);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Updates the eventTime (start and end) of all three calendar events
|
|
137
|
-
* associated with a given appointment.
|
|
138
|
-
*
|
|
139
|
-
* @param appointment - The appointment object.
|
|
140
|
-
* @param newEventTime - The new CalendarEventTime object (using admin.firestore.Timestamp).
|
|
141
|
-
* @returns {Promise<void>} A promise that resolves when all updates are attempted.
|
|
142
|
-
*/
|
|
143
|
-
async updateAppointmentCalendarEventsTime(
|
|
144
|
-
appointment: Appointment,
|
|
145
|
-
newEventTime: {
|
|
146
|
-
start: admin.firestore.Timestamp;
|
|
147
|
-
end: admin.firestore.Timestamp;
|
|
148
|
-
}
|
|
149
|
-
): Promise<void> {
|
|
150
|
-
Logger.info(
|
|
151
|
-
`[CalendarAdminService] Updating calendar event times for appointment ${appointment.id}`
|
|
152
|
-
);
|
|
153
|
-
const batch = this.db.batch();
|
|
154
|
-
const serverTimestamp = admin.firestore.FieldValue.serverTimestamp();
|
|
155
|
-
let updatesAdded = 0;
|
|
156
|
-
|
|
157
|
-
// Get the shared calendar event ID
|
|
158
|
-
const calendarEventId = appointment.calendarEventId;
|
|
159
|
-
|
|
160
|
-
if (!calendarEventId) {
|
|
161
|
-
Logger.warn(
|
|
162
|
-
`[CalendarAdminService] Missing calendar event ID for appointment ${appointment.id}`
|
|
163
|
-
);
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Use the timestamps directly since they are already admin.firestore.Timestamp
|
|
168
|
-
const firestoreCompatibleEventTime = {
|
|
169
|
-
start: newEventTime.start,
|
|
170
|
-
end: newEventTime.end,
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
// Update practitioner calendar event
|
|
174
|
-
if (appointment.practitionerId) {
|
|
175
|
-
const practitionerEventRef = this.db.doc(
|
|
176
|
-
`${PRACTITIONERS_COLLECTION}/${appointment.practitionerId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
177
|
-
);
|
|
178
|
-
batch.update(practitionerEventRef, {
|
|
179
|
-
eventTime: firestoreCompatibleEventTime,
|
|
180
|
-
updatedAt: serverTimestamp,
|
|
181
|
-
});
|
|
182
|
-
updatesAdded++;
|
|
183
|
-
Logger.debug(
|
|
184
|
-
`[CalendarAdminService] Added practitioner calendar event time update to batch`
|
|
185
|
-
);
|
|
186
|
-
} else {
|
|
187
|
-
Logger.warn(
|
|
188
|
-
`[CalendarAdminService] Missing practitioner ID for appointment ${appointment.id}`
|
|
189
|
-
);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
// Update patient calendar event
|
|
193
|
-
if (appointment.patientId) {
|
|
194
|
-
const patientEventRef = this.db.doc(
|
|
195
|
-
`${PATIENTS_COLLECTION}/${appointment.patientId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
196
|
-
);
|
|
197
|
-
batch.update(patientEventRef, {
|
|
198
|
-
eventTime: firestoreCompatibleEventTime,
|
|
199
|
-
updatedAt: serverTimestamp,
|
|
200
|
-
});
|
|
201
|
-
updatesAdded++;
|
|
202
|
-
Logger.debug(
|
|
203
|
-
`[CalendarAdminService] Added patient calendar event time update to batch`
|
|
204
|
-
);
|
|
205
|
-
} else {
|
|
206
|
-
Logger.warn(
|
|
207
|
-
`[CalendarAdminService] Missing patient ID for appointment ${appointment.id}`
|
|
208
|
-
);
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
// Update clinic calendar event
|
|
212
|
-
if (appointment.clinicBranchId) {
|
|
213
|
-
const clinicEventRef = this.db.doc(
|
|
214
|
-
`${CLINICS_COLLECTION}/${appointment.clinicBranchId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
215
|
-
);
|
|
216
|
-
batch.update(clinicEventRef, {
|
|
217
|
-
eventTime: firestoreCompatibleEventTime,
|
|
218
|
-
updatedAt: serverTimestamp,
|
|
219
|
-
});
|
|
220
|
-
updatesAdded++;
|
|
221
|
-
Logger.debug(
|
|
222
|
-
`[CalendarAdminService] Added clinic calendar event time update to batch`
|
|
223
|
-
);
|
|
224
|
-
} else {
|
|
225
|
-
Logger.warn(
|
|
226
|
-
`[CalendarAdminService] Missing clinic ID for appointment ${appointment.id}`
|
|
227
|
-
);
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
// Only commit if we have updates to make
|
|
231
|
-
if (updatesAdded > 0) {
|
|
232
|
-
try {
|
|
233
|
-
await batch.commit();
|
|
234
|
-
Logger.info(
|
|
235
|
-
`[CalendarAdminService] Successfully updated ${updatesAdded} calendar event times for appointment ${appointment.id}.`
|
|
236
|
-
);
|
|
237
|
-
} catch (error) {
|
|
238
|
-
Logger.error(
|
|
239
|
-
`[CalendarAdminService] Error updating calendar event times for appointment ${appointment.id}:`,
|
|
240
|
-
error
|
|
241
|
-
);
|
|
242
|
-
throw error; // Re-throw to allow caller to handle
|
|
243
|
-
}
|
|
244
|
-
} else {
|
|
245
|
-
Logger.warn(
|
|
246
|
-
`[CalendarAdminService] No calendar event time updates were made for appointment ${appointment.id}`
|
|
247
|
-
);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
/**
|
|
252
|
-
* Deletes all three calendar events associated with a given appointment.
|
|
253
|
-
* Note: This is a hard delete. Consider marking as CANCELLED instead if soft delete is preferred.
|
|
254
|
-
*
|
|
255
|
-
* @param appointment - The appointment object.
|
|
256
|
-
* @returns {Promise<void>} A promise that resolves when all deletions are attempted.
|
|
257
|
-
*/
|
|
258
|
-
async deleteAppointmentCalendarEvents(
|
|
259
|
-
appointment: Appointment
|
|
260
|
-
): Promise<void> {
|
|
261
|
-
Logger.info(
|
|
262
|
-
`[CalendarAdminService] Deleting calendar events for appointment ${appointment.id}`
|
|
263
|
-
);
|
|
264
|
-
const batch = this.db.batch();
|
|
265
|
-
let deletesAdded = 0;
|
|
266
|
-
|
|
267
|
-
// Get the shared calendar event ID
|
|
268
|
-
const calendarEventId = appointment.calendarEventId;
|
|
269
|
-
|
|
270
|
-
if (!calendarEventId) {
|
|
271
|
-
Logger.warn(
|
|
272
|
-
`[CalendarAdminService] Missing calendar event ID for appointment ${appointment.id}`
|
|
273
|
-
);
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
// Delete practitioner calendar event
|
|
278
|
-
if (appointment.practitionerId) {
|
|
279
|
-
const practitionerEventRef = this.db.doc(
|
|
280
|
-
`${PRACTITIONERS_COLLECTION}/${appointment.practitionerId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
281
|
-
);
|
|
282
|
-
batch.delete(practitionerEventRef);
|
|
283
|
-
deletesAdded++;
|
|
284
|
-
Logger.debug(
|
|
285
|
-
`[CalendarAdminService] Added practitioner calendar event deletion to batch`
|
|
286
|
-
);
|
|
287
|
-
} else {
|
|
288
|
-
Logger.warn(
|
|
289
|
-
`[CalendarAdminService] Missing practitioner ID for appointment ${appointment.id}`
|
|
290
|
-
);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
// Delete patient calendar event
|
|
294
|
-
if (appointment.patientId) {
|
|
295
|
-
const patientEventRef = this.db.doc(
|
|
296
|
-
`${PATIENTS_COLLECTION}/${appointment.patientId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
297
|
-
);
|
|
298
|
-
batch.delete(patientEventRef);
|
|
299
|
-
deletesAdded++;
|
|
300
|
-
Logger.debug(
|
|
301
|
-
`[CalendarAdminService] Added patient calendar event deletion to batch`
|
|
302
|
-
);
|
|
303
|
-
} else {
|
|
304
|
-
Logger.warn(
|
|
305
|
-
`[CalendarAdminService] Missing patient ID for appointment ${appointment.id}`
|
|
306
|
-
);
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
// Delete clinic calendar event
|
|
310
|
-
if (appointment.clinicBranchId) {
|
|
311
|
-
const clinicEventRef = this.db.doc(
|
|
312
|
-
`${CLINICS_COLLECTION}/${appointment.clinicBranchId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
313
|
-
);
|
|
314
|
-
batch.delete(clinicEventRef);
|
|
315
|
-
deletesAdded++;
|
|
316
|
-
Logger.debug(
|
|
317
|
-
`[CalendarAdminService] Added clinic calendar event deletion to batch`
|
|
318
|
-
);
|
|
319
|
-
} else {
|
|
320
|
-
Logger.warn(
|
|
321
|
-
`[CalendarAdminService] Missing clinic ID for appointment ${appointment.id}`
|
|
322
|
-
);
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
// Only commit if we have deletions to make
|
|
326
|
-
if (deletesAdded > 0) {
|
|
327
|
-
try {
|
|
328
|
-
await batch.commit();
|
|
329
|
-
Logger.info(
|
|
330
|
-
`[CalendarAdminService] Successfully deleted ${deletesAdded} calendar events for appointment ${appointment.id}.`
|
|
331
|
-
);
|
|
332
|
-
} catch (error) {
|
|
333
|
-
Logger.error(
|
|
334
|
-
`[CalendarAdminService] Error deleting calendar events for appointment ${appointment.id}:`,
|
|
335
|
-
error
|
|
336
|
-
);
|
|
337
|
-
throw error; // Re-throw to allow caller to handle
|
|
338
|
-
}
|
|
339
|
-
} else {
|
|
340
|
-
Logger.warn(
|
|
341
|
-
`[CalendarAdminService] No calendar event deletions were made for appointment ${appointment.id}`
|
|
342
|
-
);
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
}
|
|
1
|
+
import * as admin from "firebase-admin";
|
|
2
|
+
import { Appointment, APPOINTMENTS_COLLECTION } from "../../types/appointment";
|
|
3
|
+
import {
|
|
4
|
+
CalendarEventStatus,
|
|
5
|
+
CalendarEventTime,
|
|
6
|
+
CALENDAR_COLLECTION,
|
|
7
|
+
} from "../../types/calendar";
|
|
8
|
+
import { Timestamp as FirebaseClientTimestamp } from "@firebase/firestore";
|
|
9
|
+
import { Logger } from "../logger";
|
|
10
|
+
import { PRACTITIONERS_COLLECTION } from "../../types/practitioner";
|
|
11
|
+
import { PATIENTS_COLLECTION } from "../../types/patient";
|
|
12
|
+
import { CLINICS_COLLECTION } from "../../types/clinic";
|
|
13
|
+
import { TimestampUtils } from "../../utils/TimestampUtils";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* @class CalendarAdminService
|
|
17
|
+
* @description Handles administrative tasks for calendar events linked to appointments,
|
|
18
|
+
* such as status updates, time changes, or deletions, subsequent to their initial creation.
|
|
19
|
+
*/
|
|
20
|
+
export class CalendarAdminService {
|
|
21
|
+
private db: admin.firestore.Firestore;
|
|
22
|
+
|
|
23
|
+
constructor(firestore?: admin.firestore.Firestore) {
|
|
24
|
+
this.db = firestore || admin.firestore();
|
|
25
|
+
Logger.info("[CalendarAdminService] Initialized.");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Updates the status of all three calendar events (practitioner, patient, clinic)
|
|
30
|
+
* associated with a given appointment.
|
|
31
|
+
*
|
|
32
|
+
* @param appointment - The appointment object containing references to its calendar events.
|
|
33
|
+
* @param newStatus - The new CalendarEventStatus to set.
|
|
34
|
+
* @returns {Promise<void>} A promise that resolves when all updates are attempted.
|
|
35
|
+
*/
|
|
36
|
+
async updateAppointmentCalendarEventsStatus(
|
|
37
|
+
appointment: Appointment,
|
|
38
|
+
newStatus: CalendarEventStatus
|
|
39
|
+
): Promise<void> {
|
|
40
|
+
Logger.info(
|
|
41
|
+
`[CalendarAdminService] Updating calendar event statuses for appointment ${appointment.id} to ${newStatus}`
|
|
42
|
+
);
|
|
43
|
+
const batch = this.db.batch();
|
|
44
|
+
const serverTimestamp = admin.firestore.FieldValue.serverTimestamp();
|
|
45
|
+
let updatesAdded = 0;
|
|
46
|
+
|
|
47
|
+
// Get the shared calendar event ID
|
|
48
|
+
const calendarEventId = appointment.calendarEventId;
|
|
49
|
+
|
|
50
|
+
if (!calendarEventId) {
|
|
51
|
+
Logger.warn(
|
|
52
|
+
`[CalendarAdminService] Missing calendar event ID for appointment ${appointment.id}`
|
|
53
|
+
);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Update practitioner calendar event
|
|
58
|
+
if (appointment.practitionerId) {
|
|
59
|
+
const practitionerEventRef = this.db.doc(
|
|
60
|
+
`${PRACTITIONERS_COLLECTION}/${appointment.practitionerId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
61
|
+
);
|
|
62
|
+
batch.update(practitionerEventRef, {
|
|
63
|
+
status: newStatus,
|
|
64
|
+
updatedAt: serverTimestamp,
|
|
65
|
+
});
|
|
66
|
+
updatesAdded++;
|
|
67
|
+
Logger.debug(
|
|
68
|
+
`[CalendarAdminService] Added practitioner calendar event status update to batch`
|
|
69
|
+
);
|
|
70
|
+
} else {
|
|
71
|
+
Logger.warn(
|
|
72
|
+
`[CalendarAdminService] Missing practitioner ID for appointment ${appointment.id}`
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Update patient calendar event
|
|
77
|
+
if (appointment.patientId) {
|
|
78
|
+
const patientEventRef = this.db.doc(
|
|
79
|
+
`${PATIENTS_COLLECTION}/${appointment.patientId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
80
|
+
);
|
|
81
|
+
batch.update(patientEventRef, {
|
|
82
|
+
status: newStatus,
|
|
83
|
+
updatedAt: serverTimestamp,
|
|
84
|
+
});
|
|
85
|
+
updatesAdded++;
|
|
86
|
+
Logger.debug(
|
|
87
|
+
`[CalendarAdminService] Added patient calendar event status update to batch`
|
|
88
|
+
);
|
|
89
|
+
} else {
|
|
90
|
+
Logger.warn(
|
|
91
|
+
`[CalendarAdminService] Missing patient ID for appointment ${appointment.id}`
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Update clinic calendar event
|
|
96
|
+
if (appointment.clinicBranchId) {
|
|
97
|
+
const clinicEventRef = this.db.doc(
|
|
98
|
+
`${CLINICS_COLLECTION}/${appointment.clinicBranchId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
99
|
+
);
|
|
100
|
+
batch.update(clinicEventRef, {
|
|
101
|
+
status: newStatus,
|
|
102
|
+
updatedAt: serverTimestamp,
|
|
103
|
+
});
|
|
104
|
+
updatesAdded++;
|
|
105
|
+
Logger.debug(
|
|
106
|
+
`[CalendarAdminService] Added clinic calendar event status update to batch`
|
|
107
|
+
);
|
|
108
|
+
} else {
|
|
109
|
+
Logger.warn(
|
|
110
|
+
`[CalendarAdminService] Missing clinic ID for appointment ${appointment.id}`
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Only commit if we have updates to make
|
|
115
|
+
if (updatesAdded > 0) {
|
|
116
|
+
try {
|
|
117
|
+
await batch.commit();
|
|
118
|
+
Logger.info(
|
|
119
|
+
`[CalendarAdminService] Successfully updated ${updatesAdded} calendar event statuses for appointment ${appointment.id}.`
|
|
120
|
+
);
|
|
121
|
+
} catch (error) {
|
|
122
|
+
Logger.error(
|
|
123
|
+
`[CalendarAdminService] Error updating calendar event statuses for appointment ${appointment.id}:`,
|
|
124
|
+
error
|
|
125
|
+
);
|
|
126
|
+
throw error; // Re-throw to allow caller to handle
|
|
127
|
+
}
|
|
128
|
+
} else {
|
|
129
|
+
Logger.warn(
|
|
130
|
+
`[CalendarAdminService] No calendar event status updates were made for appointment ${appointment.id}`
|
|
131
|
+
);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Updates the eventTime (start and end) of all three calendar events
|
|
137
|
+
* associated with a given appointment.
|
|
138
|
+
*
|
|
139
|
+
* @param appointment - The appointment object.
|
|
140
|
+
* @param newEventTime - The new CalendarEventTime object (using admin.firestore.Timestamp).
|
|
141
|
+
* @returns {Promise<void>} A promise that resolves when all updates are attempted.
|
|
142
|
+
*/
|
|
143
|
+
async updateAppointmentCalendarEventsTime(
|
|
144
|
+
appointment: Appointment,
|
|
145
|
+
newEventTime: {
|
|
146
|
+
start: admin.firestore.Timestamp;
|
|
147
|
+
end: admin.firestore.Timestamp;
|
|
148
|
+
}
|
|
149
|
+
): Promise<void> {
|
|
150
|
+
Logger.info(
|
|
151
|
+
`[CalendarAdminService] Updating calendar event times for appointment ${appointment.id}`
|
|
152
|
+
);
|
|
153
|
+
const batch = this.db.batch();
|
|
154
|
+
const serverTimestamp = admin.firestore.FieldValue.serverTimestamp();
|
|
155
|
+
let updatesAdded = 0;
|
|
156
|
+
|
|
157
|
+
// Get the shared calendar event ID
|
|
158
|
+
const calendarEventId = appointment.calendarEventId;
|
|
159
|
+
|
|
160
|
+
if (!calendarEventId) {
|
|
161
|
+
Logger.warn(
|
|
162
|
+
`[CalendarAdminService] Missing calendar event ID for appointment ${appointment.id}`
|
|
163
|
+
);
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Use the timestamps directly since they are already admin.firestore.Timestamp
|
|
168
|
+
const firestoreCompatibleEventTime = {
|
|
169
|
+
start: newEventTime.start,
|
|
170
|
+
end: newEventTime.end,
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
// Update practitioner calendar event
|
|
174
|
+
if (appointment.practitionerId) {
|
|
175
|
+
const practitionerEventRef = this.db.doc(
|
|
176
|
+
`${PRACTITIONERS_COLLECTION}/${appointment.practitionerId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
177
|
+
);
|
|
178
|
+
batch.update(practitionerEventRef, {
|
|
179
|
+
eventTime: firestoreCompatibleEventTime,
|
|
180
|
+
updatedAt: serverTimestamp,
|
|
181
|
+
});
|
|
182
|
+
updatesAdded++;
|
|
183
|
+
Logger.debug(
|
|
184
|
+
`[CalendarAdminService] Added practitioner calendar event time update to batch`
|
|
185
|
+
);
|
|
186
|
+
} else {
|
|
187
|
+
Logger.warn(
|
|
188
|
+
`[CalendarAdminService] Missing practitioner ID for appointment ${appointment.id}`
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Update patient calendar event
|
|
193
|
+
if (appointment.patientId) {
|
|
194
|
+
const patientEventRef = this.db.doc(
|
|
195
|
+
`${PATIENTS_COLLECTION}/${appointment.patientId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
196
|
+
);
|
|
197
|
+
batch.update(patientEventRef, {
|
|
198
|
+
eventTime: firestoreCompatibleEventTime,
|
|
199
|
+
updatedAt: serverTimestamp,
|
|
200
|
+
});
|
|
201
|
+
updatesAdded++;
|
|
202
|
+
Logger.debug(
|
|
203
|
+
`[CalendarAdminService] Added patient calendar event time update to batch`
|
|
204
|
+
);
|
|
205
|
+
} else {
|
|
206
|
+
Logger.warn(
|
|
207
|
+
`[CalendarAdminService] Missing patient ID for appointment ${appointment.id}`
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Update clinic calendar event
|
|
212
|
+
if (appointment.clinicBranchId) {
|
|
213
|
+
const clinicEventRef = this.db.doc(
|
|
214
|
+
`${CLINICS_COLLECTION}/${appointment.clinicBranchId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
215
|
+
);
|
|
216
|
+
batch.update(clinicEventRef, {
|
|
217
|
+
eventTime: firestoreCompatibleEventTime,
|
|
218
|
+
updatedAt: serverTimestamp,
|
|
219
|
+
});
|
|
220
|
+
updatesAdded++;
|
|
221
|
+
Logger.debug(
|
|
222
|
+
`[CalendarAdminService] Added clinic calendar event time update to batch`
|
|
223
|
+
);
|
|
224
|
+
} else {
|
|
225
|
+
Logger.warn(
|
|
226
|
+
`[CalendarAdminService] Missing clinic ID for appointment ${appointment.id}`
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Only commit if we have updates to make
|
|
231
|
+
if (updatesAdded > 0) {
|
|
232
|
+
try {
|
|
233
|
+
await batch.commit();
|
|
234
|
+
Logger.info(
|
|
235
|
+
`[CalendarAdminService] Successfully updated ${updatesAdded} calendar event times for appointment ${appointment.id}.`
|
|
236
|
+
);
|
|
237
|
+
} catch (error) {
|
|
238
|
+
Logger.error(
|
|
239
|
+
`[CalendarAdminService] Error updating calendar event times for appointment ${appointment.id}:`,
|
|
240
|
+
error
|
|
241
|
+
);
|
|
242
|
+
throw error; // Re-throw to allow caller to handle
|
|
243
|
+
}
|
|
244
|
+
} else {
|
|
245
|
+
Logger.warn(
|
|
246
|
+
`[CalendarAdminService] No calendar event time updates were made for appointment ${appointment.id}`
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Deletes all three calendar events associated with a given appointment.
|
|
253
|
+
* Note: This is a hard delete. Consider marking as CANCELLED instead if soft delete is preferred.
|
|
254
|
+
*
|
|
255
|
+
* @param appointment - The appointment object.
|
|
256
|
+
* @returns {Promise<void>} A promise that resolves when all deletions are attempted.
|
|
257
|
+
*/
|
|
258
|
+
async deleteAppointmentCalendarEvents(
|
|
259
|
+
appointment: Appointment
|
|
260
|
+
): Promise<void> {
|
|
261
|
+
Logger.info(
|
|
262
|
+
`[CalendarAdminService] Deleting calendar events for appointment ${appointment.id}`
|
|
263
|
+
);
|
|
264
|
+
const batch = this.db.batch();
|
|
265
|
+
let deletesAdded = 0;
|
|
266
|
+
|
|
267
|
+
// Get the shared calendar event ID
|
|
268
|
+
const calendarEventId = appointment.calendarEventId;
|
|
269
|
+
|
|
270
|
+
if (!calendarEventId) {
|
|
271
|
+
Logger.warn(
|
|
272
|
+
`[CalendarAdminService] Missing calendar event ID for appointment ${appointment.id}`
|
|
273
|
+
);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
// Delete practitioner calendar event
|
|
278
|
+
if (appointment.practitionerId) {
|
|
279
|
+
const practitionerEventRef = this.db.doc(
|
|
280
|
+
`${PRACTITIONERS_COLLECTION}/${appointment.practitionerId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
281
|
+
);
|
|
282
|
+
batch.delete(practitionerEventRef);
|
|
283
|
+
deletesAdded++;
|
|
284
|
+
Logger.debug(
|
|
285
|
+
`[CalendarAdminService] Added practitioner calendar event deletion to batch`
|
|
286
|
+
);
|
|
287
|
+
} else {
|
|
288
|
+
Logger.warn(
|
|
289
|
+
`[CalendarAdminService] Missing practitioner ID for appointment ${appointment.id}`
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// Delete patient calendar event
|
|
294
|
+
if (appointment.patientId) {
|
|
295
|
+
const patientEventRef = this.db.doc(
|
|
296
|
+
`${PATIENTS_COLLECTION}/${appointment.patientId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
297
|
+
);
|
|
298
|
+
batch.delete(patientEventRef);
|
|
299
|
+
deletesAdded++;
|
|
300
|
+
Logger.debug(
|
|
301
|
+
`[CalendarAdminService] Added patient calendar event deletion to batch`
|
|
302
|
+
);
|
|
303
|
+
} else {
|
|
304
|
+
Logger.warn(
|
|
305
|
+
`[CalendarAdminService] Missing patient ID for appointment ${appointment.id}`
|
|
306
|
+
);
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Delete clinic calendar event
|
|
310
|
+
if (appointment.clinicBranchId) {
|
|
311
|
+
const clinicEventRef = this.db.doc(
|
|
312
|
+
`${CLINICS_COLLECTION}/${appointment.clinicBranchId}/${CALENDAR_COLLECTION}/${calendarEventId}`
|
|
313
|
+
);
|
|
314
|
+
batch.delete(clinicEventRef);
|
|
315
|
+
deletesAdded++;
|
|
316
|
+
Logger.debug(
|
|
317
|
+
`[CalendarAdminService] Added clinic calendar event deletion to batch`
|
|
318
|
+
);
|
|
319
|
+
} else {
|
|
320
|
+
Logger.warn(
|
|
321
|
+
`[CalendarAdminService] Missing clinic ID for appointment ${appointment.id}`
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Only commit if we have deletions to make
|
|
326
|
+
if (deletesAdded > 0) {
|
|
327
|
+
try {
|
|
328
|
+
await batch.commit();
|
|
329
|
+
Logger.info(
|
|
330
|
+
`[CalendarAdminService] Successfully deleted ${deletesAdded} calendar events for appointment ${appointment.id}.`
|
|
331
|
+
);
|
|
332
|
+
} catch (error) {
|
|
333
|
+
Logger.error(
|
|
334
|
+
`[CalendarAdminService] Error deleting calendar events for appointment ${appointment.id}:`,
|
|
335
|
+
error
|
|
336
|
+
);
|
|
337
|
+
throw error; // Re-throw to allow caller to handle
|
|
338
|
+
}
|
|
339
|
+
} else {
|
|
340
|
+
Logger.warn(
|
|
341
|
+
`[CalendarAdminService] No calendar event deletions were made for appointment ${appointment.id}`
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|