@blackcode_sa/metaestetics-api 1.12.65 → 1.12.67
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 +2 -0
- package/dist/admin/index.d.ts +2 -0
- package/dist/admin/index.js +45 -4
- package/dist/admin/index.mjs +45 -4
- package/dist/backoffice/index.d.mts +33 -0
- package/dist/backoffice/index.d.ts +33 -0
- package/dist/backoffice/index.js +63 -0
- package/dist/backoffice/index.mjs +63 -0
- package/dist/index.d.mts +35 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.js +116 -11
- package/dist/index.mjs +116 -11
- 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 +689 -641
- 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 +341 -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 +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 +417 -395
- package/src/backoffice/services/technology.service.ts +1104 -1083
- 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 -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 +168 -163
- 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/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2505 -2505
- 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 +1715 -1715
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +683 -636
- 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 +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 +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 -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 -130
- 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 -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 -189
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
PatientInstructionStatus,
|
|
4
|
-
PatientRequirementOverallStatus,
|
|
5
|
-
} from "../../types/patient/patient-requirements";
|
|
6
|
-
import {
|
|
7
|
-
requirementTypeSchema,
|
|
8
|
-
timeUnitSchemaBackoffice, // Corrected import name to lowercase 'u'
|
|
9
|
-
} from "../../backoffice/validations/schemas";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Zod schema for `PatientInstructionStatus` enum.
|
|
13
|
-
*/
|
|
14
|
-
export const patientInstructionStatusSchema = z.nativeEnum(
|
|
15
|
-
PatientInstructionStatus
|
|
16
|
-
);
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Zod schema for `PatientRequirementInstruction` interface.
|
|
20
|
-
*/
|
|
21
|
-
export const patientRequirementInstructionSchema = z.object({
|
|
22
|
-
instructionId: z.string().min(1, "Instruction ID is required."),
|
|
23
|
-
instructionText: z.string().min(1, "Instruction text is required."),
|
|
24
|
-
dueTime: z.any(), // Firestore Timestamp
|
|
25
|
-
actionableWindow: z.number().default(1),
|
|
26
|
-
status: patientInstructionStatusSchema,
|
|
27
|
-
originalNotifyAtValue: z.number(),
|
|
28
|
-
originalTimeframeUnit: timeUnitSchemaBackoffice, // Use the correctly imported timeUnitSchema
|
|
29
|
-
notificationId: z.string().optional(),
|
|
30
|
-
actionTakenAt: z.any().optional().nullable(), // Firestore Timestamp or null
|
|
31
|
-
updatedAt: z.any(), // Firestore Timestamp
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Zod schema for `PatientRequirementOverallStatus` enum.
|
|
36
|
-
*/
|
|
37
|
-
export const patientRequirementOverallStatusSchema = z.nativeEnum(
|
|
38
|
-
PatientRequirementOverallStatus
|
|
39
|
-
);
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Define requirementImportanceSchema locally as it's not exported directly from backoffice.
|
|
43
|
-
*/
|
|
44
|
-
export const requirementImportanceSchema = z.enum(["low", "medium", "high"]);
|
|
45
|
-
|
|
46
|
-
/**
|
|
47
|
-
* Zod schema for `RequirementSourceProcedure` interface.
|
|
48
|
-
*/
|
|
49
|
-
export const requirementSourceProcedureSchema = z.object({
|
|
50
|
-
procedureId: z.string().min(1, "Procedure ID is required."),
|
|
51
|
-
procedureName: z.string().min(1, "Procedure name is required."),
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Zod schema for `PatientRequirementInstance` interface.
|
|
56
|
-
*/
|
|
57
|
-
export const patientRequirementInstanceSchema = z.object({
|
|
58
|
-
id: z.string().min(1, "Instance ID is required."),
|
|
59
|
-
patientId: z.string().min(1, "Patient ID is required."),
|
|
60
|
-
appointmentId: z.string().min(1, "Appointment ID is required."),
|
|
61
|
-
originalRequirementId: z
|
|
62
|
-
.string()
|
|
63
|
-
.min(1, "Original Requirement ID is required."),
|
|
64
|
-
requirementType: requirementTypeSchema,
|
|
65
|
-
requirementName: z.string().min(1, "Requirement name is required."),
|
|
66
|
-
requirementDescription: z.string(),
|
|
67
|
-
requirementImportance: requirementImportanceSchema, // Use the locally defined schema
|
|
68
|
-
overallStatus: patientRequirementOverallStatusSchema,
|
|
69
|
-
instructions: z
|
|
70
|
-
.array(patientRequirementInstructionSchema)
|
|
71
|
-
.min(1, "At least one instruction is required."),
|
|
72
|
-
sourceProcedures: z.array(requirementSourceProcedureSchema).optional(),
|
|
73
|
-
createdAt: z.any(), // Firestore Timestamp
|
|
74
|
-
updatedAt: z.any(), // Firestore Timestamp
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Schema for updating a `PatientRequirementInstruction` status (subset of fields).
|
|
79
|
-
* Useful for when a patient marks an instruction as actioned.
|
|
80
|
-
*/
|
|
81
|
-
export const updatePatientInstructionStatusSchema = z.object({
|
|
82
|
-
status: z.literal(PatientInstructionStatus.ACTION_TAKEN),
|
|
83
|
-
actionTakenAt: z.any(), // Should be a Timestamp from the server
|
|
84
|
-
});
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import {
|
|
3
|
+
PatientInstructionStatus,
|
|
4
|
+
PatientRequirementOverallStatus,
|
|
5
|
+
} from "../../types/patient/patient-requirements";
|
|
6
|
+
import {
|
|
7
|
+
requirementTypeSchema,
|
|
8
|
+
timeUnitSchemaBackoffice, // Corrected import name to lowercase 'u'
|
|
9
|
+
} from "../../backoffice/validations/schemas";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Zod schema for `PatientInstructionStatus` enum.
|
|
13
|
+
*/
|
|
14
|
+
export const patientInstructionStatusSchema = z.nativeEnum(
|
|
15
|
+
PatientInstructionStatus
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Zod schema for `PatientRequirementInstruction` interface.
|
|
20
|
+
*/
|
|
21
|
+
export const patientRequirementInstructionSchema = z.object({
|
|
22
|
+
instructionId: z.string().min(1, "Instruction ID is required."),
|
|
23
|
+
instructionText: z.string().min(1, "Instruction text is required."),
|
|
24
|
+
dueTime: z.any(), // Firestore Timestamp
|
|
25
|
+
actionableWindow: z.number().default(1),
|
|
26
|
+
status: patientInstructionStatusSchema,
|
|
27
|
+
originalNotifyAtValue: z.number(),
|
|
28
|
+
originalTimeframeUnit: timeUnitSchemaBackoffice, // Use the correctly imported timeUnitSchema
|
|
29
|
+
notificationId: z.string().optional(),
|
|
30
|
+
actionTakenAt: z.any().optional().nullable(), // Firestore Timestamp or null
|
|
31
|
+
updatedAt: z.any(), // Firestore Timestamp
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Zod schema for `PatientRequirementOverallStatus` enum.
|
|
36
|
+
*/
|
|
37
|
+
export const patientRequirementOverallStatusSchema = z.nativeEnum(
|
|
38
|
+
PatientRequirementOverallStatus
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Define requirementImportanceSchema locally as it's not exported directly from backoffice.
|
|
43
|
+
*/
|
|
44
|
+
export const requirementImportanceSchema = z.enum(["low", "medium", "high"]);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Zod schema for `RequirementSourceProcedure` interface.
|
|
48
|
+
*/
|
|
49
|
+
export const requirementSourceProcedureSchema = z.object({
|
|
50
|
+
procedureId: z.string().min(1, "Procedure ID is required."),
|
|
51
|
+
procedureName: z.string().min(1, "Procedure name is required."),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Zod schema for `PatientRequirementInstance` interface.
|
|
56
|
+
*/
|
|
57
|
+
export const patientRequirementInstanceSchema = z.object({
|
|
58
|
+
id: z.string().min(1, "Instance ID is required."),
|
|
59
|
+
patientId: z.string().min(1, "Patient ID is required."),
|
|
60
|
+
appointmentId: z.string().min(1, "Appointment ID is required."),
|
|
61
|
+
originalRequirementId: z
|
|
62
|
+
.string()
|
|
63
|
+
.min(1, "Original Requirement ID is required."),
|
|
64
|
+
requirementType: requirementTypeSchema,
|
|
65
|
+
requirementName: z.string().min(1, "Requirement name is required."),
|
|
66
|
+
requirementDescription: z.string(),
|
|
67
|
+
requirementImportance: requirementImportanceSchema, // Use the locally defined schema
|
|
68
|
+
overallStatus: patientRequirementOverallStatusSchema,
|
|
69
|
+
instructions: z
|
|
70
|
+
.array(patientRequirementInstructionSchema)
|
|
71
|
+
.min(1, "At least one instruction is required."),
|
|
72
|
+
sourceProcedures: z.array(requirementSourceProcedureSchema).optional(),
|
|
73
|
+
createdAt: z.any(), // Firestore Timestamp
|
|
74
|
+
updatedAt: z.any(), // Firestore Timestamp
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Schema for updating a `PatientRequirementInstruction` status (subset of fields).
|
|
79
|
+
* Useful for when a patient marks an instruction as actioned.
|
|
80
|
+
*/
|
|
81
|
+
export const updatePatientInstructionStatusSchema = z.object({
|
|
82
|
+
status: z.literal(PatientInstructionStatus.ACTION_TAKEN),
|
|
83
|
+
actionTakenAt: z.any(), // Should be a Timestamp from the server
|
|
84
|
+
});
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { PatientTokenStatus } from "../../types/patient/token.types";
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* @description Zod schema for validating a PatientToken object.
|
|
6
|
-
*/
|
|
7
|
-
export const patientTokenSchema = z.object({
|
|
8
|
-
id: z.string().min(1, "Token ID is required"),
|
|
9
|
-
token: z.string().min(1, "Token string is required"),
|
|
10
|
-
patientId: z.string().min(1, "Patient ID is required"),
|
|
11
|
-
email: z.string().email("Invalid email format"),
|
|
12
|
-
clinicId: z.string().min(1, "Clinic ID is required"),
|
|
13
|
-
status: z.nativeEnum(PatientTokenStatus),
|
|
14
|
-
createdBy: z.string().min(1, "Creator ID is required"),
|
|
15
|
-
createdAt: z.any(), // Assuming Timestamp validated elsewhere
|
|
16
|
-
expiresAt: z.any(), // Assuming Timestamp validated elsewhere
|
|
17
|
-
usedBy: z.string().optional(),
|
|
18
|
-
usedAt: z.any().optional(), // Assuming Timestamp validated elsewhere
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* @description Zod schema for validating the data required to create a PatientToken.
|
|
23
|
-
*/
|
|
24
|
-
export const createPatientTokenSchema = z.object({
|
|
25
|
-
patientId: z.string().min(1, "Patient ID is required"),
|
|
26
|
-
clinicId: z.string().min(1, "Clinic ID is required"),
|
|
27
|
-
email: z.string().email("Invalid email format"),
|
|
28
|
-
expiresAt: z.date().optional(),
|
|
29
|
-
});
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { PatientTokenStatus } from "../../types/patient/token.types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @description Zod schema for validating a PatientToken object.
|
|
6
|
+
*/
|
|
7
|
+
export const patientTokenSchema = z.object({
|
|
8
|
+
id: z.string().min(1, "Token ID is required"),
|
|
9
|
+
token: z.string().min(1, "Token string is required"),
|
|
10
|
+
patientId: z.string().min(1, "Patient ID is required"),
|
|
11
|
+
email: z.string().email("Invalid email format"),
|
|
12
|
+
clinicId: z.string().min(1, "Clinic ID is required"),
|
|
13
|
+
status: z.nativeEnum(PatientTokenStatus),
|
|
14
|
+
createdBy: z.string().min(1, "Creator ID is required"),
|
|
15
|
+
createdAt: z.any(), // Assuming Timestamp validated elsewhere
|
|
16
|
+
expiresAt: z.any(), // Assuming Timestamp validated elsewhere
|
|
17
|
+
usedBy: z.string().optional(),
|
|
18
|
+
usedAt: z.any().optional(), // Assuming Timestamp validated elsewhere
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* @description Zod schema for validating the data required to create a PatientToken.
|
|
23
|
+
*/
|
|
24
|
+
export const createPatientTokenSchema = z.object({
|
|
25
|
+
patientId: z.string().min(1, "Patient ID is required"),
|
|
26
|
+
clinicId: z.string().min(1, "Clinic ID is required"),
|
|
27
|
+
email: z.string().email("Invalid email format"),
|
|
28
|
+
expiresAt: z.date().optional(),
|
|
29
|
+
});
|
|
@@ -1,217 +1,217 @@
|
|
|
1
|
-
import { string, z } from "zod";
|
|
2
|
-
import { Timestamp } from "firebase/firestore";
|
|
3
|
-
import { Gender } from "../types/patient";
|
|
4
|
-
import { mediaResourceSchema } from "./media.schema";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Šema za validaciju geoprostornih podataka
|
|
8
|
-
*/
|
|
9
|
-
export const locationDataSchema = z.object({
|
|
10
|
-
latitude: z.number().min(-90).max(90),
|
|
11
|
-
longitude: z.number().min(-180).max(180),
|
|
12
|
-
geohash: z.string().optional(),
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Šema za validaciju adresnih podataka
|
|
17
|
-
*/
|
|
18
|
-
export const addressDataSchema = z.object({
|
|
19
|
-
address: z.string(),
|
|
20
|
-
city: z.string(),
|
|
21
|
-
country: z.string(),
|
|
22
|
-
postalCode: z.string(),
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Šema za validaciju kontakta za hitne slučajeve
|
|
27
|
-
*/
|
|
28
|
-
export const emergencyContactSchema = z.object({
|
|
29
|
-
name: z.string(),
|
|
30
|
-
relationship: z.string(),
|
|
31
|
-
phoneNumber: z.string(),
|
|
32
|
-
isNotifiable: z.boolean(),
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
/**
|
|
36
|
-
* Šema za validaciju gamifikacije
|
|
37
|
-
*/
|
|
38
|
-
export const gamificationSchema = z.object({
|
|
39
|
-
level: z.number(),
|
|
40
|
-
points: z.number(),
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Šema za validaciju lokacijskih informacija pacijenta
|
|
45
|
-
*/
|
|
46
|
-
export const patientLocationInfoSchema = z.object({
|
|
47
|
-
patientId: z.string(),
|
|
48
|
-
userRef: z.string().optional(),
|
|
49
|
-
locationData: locationDataSchema,
|
|
50
|
-
createdAt: z.instanceof(Timestamp),
|
|
51
|
-
updatedAt: z.instanceof(Timestamp),
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Šema za validaciju podataka pri kreiranju lokacijskih informacija
|
|
56
|
-
*/
|
|
57
|
-
export const createPatientLocationInfoSchema = z.object({
|
|
58
|
-
patientId: z.string(),
|
|
59
|
-
userRef: z.string().optional(),
|
|
60
|
-
locationData: locationDataSchema,
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Šema za validaciju osetljivih informacija pacijenta
|
|
65
|
-
*/
|
|
66
|
-
export const patientSensitiveInfoSchema = z.object({
|
|
67
|
-
patientId: z.string(),
|
|
68
|
-
userRef: z.string().optional(),
|
|
69
|
-
photoUrl: z.string().nullable().optional(),
|
|
70
|
-
firstName: z.string().min(2),
|
|
71
|
-
lastName: z.string().min(2),
|
|
72
|
-
dateOfBirth: z.instanceof(Timestamp).nullable(),
|
|
73
|
-
gender: z.nativeEnum(Gender),
|
|
74
|
-
email: z.string().email().optional(),
|
|
75
|
-
phoneNumber: z.string().optional(),
|
|
76
|
-
alternativePhoneNumber: z.string().optional(),
|
|
77
|
-
addressData: addressDataSchema.optional(),
|
|
78
|
-
emergencyContacts: z.array(emergencyContactSchema).optional(),
|
|
79
|
-
createdAt: z.instanceof(Timestamp),
|
|
80
|
-
updatedAt: z.instanceof(Timestamp),
|
|
81
|
-
});
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Šema za validaciju doktora pacijenta
|
|
85
|
-
*/
|
|
86
|
-
export const patientDoctorSchema = z.object({
|
|
87
|
-
userRef: z.string(),
|
|
88
|
-
assignedAt: z.instanceof(Timestamp),
|
|
89
|
-
assignedBy: z.string().optional(),
|
|
90
|
-
isActive: z.boolean(),
|
|
91
|
-
notes: z.string().optional(),
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Šema za validaciju klinike pacijenta
|
|
96
|
-
*/
|
|
97
|
-
export const patientClinicSchema = z.object({
|
|
98
|
-
clinicId: z.string(),
|
|
99
|
-
assignedAt: z.instanceof(Timestamp),
|
|
100
|
-
assignedBy: z.string().optional(),
|
|
101
|
-
isActive: z.boolean(),
|
|
102
|
-
notes: z.string().optional(),
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
/**
|
|
106
|
-
* Šema za validaciju Patient profila
|
|
107
|
-
*/
|
|
108
|
-
export const patientProfileSchema = z.object({
|
|
109
|
-
id: z.string(),
|
|
110
|
-
userRef: z.string().optional(),
|
|
111
|
-
displayName: z.string(),
|
|
112
|
-
gamification: gamificationSchema,
|
|
113
|
-
expoTokens: z.array(z.string()),
|
|
114
|
-
isActive: z.boolean(),
|
|
115
|
-
isVerified: z.boolean(),
|
|
116
|
-
isManual: z.boolean().default(false), // Default to false if missing
|
|
117
|
-
phoneNumber: z.string().nullable().optional(),
|
|
118
|
-
dateOfBirth: z.instanceof(Timestamp).nullable().optional(),
|
|
119
|
-
doctors: z.array(patientDoctorSchema),
|
|
120
|
-
clinics: z.array(patientClinicSchema),
|
|
121
|
-
doctorIds: z.array(z.string()),
|
|
122
|
-
clinicIds: z.array(z.string()),
|
|
123
|
-
dismissedNextStepsRecommendations: z.array(z.string()).optional(),
|
|
124
|
-
createdAt: z.instanceof(Timestamp),
|
|
125
|
-
updatedAt: z.instanceof(Timestamp),
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Šema za validaciju podataka pri kreiranju profila
|
|
130
|
-
*/
|
|
131
|
-
export const createPatientProfileSchema = z.object({
|
|
132
|
-
userRef: z.string().optional(),
|
|
133
|
-
displayName: z.string(),
|
|
134
|
-
expoTokens: z.array(z.string()),
|
|
135
|
-
gamification: gamificationSchema.optional(),
|
|
136
|
-
isActive: z.boolean(),
|
|
137
|
-
isVerified: z.boolean(),
|
|
138
|
-
isManual: z.boolean().default(false),
|
|
139
|
-
doctors: z.array(patientDoctorSchema).optional(),
|
|
140
|
-
clinics: z.array(patientClinicSchema).optional(),
|
|
141
|
-
doctorIds: z.array(z.string()).optional(),
|
|
142
|
-
clinicIds: z.array(z.string()).optional(),
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Šema za validaciju podataka pri kreiranju osetljivih informacija
|
|
147
|
-
*/
|
|
148
|
-
export const createPatientSensitiveInfoSchema = z.object({
|
|
149
|
-
patientId: z.string(),
|
|
150
|
-
userRef: z.string().optional(),
|
|
151
|
-
photoUrl: mediaResourceSchema.nullable().optional(),
|
|
152
|
-
firstName: z.string().min(2),
|
|
153
|
-
lastName: z.string().min(2),
|
|
154
|
-
dateOfBirth: z.instanceof(Timestamp).nullable(),
|
|
155
|
-
gender: z.nativeEnum(Gender),
|
|
156
|
-
email: z.string().email().optional(),
|
|
157
|
-
phoneNumber: z.string().optional(),
|
|
158
|
-
alternativePhoneNumber: z.string().optional(),
|
|
159
|
-
addressData: addressDataSchema.optional(),
|
|
160
|
-
emergencyContacts: z.array(emergencyContactSchema).optional(),
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
/**
|
|
164
|
-
* Schema for validating the data when a clinic admin manually creates a patient.
|
|
165
|
-
*/
|
|
166
|
-
export const createManualPatientSchema = z.object({
|
|
167
|
-
clinicId: z.string().min(1, "Clinic ID is required"),
|
|
168
|
-
firstName: z.string().min(2, "First name is required"),
|
|
169
|
-
lastName: z.string().min(2, "Last name is required"),
|
|
170
|
-
dateOfBirth: z.instanceof(Timestamp).nullable(),
|
|
171
|
-
gender: z.nativeEnum(Gender),
|
|
172
|
-
phoneNumber: z.string().optional(),
|
|
173
|
-
email: z.string().email().optional(),
|
|
174
|
-
addressData: addressDataSchema.optional(),
|
|
175
|
-
notes: z.string().optional(),
|
|
176
|
-
});
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Schema for validating patient search parameters.
|
|
180
|
-
*/
|
|
181
|
-
export const searchPatientsSchema = z
|
|
182
|
-
.object({
|
|
183
|
-
clinicId: z.string().optional(),
|
|
184
|
-
practitionerId: z.string().optional(),
|
|
185
|
-
})
|
|
186
|
-
.refine((data) => data.clinicId || data.practitionerId, {
|
|
187
|
-
message: "At least one of clinicId or practitionerId must be provided",
|
|
188
|
-
path: [], // Optional: specify a path like ['clinicId'] or ['practitionerId']
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Schema for validating requester information during patient search.
|
|
193
|
-
*/
|
|
194
|
-
export const requesterInfoSchema = z
|
|
195
|
-
.object({
|
|
196
|
-
id: z.string(),
|
|
197
|
-
role: z.enum(["clinic_admin", "practitioner"]),
|
|
198
|
-
associatedClinicId: z.string().optional(),
|
|
199
|
-
associatedPractitionerId: z.string().optional(),
|
|
200
|
-
})
|
|
201
|
-
.refine(
|
|
202
|
-
(data) => {
|
|
203
|
-
if (data.role === "clinic_admin") {
|
|
204
|
-
return !!data.associatedClinicId;
|
|
205
|
-
} else if (data.role === "practitioner") {
|
|
206
|
-
return !!data.associatedPractitionerId;
|
|
207
|
-
}
|
|
208
|
-
return false;
|
|
209
|
-
},
|
|
210
|
-
{
|
|
211
|
-
message:
|
|
212
|
-
"Associated ID (clinic or practitioner) is required based on role",
|
|
213
|
-
path: ["associatedClinicId", "associatedPractitionerId"],
|
|
214
|
-
}
|
|
215
|
-
);
|
|
216
|
-
|
|
217
|
-
export * from "./patient/medical-info.schema";
|
|
1
|
+
import { string, z } from "zod";
|
|
2
|
+
import { Timestamp } from "firebase/firestore";
|
|
3
|
+
import { Gender } from "../types/patient";
|
|
4
|
+
import { mediaResourceSchema } from "./media.schema";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Šema za validaciju geoprostornih podataka
|
|
8
|
+
*/
|
|
9
|
+
export const locationDataSchema = z.object({
|
|
10
|
+
latitude: z.number().min(-90).max(90),
|
|
11
|
+
longitude: z.number().min(-180).max(180),
|
|
12
|
+
geohash: z.string().optional(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Šema za validaciju adresnih podataka
|
|
17
|
+
*/
|
|
18
|
+
export const addressDataSchema = z.object({
|
|
19
|
+
address: z.string(),
|
|
20
|
+
city: z.string(),
|
|
21
|
+
country: z.string(),
|
|
22
|
+
postalCode: z.string(),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Šema za validaciju kontakta za hitne slučajeve
|
|
27
|
+
*/
|
|
28
|
+
export const emergencyContactSchema = z.object({
|
|
29
|
+
name: z.string(),
|
|
30
|
+
relationship: z.string(),
|
|
31
|
+
phoneNumber: z.string(),
|
|
32
|
+
isNotifiable: z.boolean(),
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Šema za validaciju gamifikacije
|
|
37
|
+
*/
|
|
38
|
+
export const gamificationSchema = z.object({
|
|
39
|
+
level: z.number(),
|
|
40
|
+
points: z.number(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Šema za validaciju lokacijskih informacija pacijenta
|
|
45
|
+
*/
|
|
46
|
+
export const patientLocationInfoSchema = z.object({
|
|
47
|
+
patientId: z.string(),
|
|
48
|
+
userRef: z.string().optional(),
|
|
49
|
+
locationData: locationDataSchema,
|
|
50
|
+
createdAt: z.instanceof(Timestamp),
|
|
51
|
+
updatedAt: z.instanceof(Timestamp),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Šema za validaciju podataka pri kreiranju lokacijskih informacija
|
|
56
|
+
*/
|
|
57
|
+
export const createPatientLocationInfoSchema = z.object({
|
|
58
|
+
patientId: z.string(),
|
|
59
|
+
userRef: z.string().optional(),
|
|
60
|
+
locationData: locationDataSchema,
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Šema za validaciju osetljivih informacija pacijenta
|
|
65
|
+
*/
|
|
66
|
+
export const patientSensitiveInfoSchema = z.object({
|
|
67
|
+
patientId: z.string(),
|
|
68
|
+
userRef: z.string().optional(),
|
|
69
|
+
photoUrl: z.string().nullable().optional(),
|
|
70
|
+
firstName: z.string().min(2),
|
|
71
|
+
lastName: z.string().min(2),
|
|
72
|
+
dateOfBirth: z.instanceof(Timestamp).nullable(),
|
|
73
|
+
gender: z.nativeEnum(Gender),
|
|
74
|
+
email: z.string().email().optional(),
|
|
75
|
+
phoneNumber: z.string().optional(),
|
|
76
|
+
alternativePhoneNumber: z.string().optional(),
|
|
77
|
+
addressData: addressDataSchema.optional(),
|
|
78
|
+
emergencyContacts: z.array(emergencyContactSchema).optional(),
|
|
79
|
+
createdAt: z.instanceof(Timestamp),
|
|
80
|
+
updatedAt: z.instanceof(Timestamp),
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Šema za validaciju doktora pacijenta
|
|
85
|
+
*/
|
|
86
|
+
export const patientDoctorSchema = z.object({
|
|
87
|
+
userRef: z.string(),
|
|
88
|
+
assignedAt: z.instanceof(Timestamp),
|
|
89
|
+
assignedBy: z.string().optional(),
|
|
90
|
+
isActive: z.boolean(),
|
|
91
|
+
notes: z.string().optional(),
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Šema za validaciju klinike pacijenta
|
|
96
|
+
*/
|
|
97
|
+
export const patientClinicSchema = z.object({
|
|
98
|
+
clinicId: z.string(),
|
|
99
|
+
assignedAt: z.instanceof(Timestamp),
|
|
100
|
+
assignedBy: z.string().optional(),
|
|
101
|
+
isActive: z.boolean(),
|
|
102
|
+
notes: z.string().optional(),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Šema za validaciju Patient profila
|
|
107
|
+
*/
|
|
108
|
+
export const patientProfileSchema = z.object({
|
|
109
|
+
id: z.string(),
|
|
110
|
+
userRef: z.string().optional(),
|
|
111
|
+
displayName: z.string(),
|
|
112
|
+
gamification: gamificationSchema,
|
|
113
|
+
expoTokens: z.array(z.string()),
|
|
114
|
+
isActive: z.boolean(),
|
|
115
|
+
isVerified: z.boolean(),
|
|
116
|
+
isManual: z.boolean().default(false), // Default to false if missing
|
|
117
|
+
phoneNumber: z.string().nullable().optional(),
|
|
118
|
+
dateOfBirth: z.instanceof(Timestamp).nullable().optional(),
|
|
119
|
+
doctors: z.array(patientDoctorSchema),
|
|
120
|
+
clinics: z.array(patientClinicSchema),
|
|
121
|
+
doctorIds: z.array(z.string()),
|
|
122
|
+
clinicIds: z.array(z.string()),
|
|
123
|
+
dismissedNextStepsRecommendations: z.array(z.string()).optional(),
|
|
124
|
+
createdAt: z.instanceof(Timestamp),
|
|
125
|
+
updatedAt: z.instanceof(Timestamp),
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Šema za validaciju podataka pri kreiranju profila
|
|
130
|
+
*/
|
|
131
|
+
export const createPatientProfileSchema = z.object({
|
|
132
|
+
userRef: z.string().optional(),
|
|
133
|
+
displayName: z.string(),
|
|
134
|
+
expoTokens: z.array(z.string()),
|
|
135
|
+
gamification: gamificationSchema.optional(),
|
|
136
|
+
isActive: z.boolean(),
|
|
137
|
+
isVerified: z.boolean(),
|
|
138
|
+
isManual: z.boolean().default(false),
|
|
139
|
+
doctors: z.array(patientDoctorSchema).optional(),
|
|
140
|
+
clinics: z.array(patientClinicSchema).optional(),
|
|
141
|
+
doctorIds: z.array(z.string()).optional(),
|
|
142
|
+
clinicIds: z.array(z.string()).optional(),
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Šema za validaciju podataka pri kreiranju osetljivih informacija
|
|
147
|
+
*/
|
|
148
|
+
export const createPatientSensitiveInfoSchema = z.object({
|
|
149
|
+
patientId: z.string(),
|
|
150
|
+
userRef: z.string().optional(),
|
|
151
|
+
photoUrl: mediaResourceSchema.nullable().optional(),
|
|
152
|
+
firstName: z.string().min(2),
|
|
153
|
+
lastName: z.string().min(2),
|
|
154
|
+
dateOfBirth: z.instanceof(Timestamp).nullable(),
|
|
155
|
+
gender: z.nativeEnum(Gender),
|
|
156
|
+
email: z.string().email().optional(),
|
|
157
|
+
phoneNumber: z.string().optional(),
|
|
158
|
+
alternativePhoneNumber: z.string().optional(),
|
|
159
|
+
addressData: addressDataSchema.optional(),
|
|
160
|
+
emergencyContacts: z.array(emergencyContactSchema).optional(),
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Schema for validating the data when a clinic admin manually creates a patient.
|
|
165
|
+
*/
|
|
166
|
+
export const createManualPatientSchema = z.object({
|
|
167
|
+
clinicId: z.string().min(1, "Clinic ID is required"),
|
|
168
|
+
firstName: z.string().min(2, "First name is required"),
|
|
169
|
+
lastName: z.string().min(2, "Last name is required"),
|
|
170
|
+
dateOfBirth: z.instanceof(Timestamp).nullable(),
|
|
171
|
+
gender: z.nativeEnum(Gender),
|
|
172
|
+
phoneNumber: z.string().optional(),
|
|
173
|
+
email: z.string().email().optional(),
|
|
174
|
+
addressData: addressDataSchema.optional(),
|
|
175
|
+
notes: z.string().optional(),
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Schema for validating patient search parameters.
|
|
180
|
+
*/
|
|
181
|
+
export const searchPatientsSchema = z
|
|
182
|
+
.object({
|
|
183
|
+
clinicId: z.string().optional(),
|
|
184
|
+
practitionerId: z.string().optional(),
|
|
185
|
+
})
|
|
186
|
+
.refine((data) => data.clinicId || data.practitionerId, {
|
|
187
|
+
message: "At least one of clinicId or practitionerId must be provided",
|
|
188
|
+
path: [], // Optional: specify a path like ['clinicId'] or ['practitionerId']
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Schema for validating requester information during patient search.
|
|
193
|
+
*/
|
|
194
|
+
export const requesterInfoSchema = z
|
|
195
|
+
.object({
|
|
196
|
+
id: z.string(),
|
|
197
|
+
role: z.enum(["clinic_admin", "practitioner"]),
|
|
198
|
+
associatedClinicId: z.string().optional(),
|
|
199
|
+
associatedPractitionerId: z.string().optional(),
|
|
200
|
+
})
|
|
201
|
+
.refine(
|
|
202
|
+
(data) => {
|
|
203
|
+
if (data.role === "clinic_admin") {
|
|
204
|
+
return !!data.associatedClinicId;
|
|
205
|
+
} else if (data.role === "practitioner") {
|
|
206
|
+
return !!data.associatedPractitionerId;
|
|
207
|
+
}
|
|
208
|
+
return false;
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
message:
|
|
212
|
+
"Associated ID (clinic or practitioner) is required based on role",
|
|
213
|
+
path: ["associatedClinicId", "associatedPractitionerId"],
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
export * from "./patient/medical-info.schema";
|