@blackcode_sa/metaestetics-api 1.13.5 → 1.13.6
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 +20 -1
- package/dist/admin/index.d.ts +20 -1
- package/dist/admin/index.js +217 -1
- package/dist/admin/index.mjs +217 -1
- package/package.json +121 -121
- 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 +1984 -1984
- 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 +966 -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 +689 -689
- package/src/admin/analytics/analytics.admin.service.ts +278 -278
- package/src/admin/analytics/index.ts +2 -2
- 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 +81 -81
- 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 +57 -57
- package/src/backoffice/services/analytics.service.proposal.md +863 -863
- package/src/backoffice/services/analytics.service.summary.md +143 -143
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +384 -384
- 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 +10 -10
- 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 +461 -461
- package/src/backoffice/services/technology.service.ts +1151 -1151
- 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 +67 -67
- 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 +168 -168
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -164
- 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/analytics/ARCHITECTURE.md +199 -199
- package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -225
- package/src/services/analytics/GROUPED_ANALYTICS.md +501 -501
- package/src/services/analytics/QUICK_START.md +393 -393
- package/src/services/analytics/README.md +304 -304
- package/src/services/analytics/SUMMARY.md +141 -141
- package/src/services/analytics/TRENDS.md +380 -380
- package/src/services/analytics/USAGE_GUIDE.md +518 -518
- package/src/services/analytics/analytics-cloud.service.ts +222 -222
- package/src/services/analytics/analytics.service.ts +2142 -2142
- package/src/services/analytics/index.ts +4 -4
- package/src/services/analytics/review-analytics.service.ts +941 -941
- package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -138
- package/src/services/analytics/utils/cost-calculation.utils.ts +182 -182
- package/src/services/analytics/utils/grouping.utils.ts +434 -434
- package/src/services/analytics/utils/stored-analytics.utils.ts +347 -347
- package/src/services/analytics/utils/time-calculation.utils.ts +186 -186
- package/src/services/analytics/utils/trend-calculation.utils.ts +200 -200
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2558 -2558
- 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 +14 -14
- 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 +2200 -2200
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +734 -734
- 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/analytics/analytics.types.ts +597 -597
- package/src/types/analytics/grouped-analytics.types.ts +173 -173
- package/src/types/analytics/index.ts +4 -4
- package/src/types/analytics/stored-analytics.types.ts +137 -137
- package/src/types/appointment/index.ts +480 -480
- package/src/types/calendar/index.ts +258 -258
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +498 -498
- 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 +47 -47
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +286 -286
- 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 -275
- 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 +132 -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 +494 -494
- 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 -217
- 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 +195 -195
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,472 +1,472 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Firestore,
|
|
3
|
-
collection,
|
|
4
|
-
doc,
|
|
5
|
-
getDoc,
|
|
6
|
-
getDocs,
|
|
7
|
-
setDoc,
|
|
8
|
-
updateDoc,
|
|
9
|
-
deleteDoc,
|
|
10
|
-
query,
|
|
11
|
-
where,
|
|
12
|
-
orderBy,
|
|
13
|
-
Timestamp,
|
|
14
|
-
serverTimestamp,
|
|
15
|
-
} from "firebase/firestore";
|
|
16
|
-
import {
|
|
17
|
-
SyncedCalendar,
|
|
18
|
-
SyncedCalendarProvider,
|
|
19
|
-
CreateSyncedCalendarData,
|
|
20
|
-
UpdateSyncedCalendarData,
|
|
21
|
-
SYNCED_CALENDARS_COLLECTION,
|
|
22
|
-
} from "../../../types/calendar/synced-calendar.types";
|
|
23
|
-
import {
|
|
24
|
-
getPractitionerSyncedCalendarDocRef,
|
|
25
|
-
getPatientSyncedCalendarDocRef,
|
|
26
|
-
getClinicSyncedCalendarDocRef,
|
|
27
|
-
} from "./docs.utils";
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Creates a synced calendar for a practitioner
|
|
31
|
-
* @param db - Firestore instance
|
|
32
|
-
* @param practitionerId - ID of the practitioner
|
|
33
|
-
* @param calendarData - Synced calendar data
|
|
34
|
-
* @param generateId - Function to generate a unique ID
|
|
35
|
-
* @returns Created synced calendar
|
|
36
|
-
*/
|
|
37
|
-
export async function createPractitionerSyncedCalendarUtil(
|
|
38
|
-
db: Firestore,
|
|
39
|
-
practitionerId: string,
|
|
40
|
-
calendarData: Omit<
|
|
41
|
-
CreateSyncedCalendarData,
|
|
42
|
-
"id" | "createdAt" | "updatedAt"
|
|
43
|
-
>,
|
|
44
|
-
generateId: () => string
|
|
45
|
-
): Promise<SyncedCalendar> {
|
|
46
|
-
const calendarId = generateId();
|
|
47
|
-
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
48
|
-
db,
|
|
49
|
-
practitionerId,
|
|
50
|
-
calendarId
|
|
51
|
-
);
|
|
52
|
-
|
|
53
|
-
const newCalendar: CreateSyncedCalendarData = {
|
|
54
|
-
id: calendarId,
|
|
55
|
-
...calendarData,
|
|
56
|
-
createdAt: serverTimestamp(),
|
|
57
|
-
updatedAt: serverTimestamp(),
|
|
58
|
-
};
|
|
59
|
-
|
|
60
|
-
await setDoc(calendarRef, newCalendar);
|
|
61
|
-
|
|
62
|
-
// Convert server timestamp to Timestamp for return value
|
|
63
|
-
return {
|
|
64
|
-
...newCalendar,
|
|
65
|
-
createdAt: Timestamp.now(),
|
|
66
|
-
updatedAt: Timestamp.now(),
|
|
67
|
-
} as SyncedCalendar;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Creates a synced calendar for a patient
|
|
72
|
-
* @param db - Firestore instance
|
|
73
|
-
* @param patientId - ID of the patient
|
|
74
|
-
* @param calendarData - Synced calendar data
|
|
75
|
-
* @param generateId - Function to generate a unique ID
|
|
76
|
-
* @returns Created synced calendar
|
|
77
|
-
*/
|
|
78
|
-
export async function createPatientSyncedCalendarUtil(
|
|
79
|
-
db: Firestore,
|
|
80
|
-
patientId: string,
|
|
81
|
-
calendarData: Omit<
|
|
82
|
-
CreateSyncedCalendarData,
|
|
83
|
-
"id" | "createdAt" | "updatedAt"
|
|
84
|
-
>,
|
|
85
|
-
generateId: () => string
|
|
86
|
-
): Promise<SyncedCalendar> {
|
|
87
|
-
const calendarId = generateId();
|
|
88
|
-
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
89
|
-
|
|
90
|
-
const newCalendar: CreateSyncedCalendarData = {
|
|
91
|
-
id: calendarId,
|
|
92
|
-
...calendarData,
|
|
93
|
-
createdAt: serverTimestamp(),
|
|
94
|
-
updatedAt: serverTimestamp(),
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
await setDoc(calendarRef, newCalendar);
|
|
98
|
-
|
|
99
|
-
// Convert server timestamp to Timestamp for return value
|
|
100
|
-
return {
|
|
101
|
-
...newCalendar,
|
|
102
|
-
createdAt: Timestamp.now(),
|
|
103
|
-
updatedAt: Timestamp.now(),
|
|
104
|
-
} as SyncedCalendar;
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* Creates a synced calendar for a clinic
|
|
109
|
-
* @param db - Firestore instance
|
|
110
|
-
* @param clinicId - ID of the clinic
|
|
111
|
-
* @param calendarData - Synced calendar data
|
|
112
|
-
* @param generateId - Function to generate a unique ID
|
|
113
|
-
* @returns Created synced calendar
|
|
114
|
-
*/
|
|
115
|
-
export async function createClinicSyncedCalendarUtil(
|
|
116
|
-
db: Firestore,
|
|
117
|
-
clinicId: string,
|
|
118
|
-
calendarData: Omit<
|
|
119
|
-
CreateSyncedCalendarData,
|
|
120
|
-
"id" | "createdAt" | "updatedAt"
|
|
121
|
-
>,
|
|
122
|
-
generateId: () => string
|
|
123
|
-
): Promise<SyncedCalendar> {
|
|
124
|
-
const calendarId = generateId();
|
|
125
|
-
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
126
|
-
|
|
127
|
-
const newCalendar: CreateSyncedCalendarData = {
|
|
128
|
-
id: calendarId,
|
|
129
|
-
...calendarData,
|
|
130
|
-
createdAt: serverTimestamp(),
|
|
131
|
-
updatedAt: serverTimestamp(),
|
|
132
|
-
};
|
|
133
|
-
|
|
134
|
-
await setDoc(calendarRef, newCalendar);
|
|
135
|
-
|
|
136
|
-
// Convert server timestamp to Timestamp for return value
|
|
137
|
-
return {
|
|
138
|
-
...newCalendar,
|
|
139
|
-
createdAt: Timestamp.now(),
|
|
140
|
-
updatedAt: Timestamp.now(),
|
|
141
|
-
} as SyncedCalendar;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
/**
|
|
145
|
-
* Gets a synced calendar for a practitioner
|
|
146
|
-
* @param db - Firestore instance
|
|
147
|
-
* @param practitionerId - ID of the practitioner
|
|
148
|
-
* @param calendarId - ID of the synced calendar
|
|
149
|
-
* @returns Synced calendar or null if not found
|
|
150
|
-
*/
|
|
151
|
-
export async function getPractitionerSyncedCalendarUtil(
|
|
152
|
-
db: Firestore,
|
|
153
|
-
practitionerId: string,
|
|
154
|
-
calendarId: string
|
|
155
|
-
): Promise<SyncedCalendar | null> {
|
|
156
|
-
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
157
|
-
db,
|
|
158
|
-
practitionerId,
|
|
159
|
-
calendarId
|
|
160
|
-
);
|
|
161
|
-
const calendarDoc = await getDoc(calendarRef);
|
|
162
|
-
|
|
163
|
-
if (!calendarDoc.exists()) {
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
return calendarDoc.data() as SyncedCalendar;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Gets all synced calendars for a practitioner
|
|
172
|
-
* @param db - Firestore instance
|
|
173
|
-
* @param practitionerId - ID of the practitioner
|
|
174
|
-
* @returns Array of synced calendars
|
|
175
|
-
*/
|
|
176
|
-
export async function getPractitionerSyncedCalendarsUtil(
|
|
177
|
-
db: Firestore,
|
|
178
|
-
practitionerId: string
|
|
179
|
-
): Promise<SyncedCalendar[]> {
|
|
180
|
-
const calendarsRef = collection(
|
|
181
|
-
db,
|
|
182
|
-
`practitioners/${practitionerId}/${SYNCED_CALENDARS_COLLECTION}`
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
const q = query(calendarsRef, orderBy("createdAt", "desc"));
|
|
186
|
-
const querySnapshot = await getDocs(q);
|
|
187
|
-
|
|
188
|
-
return querySnapshot.docs.map((doc) => doc.data() as SyncedCalendar);
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Gets a synced calendar for a patient
|
|
193
|
-
* @param db - Firestore instance
|
|
194
|
-
* @param patientId - ID of the patient
|
|
195
|
-
* @param calendarId - ID of the synced calendar
|
|
196
|
-
* @returns Synced calendar or null if not found
|
|
197
|
-
*/
|
|
198
|
-
export async function getPatientSyncedCalendarUtil(
|
|
199
|
-
db: Firestore,
|
|
200
|
-
patientId: string,
|
|
201
|
-
calendarId: string
|
|
202
|
-
): Promise<SyncedCalendar | null> {
|
|
203
|
-
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
204
|
-
const calendarDoc = await getDoc(calendarRef);
|
|
205
|
-
|
|
206
|
-
if (!calendarDoc.exists()) {
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
return calendarDoc.data() as SyncedCalendar;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Gets all synced calendars for a patient
|
|
215
|
-
* @param db - Firestore instance
|
|
216
|
-
* @param patientId - ID of the patient
|
|
217
|
-
* @returns Array of synced calendars
|
|
218
|
-
*/
|
|
219
|
-
export async function getPatientSyncedCalendarsUtil(
|
|
220
|
-
db: Firestore,
|
|
221
|
-
patientId: string
|
|
222
|
-
): Promise<SyncedCalendar[]> {
|
|
223
|
-
const calendarsRef = collection(
|
|
224
|
-
db,
|
|
225
|
-
`patients/${patientId}/${SYNCED_CALENDARS_COLLECTION}`
|
|
226
|
-
);
|
|
227
|
-
|
|
228
|
-
const q = query(calendarsRef, orderBy("createdAt", "desc"));
|
|
229
|
-
const querySnapshot = await getDocs(q);
|
|
230
|
-
|
|
231
|
-
return querySnapshot.docs.map((doc) => doc.data() as SyncedCalendar);
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Gets a synced calendar for a clinic
|
|
236
|
-
* @param db - Firestore instance
|
|
237
|
-
* @param clinicId - ID of the clinic
|
|
238
|
-
* @param calendarId - ID of the synced calendar
|
|
239
|
-
* @returns Synced calendar or null if not found
|
|
240
|
-
*/
|
|
241
|
-
export async function getClinicSyncedCalendarUtil(
|
|
242
|
-
db: Firestore,
|
|
243
|
-
clinicId: string,
|
|
244
|
-
calendarId: string
|
|
245
|
-
): Promise<SyncedCalendar | null> {
|
|
246
|
-
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
247
|
-
const calendarDoc = await getDoc(calendarRef);
|
|
248
|
-
|
|
249
|
-
if (!calendarDoc.exists()) {
|
|
250
|
-
return null;
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
return calendarDoc.data() as SyncedCalendar;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
/**
|
|
257
|
-
* Gets all synced calendars for a clinic
|
|
258
|
-
* @param db - Firestore instance
|
|
259
|
-
* @param clinicId - ID of the clinic
|
|
260
|
-
* @returns Array of synced calendars
|
|
261
|
-
*/
|
|
262
|
-
export async function getClinicSyncedCalendarsUtil(
|
|
263
|
-
db: Firestore,
|
|
264
|
-
clinicId: string
|
|
265
|
-
): Promise<SyncedCalendar[]> {
|
|
266
|
-
const calendarsRef = collection(
|
|
267
|
-
db,
|
|
268
|
-
`clinics/${clinicId}/${SYNCED_CALENDARS_COLLECTION}`
|
|
269
|
-
);
|
|
270
|
-
|
|
271
|
-
const q = query(calendarsRef, orderBy("createdAt", "desc"));
|
|
272
|
-
const querySnapshot = await getDocs(q);
|
|
273
|
-
|
|
274
|
-
return querySnapshot.docs.map((doc) => doc.data() as SyncedCalendar);
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
/**
|
|
278
|
-
* Updates a synced calendar for a practitioner
|
|
279
|
-
* @param db - Firestore instance
|
|
280
|
-
* @param practitionerId - ID of the practitioner
|
|
281
|
-
* @param calendarId - ID of the synced calendar
|
|
282
|
-
* @param updateData - Data to update
|
|
283
|
-
* @returns Updated synced calendar
|
|
284
|
-
*/
|
|
285
|
-
export async function updatePractitionerSyncedCalendarUtil(
|
|
286
|
-
db: Firestore,
|
|
287
|
-
practitionerId: string,
|
|
288
|
-
calendarId: string,
|
|
289
|
-
updateData: Omit<UpdateSyncedCalendarData, "updatedAt">
|
|
290
|
-
): Promise<SyncedCalendar> {
|
|
291
|
-
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
292
|
-
db,
|
|
293
|
-
practitionerId,
|
|
294
|
-
calendarId
|
|
295
|
-
);
|
|
296
|
-
|
|
297
|
-
const updates: UpdateSyncedCalendarData = {
|
|
298
|
-
...updateData,
|
|
299
|
-
updatedAt: serverTimestamp(),
|
|
300
|
-
};
|
|
301
|
-
|
|
302
|
-
await updateDoc(calendarRef, updates as any);
|
|
303
|
-
|
|
304
|
-
// Get the updated document
|
|
305
|
-
const updatedDoc = await getDoc(calendarRef);
|
|
306
|
-
|
|
307
|
-
if (!updatedDoc.exists()) {
|
|
308
|
-
throw new Error("Synced calendar not found after update");
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
return updatedDoc.data() as SyncedCalendar;
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
/**
|
|
315
|
-
* Updates a synced calendar for a patient
|
|
316
|
-
* @param db - Firestore instance
|
|
317
|
-
* @param patientId - ID of the patient
|
|
318
|
-
* @param calendarId - ID of the synced calendar
|
|
319
|
-
* @param updateData - Data to update
|
|
320
|
-
* @returns Updated synced calendar
|
|
321
|
-
*/
|
|
322
|
-
export async function updatePatientSyncedCalendarUtil(
|
|
323
|
-
db: Firestore,
|
|
324
|
-
patientId: string,
|
|
325
|
-
calendarId: string,
|
|
326
|
-
updateData: Omit<UpdateSyncedCalendarData, "updatedAt">
|
|
327
|
-
): Promise<SyncedCalendar> {
|
|
328
|
-
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
329
|
-
|
|
330
|
-
const updates: UpdateSyncedCalendarData = {
|
|
331
|
-
...updateData,
|
|
332
|
-
updatedAt: serverTimestamp(),
|
|
333
|
-
};
|
|
334
|
-
|
|
335
|
-
await updateDoc(calendarRef, updates as any);
|
|
336
|
-
|
|
337
|
-
// Get the updated document
|
|
338
|
-
const updatedDoc = await getDoc(calendarRef);
|
|
339
|
-
|
|
340
|
-
if (!updatedDoc.exists()) {
|
|
341
|
-
throw new Error("Synced calendar not found after update");
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
return updatedDoc.data() as SyncedCalendar;
|
|
345
|
-
}
|
|
346
|
-
|
|
347
|
-
/**
|
|
348
|
-
* Updates a synced calendar for a clinic
|
|
349
|
-
* @param db - Firestore instance
|
|
350
|
-
* @param clinicId - ID of the clinic
|
|
351
|
-
* @param calendarId - ID of the synced calendar
|
|
352
|
-
* @param updateData - Data to update
|
|
353
|
-
* @returns Updated synced calendar
|
|
354
|
-
*/
|
|
355
|
-
export async function updateClinicSyncedCalendarUtil(
|
|
356
|
-
db: Firestore,
|
|
357
|
-
clinicId: string,
|
|
358
|
-
calendarId: string,
|
|
359
|
-
updateData: Omit<UpdateSyncedCalendarData, "updatedAt">
|
|
360
|
-
): Promise<SyncedCalendar> {
|
|
361
|
-
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
362
|
-
|
|
363
|
-
const updates: UpdateSyncedCalendarData = {
|
|
364
|
-
...updateData,
|
|
365
|
-
updatedAt: serverTimestamp(),
|
|
366
|
-
};
|
|
367
|
-
|
|
368
|
-
await updateDoc(calendarRef, updates as any);
|
|
369
|
-
|
|
370
|
-
// Get the updated document
|
|
371
|
-
const updatedDoc = await getDoc(calendarRef);
|
|
372
|
-
|
|
373
|
-
if (!updatedDoc.exists()) {
|
|
374
|
-
throw new Error("Synced calendar not found after update");
|
|
375
|
-
}
|
|
376
|
-
|
|
377
|
-
return updatedDoc.data() as SyncedCalendar;
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
/**
|
|
381
|
-
* Deletes a synced calendar for a practitioner
|
|
382
|
-
* @param db - Firestore instance
|
|
383
|
-
* @param practitionerId - ID of the practitioner
|
|
384
|
-
* @param calendarId - ID of the synced calendar
|
|
385
|
-
*/
|
|
386
|
-
export async function deletePractitionerSyncedCalendarUtil(
|
|
387
|
-
db: Firestore,
|
|
388
|
-
practitionerId: string,
|
|
389
|
-
calendarId: string
|
|
390
|
-
): Promise<void> {
|
|
391
|
-
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
392
|
-
db,
|
|
393
|
-
practitionerId,
|
|
394
|
-
calendarId
|
|
395
|
-
);
|
|
396
|
-
await deleteDoc(calendarRef);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
/**
|
|
400
|
-
* Deletes a synced calendar for a patient
|
|
401
|
-
* @param db - Firestore instance
|
|
402
|
-
* @param patientId - ID of the patient
|
|
403
|
-
* @param calendarId - ID of the synced calendar
|
|
404
|
-
*/
|
|
405
|
-
export async function deletePatientSyncedCalendarUtil(
|
|
406
|
-
db: Firestore,
|
|
407
|
-
patientId: string,
|
|
408
|
-
calendarId: string
|
|
409
|
-
): Promise<void> {
|
|
410
|
-
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
411
|
-
await deleteDoc(calendarRef);
|
|
412
|
-
}
|
|
413
|
-
|
|
414
|
-
/**
|
|
415
|
-
* Deletes a synced calendar for a clinic
|
|
416
|
-
* @param db - Firestore instance
|
|
417
|
-
* @param clinicId - ID of the clinic
|
|
418
|
-
* @param calendarId - ID of the synced calendar
|
|
419
|
-
*/
|
|
420
|
-
export async function deleteClinicSyncedCalendarUtil(
|
|
421
|
-
db: Firestore,
|
|
422
|
-
clinicId: string,
|
|
423
|
-
calendarId: string
|
|
424
|
-
): Promise<void> {
|
|
425
|
-
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
426
|
-
await deleteDoc(calendarRef);
|
|
427
|
-
}
|
|
428
|
-
|
|
429
|
-
/**
|
|
430
|
-
* Updates the last synced timestamp for a synced calendar
|
|
431
|
-
* @param db - Firestore instance
|
|
432
|
-
* @param entityType - Type of entity (practitioner, patient, clinic)
|
|
433
|
-
* @param entityId - ID of the entity
|
|
434
|
-
* @param calendarId - ID of the synced calendar
|
|
435
|
-
* @returns Updated synced calendar
|
|
436
|
-
*/
|
|
437
|
-
export async function updateLastSyncedTimestampUtil(
|
|
438
|
-
db: Firestore,
|
|
439
|
-
entityType: "practitioner" | "patient" | "clinic",
|
|
440
|
-
entityId: string,
|
|
441
|
-
calendarId: string
|
|
442
|
-
): Promise<SyncedCalendar> {
|
|
443
|
-
const updateData: Omit<UpdateSyncedCalendarData, "updatedAt"> = {
|
|
444
|
-
lastSyncedAt: Timestamp.now(),
|
|
445
|
-
};
|
|
446
|
-
|
|
447
|
-
switch (entityType) {
|
|
448
|
-
case "practitioner":
|
|
449
|
-
return updatePractitionerSyncedCalendarUtil(
|
|
450
|
-
db,
|
|
451
|
-
entityId,
|
|
452
|
-
calendarId,
|
|
453
|
-
updateData
|
|
454
|
-
);
|
|
455
|
-
case "patient":
|
|
456
|
-
return updatePatientSyncedCalendarUtil(
|
|
457
|
-
db,
|
|
458
|
-
entityId,
|
|
459
|
-
calendarId,
|
|
460
|
-
updateData
|
|
461
|
-
);
|
|
462
|
-
case "clinic":
|
|
463
|
-
return updateClinicSyncedCalendarUtil(
|
|
464
|
-
db,
|
|
465
|
-
entityId,
|
|
466
|
-
calendarId,
|
|
467
|
-
updateData
|
|
468
|
-
);
|
|
469
|
-
default:
|
|
470
|
-
throw new Error(`Invalid entity type: ${entityType}`);
|
|
471
|
-
}
|
|
472
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
Firestore,
|
|
3
|
+
collection,
|
|
4
|
+
doc,
|
|
5
|
+
getDoc,
|
|
6
|
+
getDocs,
|
|
7
|
+
setDoc,
|
|
8
|
+
updateDoc,
|
|
9
|
+
deleteDoc,
|
|
10
|
+
query,
|
|
11
|
+
where,
|
|
12
|
+
orderBy,
|
|
13
|
+
Timestamp,
|
|
14
|
+
serverTimestamp,
|
|
15
|
+
} from "firebase/firestore";
|
|
16
|
+
import {
|
|
17
|
+
SyncedCalendar,
|
|
18
|
+
SyncedCalendarProvider,
|
|
19
|
+
CreateSyncedCalendarData,
|
|
20
|
+
UpdateSyncedCalendarData,
|
|
21
|
+
SYNCED_CALENDARS_COLLECTION,
|
|
22
|
+
} from "../../../types/calendar/synced-calendar.types";
|
|
23
|
+
import {
|
|
24
|
+
getPractitionerSyncedCalendarDocRef,
|
|
25
|
+
getPatientSyncedCalendarDocRef,
|
|
26
|
+
getClinicSyncedCalendarDocRef,
|
|
27
|
+
} from "./docs.utils";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Creates a synced calendar for a practitioner
|
|
31
|
+
* @param db - Firestore instance
|
|
32
|
+
* @param practitionerId - ID of the practitioner
|
|
33
|
+
* @param calendarData - Synced calendar data
|
|
34
|
+
* @param generateId - Function to generate a unique ID
|
|
35
|
+
* @returns Created synced calendar
|
|
36
|
+
*/
|
|
37
|
+
export async function createPractitionerSyncedCalendarUtil(
|
|
38
|
+
db: Firestore,
|
|
39
|
+
practitionerId: string,
|
|
40
|
+
calendarData: Omit<
|
|
41
|
+
CreateSyncedCalendarData,
|
|
42
|
+
"id" | "createdAt" | "updatedAt"
|
|
43
|
+
>,
|
|
44
|
+
generateId: () => string
|
|
45
|
+
): Promise<SyncedCalendar> {
|
|
46
|
+
const calendarId = generateId();
|
|
47
|
+
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
48
|
+
db,
|
|
49
|
+
practitionerId,
|
|
50
|
+
calendarId
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
const newCalendar: CreateSyncedCalendarData = {
|
|
54
|
+
id: calendarId,
|
|
55
|
+
...calendarData,
|
|
56
|
+
createdAt: serverTimestamp(),
|
|
57
|
+
updatedAt: serverTimestamp(),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
await setDoc(calendarRef, newCalendar);
|
|
61
|
+
|
|
62
|
+
// Convert server timestamp to Timestamp for return value
|
|
63
|
+
return {
|
|
64
|
+
...newCalendar,
|
|
65
|
+
createdAt: Timestamp.now(),
|
|
66
|
+
updatedAt: Timestamp.now(),
|
|
67
|
+
} as SyncedCalendar;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Creates a synced calendar for a patient
|
|
72
|
+
* @param db - Firestore instance
|
|
73
|
+
* @param patientId - ID of the patient
|
|
74
|
+
* @param calendarData - Synced calendar data
|
|
75
|
+
* @param generateId - Function to generate a unique ID
|
|
76
|
+
* @returns Created synced calendar
|
|
77
|
+
*/
|
|
78
|
+
export async function createPatientSyncedCalendarUtil(
|
|
79
|
+
db: Firestore,
|
|
80
|
+
patientId: string,
|
|
81
|
+
calendarData: Omit<
|
|
82
|
+
CreateSyncedCalendarData,
|
|
83
|
+
"id" | "createdAt" | "updatedAt"
|
|
84
|
+
>,
|
|
85
|
+
generateId: () => string
|
|
86
|
+
): Promise<SyncedCalendar> {
|
|
87
|
+
const calendarId = generateId();
|
|
88
|
+
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
89
|
+
|
|
90
|
+
const newCalendar: CreateSyncedCalendarData = {
|
|
91
|
+
id: calendarId,
|
|
92
|
+
...calendarData,
|
|
93
|
+
createdAt: serverTimestamp(),
|
|
94
|
+
updatedAt: serverTimestamp(),
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
await setDoc(calendarRef, newCalendar);
|
|
98
|
+
|
|
99
|
+
// Convert server timestamp to Timestamp for return value
|
|
100
|
+
return {
|
|
101
|
+
...newCalendar,
|
|
102
|
+
createdAt: Timestamp.now(),
|
|
103
|
+
updatedAt: Timestamp.now(),
|
|
104
|
+
} as SyncedCalendar;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Creates a synced calendar for a clinic
|
|
109
|
+
* @param db - Firestore instance
|
|
110
|
+
* @param clinicId - ID of the clinic
|
|
111
|
+
* @param calendarData - Synced calendar data
|
|
112
|
+
* @param generateId - Function to generate a unique ID
|
|
113
|
+
* @returns Created synced calendar
|
|
114
|
+
*/
|
|
115
|
+
export async function createClinicSyncedCalendarUtil(
|
|
116
|
+
db: Firestore,
|
|
117
|
+
clinicId: string,
|
|
118
|
+
calendarData: Omit<
|
|
119
|
+
CreateSyncedCalendarData,
|
|
120
|
+
"id" | "createdAt" | "updatedAt"
|
|
121
|
+
>,
|
|
122
|
+
generateId: () => string
|
|
123
|
+
): Promise<SyncedCalendar> {
|
|
124
|
+
const calendarId = generateId();
|
|
125
|
+
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
126
|
+
|
|
127
|
+
const newCalendar: CreateSyncedCalendarData = {
|
|
128
|
+
id: calendarId,
|
|
129
|
+
...calendarData,
|
|
130
|
+
createdAt: serverTimestamp(),
|
|
131
|
+
updatedAt: serverTimestamp(),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
await setDoc(calendarRef, newCalendar);
|
|
135
|
+
|
|
136
|
+
// Convert server timestamp to Timestamp for return value
|
|
137
|
+
return {
|
|
138
|
+
...newCalendar,
|
|
139
|
+
createdAt: Timestamp.now(),
|
|
140
|
+
updatedAt: Timestamp.now(),
|
|
141
|
+
} as SyncedCalendar;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Gets a synced calendar for a practitioner
|
|
146
|
+
* @param db - Firestore instance
|
|
147
|
+
* @param practitionerId - ID of the practitioner
|
|
148
|
+
* @param calendarId - ID of the synced calendar
|
|
149
|
+
* @returns Synced calendar or null if not found
|
|
150
|
+
*/
|
|
151
|
+
export async function getPractitionerSyncedCalendarUtil(
|
|
152
|
+
db: Firestore,
|
|
153
|
+
practitionerId: string,
|
|
154
|
+
calendarId: string
|
|
155
|
+
): Promise<SyncedCalendar | null> {
|
|
156
|
+
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
157
|
+
db,
|
|
158
|
+
practitionerId,
|
|
159
|
+
calendarId
|
|
160
|
+
);
|
|
161
|
+
const calendarDoc = await getDoc(calendarRef);
|
|
162
|
+
|
|
163
|
+
if (!calendarDoc.exists()) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
return calendarDoc.data() as SyncedCalendar;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Gets all synced calendars for a practitioner
|
|
172
|
+
* @param db - Firestore instance
|
|
173
|
+
* @param practitionerId - ID of the practitioner
|
|
174
|
+
* @returns Array of synced calendars
|
|
175
|
+
*/
|
|
176
|
+
export async function getPractitionerSyncedCalendarsUtil(
|
|
177
|
+
db: Firestore,
|
|
178
|
+
practitionerId: string
|
|
179
|
+
): Promise<SyncedCalendar[]> {
|
|
180
|
+
const calendarsRef = collection(
|
|
181
|
+
db,
|
|
182
|
+
`practitioners/${practitionerId}/${SYNCED_CALENDARS_COLLECTION}`
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
const q = query(calendarsRef, orderBy("createdAt", "desc"));
|
|
186
|
+
const querySnapshot = await getDocs(q);
|
|
187
|
+
|
|
188
|
+
return querySnapshot.docs.map((doc) => doc.data() as SyncedCalendar);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Gets a synced calendar for a patient
|
|
193
|
+
* @param db - Firestore instance
|
|
194
|
+
* @param patientId - ID of the patient
|
|
195
|
+
* @param calendarId - ID of the synced calendar
|
|
196
|
+
* @returns Synced calendar or null if not found
|
|
197
|
+
*/
|
|
198
|
+
export async function getPatientSyncedCalendarUtil(
|
|
199
|
+
db: Firestore,
|
|
200
|
+
patientId: string,
|
|
201
|
+
calendarId: string
|
|
202
|
+
): Promise<SyncedCalendar | null> {
|
|
203
|
+
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
204
|
+
const calendarDoc = await getDoc(calendarRef);
|
|
205
|
+
|
|
206
|
+
if (!calendarDoc.exists()) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return calendarDoc.data() as SyncedCalendar;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Gets all synced calendars for a patient
|
|
215
|
+
* @param db - Firestore instance
|
|
216
|
+
* @param patientId - ID of the patient
|
|
217
|
+
* @returns Array of synced calendars
|
|
218
|
+
*/
|
|
219
|
+
export async function getPatientSyncedCalendarsUtil(
|
|
220
|
+
db: Firestore,
|
|
221
|
+
patientId: string
|
|
222
|
+
): Promise<SyncedCalendar[]> {
|
|
223
|
+
const calendarsRef = collection(
|
|
224
|
+
db,
|
|
225
|
+
`patients/${patientId}/${SYNCED_CALENDARS_COLLECTION}`
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
const q = query(calendarsRef, orderBy("createdAt", "desc"));
|
|
229
|
+
const querySnapshot = await getDocs(q);
|
|
230
|
+
|
|
231
|
+
return querySnapshot.docs.map((doc) => doc.data() as SyncedCalendar);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Gets a synced calendar for a clinic
|
|
236
|
+
* @param db - Firestore instance
|
|
237
|
+
* @param clinicId - ID of the clinic
|
|
238
|
+
* @param calendarId - ID of the synced calendar
|
|
239
|
+
* @returns Synced calendar or null if not found
|
|
240
|
+
*/
|
|
241
|
+
export async function getClinicSyncedCalendarUtil(
|
|
242
|
+
db: Firestore,
|
|
243
|
+
clinicId: string,
|
|
244
|
+
calendarId: string
|
|
245
|
+
): Promise<SyncedCalendar | null> {
|
|
246
|
+
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
247
|
+
const calendarDoc = await getDoc(calendarRef);
|
|
248
|
+
|
|
249
|
+
if (!calendarDoc.exists()) {
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
return calendarDoc.data() as SyncedCalendar;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* Gets all synced calendars for a clinic
|
|
258
|
+
* @param db - Firestore instance
|
|
259
|
+
* @param clinicId - ID of the clinic
|
|
260
|
+
* @returns Array of synced calendars
|
|
261
|
+
*/
|
|
262
|
+
export async function getClinicSyncedCalendarsUtil(
|
|
263
|
+
db: Firestore,
|
|
264
|
+
clinicId: string
|
|
265
|
+
): Promise<SyncedCalendar[]> {
|
|
266
|
+
const calendarsRef = collection(
|
|
267
|
+
db,
|
|
268
|
+
`clinics/${clinicId}/${SYNCED_CALENDARS_COLLECTION}`
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
const q = query(calendarsRef, orderBy("createdAt", "desc"));
|
|
272
|
+
const querySnapshot = await getDocs(q);
|
|
273
|
+
|
|
274
|
+
return querySnapshot.docs.map((doc) => doc.data() as SyncedCalendar);
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
/**
|
|
278
|
+
* Updates a synced calendar for a practitioner
|
|
279
|
+
* @param db - Firestore instance
|
|
280
|
+
* @param practitionerId - ID of the practitioner
|
|
281
|
+
* @param calendarId - ID of the synced calendar
|
|
282
|
+
* @param updateData - Data to update
|
|
283
|
+
* @returns Updated synced calendar
|
|
284
|
+
*/
|
|
285
|
+
export async function updatePractitionerSyncedCalendarUtil(
|
|
286
|
+
db: Firestore,
|
|
287
|
+
practitionerId: string,
|
|
288
|
+
calendarId: string,
|
|
289
|
+
updateData: Omit<UpdateSyncedCalendarData, "updatedAt">
|
|
290
|
+
): Promise<SyncedCalendar> {
|
|
291
|
+
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
292
|
+
db,
|
|
293
|
+
practitionerId,
|
|
294
|
+
calendarId
|
|
295
|
+
);
|
|
296
|
+
|
|
297
|
+
const updates: UpdateSyncedCalendarData = {
|
|
298
|
+
...updateData,
|
|
299
|
+
updatedAt: serverTimestamp(),
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
await updateDoc(calendarRef, updates as any);
|
|
303
|
+
|
|
304
|
+
// Get the updated document
|
|
305
|
+
const updatedDoc = await getDoc(calendarRef);
|
|
306
|
+
|
|
307
|
+
if (!updatedDoc.exists()) {
|
|
308
|
+
throw new Error("Synced calendar not found after update");
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
return updatedDoc.data() as SyncedCalendar;
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/**
|
|
315
|
+
* Updates a synced calendar for a patient
|
|
316
|
+
* @param db - Firestore instance
|
|
317
|
+
* @param patientId - ID of the patient
|
|
318
|
+
* @param calendarId - ID of the synced calendar
|
|
319
|
+
* @param updateData - Data to update
|
|
320
|
+
* @returns Updated synced calendar
|
|
321
|
+
*/
|
|
322
|
+
export async function updatePatientSyncedCalendarUtil(
|
|
323
|
+
db: Firestore,
|
|
324
|
+
patientId: string,
|
|
325
|
+
calendarId: string,
|
|
326
|
+
updateData: Omit<UpdateSyncedCalendarData, "updatedAt">
|
|
327
|
+
): Promise<SyncedCalendar> {
|
|
328
|
+
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
329
|
+
|
|
330
|
+
const updates: UpdateSyncedCalendarData = {
|
|
331
|
+
...updateData,
|
|
332
|
+
updatedAt: serverTimestamp(),
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
await updateDoc(calendarRef, updates as any);
|
|
336
|
+
|
|
337
|
+
// Get the updated document
|
|
338
|
+
const updatedDoc = await getDoc(calendarRef);
|
|
339
|
+
|
|
340
|
+
if (!updatedDoc.exists()) {
|
|
341
|
+
throw new Error("Synced calendar not found after update");
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
return updatedDoc.data() as SyncedCalendar;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Updates a synced calendar for a clinic
|
|
349
|
+
* @param db - Firestore instance
|
|
350
|
+
* @param clinicId - ID of the clinic
|
|
351
|
+
* @param calendarId - ID of the synced calendar
|
|
352
|
+
* @param updateData - Data to update
|
|
353
|
+
* @returns Updated synced calendar
|
|
354
|
+
*/
|
|
355
|
+
export async function updateClinicSyncedCalendarUtil(
|
|
356
|
+
db: Firestore,
|
|
357
|
+
clinicId: string,
|
|
358
|
+
calendarId: string,
|
|
359
|
+
updateData: Omit<UpdateSyncedCalendarData, "updatedAt">
|
|
360
|
+
): Promise<SyncedCalendar> {
|
|
361
|
+
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
362
|
+
|
|
363
|
+
const updates: UpdateSyncedCalendarData = {
|
|
364
|
+
...updateData,
|
|
365
|
+
updatedAt: serverTimestamp(),
|
|
366
|
+
};
|
|
367
|
+
|
|
368
|
+
await updateDoc(calendarRef, updates as any);
|
|
369
|
+
|
|
370
|
+
// Get the updated document
|
|
371
|
+
const updatedDoc = await getDoc(calendarRef);
|
|
372
|
+
|
|
373
|
+
if (!updatedDoc.exists()) {
|
|
374
|
+
throw new Error("Synced calendar not found after update");
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
return updatedDoc.data() as SyncedCalendar;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Deletes a synced calendar for a practitioner
|
|
382
|
+
* @param db - Firestore instance
|
|
383
|
+
* @param practitionerId - ID of the practitioner
|
|
384
|
+
* @param calendarId - ID of the synced calendar
|
|
385
|
+
*/
|
|
386
|
+
export async function deletePractitionerSyncedCalendarUtil(
|
|
387
|
+
db: Firestore,
|
|
388
|
+
practitionerId: string,
|
|
389
|
+
calendarId: string
|
|
390
|
+
): Promise<void> {
|
|
391
|
+
const calendarRef = getPractitionerSyncedCalendarDocRef(
|
|
392
|
+
db,
|
|
393
|
+
practitionerId,
|
|
394
|
+
calendarId
|
|
395
|
+
);
|
|
396
|
+
await deleteDoc(calendarRef);
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Deletes a synced calendar for a patient
|
|
401
|
+
* @param db - Firestore instance
|
|
402
|
+
* @param patientId - ID of the patient
|
|
403
|
+
* @param calendarId - ID of the synced calendar
|
|
404
|
+
*/
|
|
405
|
+
export async function deletePatientSyncedCalendarUtil(
|
|
406
|
+
db: Firestore,
|
|
407
|
+
patientId: string,
|
|
408
|
+
calendarId: string
|
|
409
|
+
): Promise<void> {
|
|
410
|
+
const calendarRef = getPatientSyncedCalendarDocRef(db, patientId, calendarId);
|
|
411
|
+
await deleteDoc(calendarRef);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
/**
|
|
415
|
+
* Deletes a synced calendar for a clinic
|
|
416
|
+
* @param db - Firestore instance
|
|
417
|
+
* @param clinicId - ID of the clinic
|
|
418
|
+
* @param calendarId - ID of the synced calendar
|
|
419
|
+
*/
|
|
420
|
+
export async function deleteClinicSyncedCalendarUtil(
|
|
421
|
+
db: Firestore,
|
|
422
|
+
clinicId: string,
|
|
423
|
+
calendarId: string
|
|
424
|
+
): Promise<void> {
|
|
425
|
+
const calendarRef = getClinicSyncedCalendarDocRef(db, clinicId, calendarId);
|
|
426
|
+
await deleteDoc(calendarRef);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/**
|
|
430
|
+
* Updates the last synced timestamp for a synced calendar
|
|
431
|
+
* @param db - Firestore instance
|
|
432
|
+
* @param entityType - Type of entity (practitioner, patient, clinic)
|
|
433
|
+
* @param entityId - ID of the entity
|
|
434
|
+
* @param calendarId - ID of the synced calendar
|
|
435
|
+
* @returns Updated synced calendar
|
|
436
|
+
*/
|
|
437
|
+
export async function updateLastSyncedTimestampUtil(
|
|
438
|
+
db: Firestore,
|
|
439
|
+
entityType: "practitioner" | "patient" | "clinic",
|
|
440
|
+
entityId: string,
|
|
441
|
+
calendarId: string
|
|
442
|
+
): Promise<SyncedCalendar> {
|
|
443
|
+
const updateData: Omit<UpdateSyncedCalendarData, "updatedAt"> = {
|
|
444
|
+
lastSyncedAt: Timestamp.now(),
|
|
445
|
+
};
|
|
446
|
+
|
|
447
|
+
switch (entityType) {
|
|
448
|
+
case "practitioner":
|
|
449
|
+
return updatePractitionerSyncedCalendarUtil(
|
|
450
|
+
db,
|
|
451
|
+
entityId,
|
|
452
|
+
calendarId,
|
|
453
|
+
updateData
|
|
454
|
+
);
|
|
455
|
+
case "patient":
|
|
456
|
+
return updatePatientSyncedCalendarUtil(
|
|
457
|
+
db,
|
|
458
|
+
entityId,
|
|
459
|
+
calendarId,
|
|
460
|
+
updateData
|
|
461
|
+
);
|
|
462
|
+
case "clinic":
|
|
463
|
+
return updateClinicSyncedCalendarUtil(
|
|
464
|
+
db,
|
|
465
|
+
entityId,
|
|
466
|
+
calendarId,
|
|
467
|
+
updateData
|
|
468
|
+
);
|
|
469
|
+
default:
|
|
470
|
+
throw new Error(`Invalid entity type: ${entityType}`);
|
|
471
|
+
}
|
|
472
|
+
}
|