@blackcode_sa/metaestetics-api 1.12.62 → 1.12.63
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 +9 -0
- package/dist/backoffice/index.d.ts +9 -0
- package/dist/backoffice/index.js +11 -0
- package/dist/backoffice/index.mjs +11 -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 +8 -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,8 +1,8 @@
|
|
|
1
|
-
// Export core calendar utilities
|
|
2
|
-
export * from "./calendar-event.utils";
|
|
3
|
-
export * from "./synced-calendar.utils";
|
|
4
|
-
export * from "./google-calendar.utils";
|
|
5
|
-
export * from "./appointment.utils";
|
|
6
|
-
|
|
7
|
-
// Note: Other utility files (clinic.utils.ts, patient.utils.ts, practitioner.utils.ts, docs.utils.ts)
|
|
8
|
-
// should be imported directly where needed to avoid naming conflicts
|
|
1
|
+
// Export core calendar utilities
|
|
2
|
+
export * from "./calendar-event.utils";
|
|
3
|
+
export * from "./synced-calendar.utils";
|
|
4
|
+
export * from "./google-calendar.utils";
|
|
5
|
+
export * from "./appointment.utils";
|
|
6
|
+
|
|
7
|
+
// Note: Other utility files (clinic.utils.ts, patient.utils.ts, practitioner.utils.ts, docs.utils.ts)
|
|
8
|
+
// should be imported directly where needed to avoid naming conflicts
|
|
@@ -1,198 +1,198 @@
|
|
|
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
|
-
QueryConstraint,
|
|
16
|
-
} from "firebase/firestore";
|
|
17
|
-
import {
|
|
18
|
-
CalendarEvent,
|
|
19
|
-
CalendarEventStatus,
|
|
20
|
-
CalendarEventType,
|
|
21
|
-
CreateCalendarEventData,
|
|
22
|
-
UpdateCalendarEventData,
|
|
23
|
-
CALENDAR_COLLECTION,
|
|
24
|
-
} from "../../../types/calendar";
|
|
25
|
-
import { getPatientCalendarEventDocRef } from "./docs.utils";
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Creates a calendar event for a patient
|
|
29
|
-
* @param db - Firestore instance
|
|
30
|
-
* @param patientId - ID of the patient
|
|
31
|
-
* @param eventData - Calendar event data
|
|
32
|
-
* @param generateId - Function to generate a unique ID
|
|
33
|
-
* @returns Created calendar event
|
|
34
|
-
*/
|
|
35
|
-
export async function createPatientCalendarEventUtil(
|
|
36
|
-
db: Firestore,
|
|
37
|
-
patientId: string,
|
|
38
|
-
eventData: Omit<CreateCalendarEventData, "id" | "createdAt" | "updatedAt">,
|
|
39
|
-
generateId: () => string
|
|
40
|
-
): Promise<CalendarEvent> {
|
|
41
|
-
// TODO: Add validation for event data
|
|
42
|
-
// - Check if patient exists
|
|
43
|
-
// - Validate event time (start < end)
|
|
44
|
-
// - Check for overlapping events
|
|
45
|
-
// - Validate required fields
|
|
46
|
-
|
|
47
|
-
const eventId = generateId();
|
|
48
|
-
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
49
|
-
|
|
50
|
-
const newEvent: CreateCalendarEventData = {
|
|
51
|
-
id: eventId,
|
|
52
|
-
...eventData,
|
|
53
|
-
createdAt: serverTimestamp(),
|
|
54
|
-
updatedAt: serverTimestamp(),
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
await setDoc(eventRef, newEvent);
|
|
58
|
-
|
|
59
|
-
// Convert server timestamp to Timestamp for return value
|
|
60
|
-
return {
|
|
61
|
-
...newEvent,
|
|
62
|
-
createdAt: Timestamp.now(),
|
|
63
|
-
updatedAt: Timestamp.now(),
|
|
64
|
-
} as CalendarEvent;
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Gets a calendar event for a patient
|
|
69
|
-
* @param db - Firestore instance
|
|
70
|
-
* @param patientId - ID of the patient
|
|
71
|
-
* @param eventId - ID of the event
|
|
72
|
-
* @returns Calendar event or null if not found
|
|
73
|
-
*/
|
|
74
|
-
export async function getPatientCalendarEventUtil(
|
|
75
|
-
db: Firestore,
|
|
76
|
-
patientId: string,
|
|
77
|
-
eventId: string
|
|
78
|
-
): Promise<CalendarEvent | null> {
|
|
79
|
-
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
80
|
-
const eventDoc = await getDoc(eventRef);
|
|
81
|
-
|
|
82
|
-
if (!eventDoc.exists()) {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return eventDoc.data() as CalendarEvent;
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Gets calendar events for a patient within a date range
|
|
91
|
-
* @param db - Firestore instance
|
|
92
|
-
* @param patientId - ID of the patient
|
|
93
|
-
* @param startDate - Start date of the range
|
|
94
|
-
* @param endDate - End date of the range
|
|
95
|
-
* @param additionalConstraints - Additional query constraints
|
|
96
|
-
* @returns Array of calendar events
|
|
97
|
-
*/
|
|
98
|
-
export async function getPatientCalendarEventsUtil(
|
|
99
|
-
db: Firestore,
|
|
100
|
-
patientId: string,
|
|
101
|
-
startDate: Date,
|
|
102
|
-
endDate: Date,
|
|
103
|
-
additionalConstraints: QueryConstraint[] = []
|
|
104
|
-
): Promise<CalendarEvent[]> {
|
|
105
|
-
const startTimestamp = Timestamp.fromDate(startDate);
|
|
106
|
-
const endTimestamp = Timestamp.fromDate(endDate);
|
|
107
|
-
|
|
108
|
-
const eventsRef = collection(
|
|
109
|
-
db,
|
|
110
|
-
`${CALENDAR_COLLECTION}`,
|
|
111
|
-
patientId,
|
|
112
|
-
`${CALENDAR_COLLECTION}`
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
const constraints: QueryConstraint[] = [
|
|
116
|
-
where("eventTime.start", ">=", startTimestamp),
|
|
117
|
-
where("eventTime.end", "<=", endTimestamp),
|
|
118
|
-
orderBy("eventTime.start", "asc"),
|
|
119
|
-
...additionalConstraints,
|
|
120
|
-
];
|
|
121
|
-
|
|
122
|
-
const q = query(eventsRef, ...constraints);
|
|
123
|
-
|
|
124
|
-
const querySnapshot = await getDocs(q);
|
|
125
|
-
return querySnapshot.docs.map((doc) => doc.data() as CalendarEvent);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Gets upcoming appointments for a patient
|
|
130
|
-
* @param db - Firestore instance
|
|
131
|
-
* @param patientId - ID of the patient
|
|
132
|
-
* @returns Array of upcoming calendar events
|
|
133
|
-
*/
|
|
134
|
-
export async function getUpcomingPatientAppointmentsUtil(
|
|
135
|
-
db: Firestore,
|
|
136
|
-
patientId: string
|
|
137
|
-
): Promise<CalendarEvent[]> {
|
|
138
|
-
const now = new Date();
|
|
139
|
-
const oneYearFromNow = new Date();
|
|
140
|
-
oneYearFromNow.setFullYear(oneYearFromNow.getFullYear() + 1);
|
|
141
|
-
|
|
142
|
-
return getPatientCalendarEventsUtil(db, patientId, now, oneYearFromNow, [
|
|
143
|
-
where("eventType", "==", CalendarEventType.APPOINTMENT),
|
|
144
|
-
]);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
/**
|
|
148
|
-
* Updates a calendar event for a patient
|
|
149
|
-
* @param db - Firestore instance
|
|
150
|
-
* @param patientId - ID of the patient
|
|
151
|
-
* @param eventId - ID of the event
|
|
152
|
-
* @param updateData - Data to update
|
|
153
|
-
* @returns Updated calendar event
|
|
154
|
-
*/
|
|
155
|
-
export async function updatePatientCalendarEventUtil(
|
|
156
|
-
db: Firestore,
|
|
157
|
-
patientId: string,
|
|
158
|
-
eventId: string,
|
|
159
|
-
updateData: Omit<UpdateCalendarEventData, "updatedAt">
|
|
160
|
-
): Promise<CalendarEvent> {
|
|
161
|
-
// TODO: Add validation for update data
|
|
162
|
-
// - Check if event exists
|
|
163
|
-
// - Validate event time (start < end)
|
|
164
|
-
// - Check for overlapping events
|
|
165
|
-
|
|
166
|
-
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
167
|
-
|
|
168
|
-
const updates: UpdateCalendarEventData = {
|
|
169
|
-
...updateData,
|
|
170
|
-
updatedAt: serverTimestamp(),
|
|
171
|
-
};
|
|
172
|
-
|
|
173
|
-
await updateDoc(eventRef, updates as any);
|
|
174
|
-
|
|
175
|
-
// Get the updated document
|
|
176
|
-
const updatedDoc = await getDoc(eventRef);
|
|
177
|
-
|
|
178
|
-
if (!updatedDoc.exists()) {
|
|
179
|
-
throw new Error("Event not found after update");
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return updatedDoc.data() as CalendarEvent;
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
/**
|
|
186
|
-
* Deletes a calendar event for a patient
|
|
187
|
-
* @param db - Firestore instance
|
|
188
|
-
* @param patientId - ID of the patient
|
|
189
|
-
* @param eventId - ID of the event
|
|
190
|
-
*/
|
|
191
|
-
export async function deletePatientCalendarEventUtil(
|
|
192
|
-
db: Firestore,
|
|
193
|
-
patientId: string,
|
|
194
|
-
eventId: string
|
|
195
|
-
): Promise<void> {
|
|
196
|
-
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
197
|
-
await deleteDoc(eventRef);
|
|
198
|
-
}
|
|
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
|
+
QueryConstraint,
|
|
16
|
+
} from "firebase/firestore";
|
|
17
|
+
import {
|
|
18
|
+
CalendarEvent,
|
|
19
|
+
CalendarEventStatus,
|
|
20
|
+
CalendarEventType,
|
|
21
|
+
CreateCalendarEventData,
|
|
22
|
+
UpdateCalendarEventData,
|
|
23
|
+
CALENDAR_COLLECTION,
|
|
24
|
+
} from "../../../types/calendar";
|
|
25
|
+
import { getPatientCalendarEventDocRef } from "./docs.utils";
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a calendar event for a patient
|
|
29
|
+
* @param db - Firestore instance
|
|
30
|
+
* @param patientId - ID of the patient
|
|
31
|
+
* @param eventData - Calendar event data
|
|
32
|
+
* @param generateId - Function to generate a unique ID
|
|
33
|
+
* @returns Created calendar event
|
|
34
|
+
*/
|
|
35
|
+
export async function createPatientCalendarEventUtil(
|
|
36
|
+
db: Firestore,
|
|
37
|
+
patientId: string,
|
|
38
|
+
eventData: Omit<CreateCalendarEventData, "id" | "createdAt" | "updatedAt">,
|
|
39
|
+
generateId: () => string
|
|
40
|
+
): Promise<CalendarEvent> {
|
|
41
|
+
// TODO: Add validation for event data
|
|
42
|
+
// - Check if patient exists
|
|
43
|
+
// - Validate event time (start < end)
|
|
44
|
+
// - Check for overlapping events
|
|
45
|
+
// - Validate required fields
|
|
46
|
+
|
|
47
|
+
const eventId = generateId();
|
|
48
|
+
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
49
|
+
|
|
50
|
+
const newEvent: CreateCalendarEventData = {
|
|
51
|
+
id: eventId,
|
|
52
|
+
...eventData,
|
|
53
|
+
createdAt: serverTimestamp(),
|
|
54
|
+
updatedAt: serverTimestamp(),
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
await setDoc(eventRef, newEvent);
|
|
58
|
+
|
|
59
|
+
// Convert server timestamp to Timestamp for return value
|
|
60
|
+
return {
|
|
61
|
+
...newEvent,
|
|
62
|
+
createdAt: Timestamp.now(),
|
|
63
|
+
updatedAt: Timestamp.now(),
|
|
64
|
+
} as CalendarEvent;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Gets a calendar event for a patient
|
|
69
|
+
* @param db - Firestore instance
|
|
70
|
+
* @param patientId - ID of the patient
|
|
71
|
+
* @param eventId - ID of the event
|
|
72
|
+
* @returns Calendar event or null if not found
|
|
73
|
+
*/
|
|
74
|
+
export async function getPatientCalendarEventUtil(
|
|
75
|
+
db: Firestore,
|
|
76
|
+
patientId: string,
|
|
77
|
+
eventId: string
|
|
78
|
+
): Promise<CalendarEvent | null> {
|
|
79
|
+
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
80
|
+
const eventDoc = await getDoc(eventRef);
|
|
81
|
+
|
|
82
|
+
if (!eventDoc.exists()) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return eventDoc.data() as CalendarEvent;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Gets calendar events for a patient within a date range
|
|
91
|
+
* @param db - Firestore instance
|
|
92
|
+
* @param patientId - ID of the patient
|
|
93
|
+
* @param startDate - Start date of the range
|
|
94
|
+
* @param endDate - End date of the range
|
|
95
|
+
* @param additionalConstraints - Additional query constraints
|
|
96
|
+
* @returns Array of calendar events
|
|
97
|
+
*/
|
|
98
|
+
export async function getPatientCalendarEventsUtil(
|
|
99
|
+
db: Firestore,
|
|
100
|
+
patientId: string,
|
|
101
|
+
startDate: Date,
|
|
102
|
+
endDate: Date,
|
|
103
|
+
additionalConstraints: QueryConstraint[] = []
|
|
104
|
+
): Promise<CalendarEvent[]> {
|
|
105
|
+
const startTimestamp = Timestamp.fromDate(startDate);
|
|
106
|
+
const endTimestamp = Timestamp.fromDate(endDate);
|
|
107
|
+
|
|
108
|
+
const eventsRef = collection(
|
|
109
|
+
db,
|
|
110
|
+
`${CALENDAR_COLLECTION}`,
|
|
111
|
+
patientId,
|
|
112
|
+
`${CALENDAR_COLLECTION}`
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const constraints: QueryConstraint[] = [
|
|
116
|
+
where("eventTime.start", ">=", startTimestamp),
|
|
117
|
+
where("eventTime.end", "<=", endTimestamp),
|
|
118
|
+
orderBy("eventTime.start", "asc"),
|
|
119
|
+
...additionalConstraints,
|
|
120
|
+
];
|
|
121
|
+
|
|
122
|
+
const q = query(eventsRef, ...constraints);
|
|
123
|
+
|
|
124
|
+
const querySnapshot = await getDocs(q);
|
|
125
|
+
return querySnapshot.docs.map((doc) => doc.data() as CalendarEvent);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Gets upcoming appointments for a patient
|
|
130
|
+
* @param db - Firestore instance
|
|
131
|
+
* @param patientId - ID of the patient
|
|
132
|
+
* @returns Array of upcoming calendar events
|
|
133
|
+
*/
|
|
134
|
+
export async function getUpcomingPatientAppointmentsUtil(
|
|
135
|
+
db: Firestore,
|
|
136
|
+
patientId: string
|
|
137
|
+
): Promise<CalendarEvent[]> {
|
|
138
|
+
const now = new Date();
|
|
139
|
+
const oneYearFromNow = new Date();
|
|
140
|
+
oneYearFromNow.setFullYear(oneYearFromNow.getFullYear() + 1);
|
|
141
|
+
|
|
142
|
+
return getPatientCalendarEventsUtil(db, patientId, now, oneYearFromNow, [
|
|
143
|
+
where("eventType", "==", CalendarEventType.APPOINTMENT),
|
|
144
|
+
]);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Updates a calendar event for a patient
|
|
149
|
+
* @param db - Firestore instance
|
|
150
|
+
* @param patientId - ID of the patient
|
|
151
|
+
* @param eventId - ID of the event
|
|
152
|
+
* @param updateData - Data to update
|
|
153
|
+
* @returns Updated calendar event
|
|
154
|
+
*/
|
|
155
|
+
export async function updatePatientCalendarEventUtil(
|
|
156
|
+
db: Firestore,
|
|
157
|
+
patientId: string,
|
|
158
|
+
eventId: string,
|
|
159
|
+
updateData: Omit<UpdateCalendarEventData, "updatedAt">
|
|
160
|
+
): Promise<CalendarEvent> {
|
|
161
|
+
// TODO: Add validation for update data
|
|
162
|
+
// - Check if event exists
|
|
163
|
+
// - Validate event time (start < end)
|
|
164
|
+
// - Check for overlapping events
|
|
165
|
+
|
|
166
|
+
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
167
|
+
|
|
168
|
+
const updates: UpdateCalendarEventData = {
|
|
169
|
+
...updateData,
|
|
170
|
+
updatedAt: serverTimestamp(),
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
await updateDoc(eventRef, updates as any);
|
|
174
|
+
|
|
175
|
+
// Get the updated document
|
|
176
|
+
const updatedDoc = await getDoc(eventRef);
|
|
177
|
+
|
|
178
|
+
if (!updatedDoc.exists()) {
|
|
179
|
+
throw new Error("Event not found after update");
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return updatedDoc.data() as CalendarEvent;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* Deletes a calendar event for a patient
|
|
187
|
+
* @param db - Firestore instance
|
|
188
|
+
* @param patientId - ID of the patient
|
|
189
|
+
* @param eventId - ID of the event
|
|
190
|
+
*/
|
|
191
|
+
export async function deletePatientCalendarEventUtil(
|
|
192
|
+
db: Firestore,
|
|
193
|
+
patientId: string,
|
|
194
|
+
eventId: string
|
|
195
|
+
): Promise<void> {
|
|
196
|
+
const eventRef = getPatientCalendarEventDocRef(db, patientId, eventId);
|
|
197
|
+
await deleteDoc(eventRef);
|
|
198
|
+
}
|