@blackcode_sa/metaestetics-api 1.15.16 → 1.15.17-staging.0
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 +377 -222
- package/dist/admin/index.d.ts +377 -222
- package/dist/admin/index.js +625 -206
- package/dist/admin/index.mjs +624 -206
- package/dist/backoffice/index.d.mts +24 -0
- package/dist/backoffice/index.d.ts +24 -0
- package/dist/index.d.mts +292 -4
- package/dist/index.d.ts +292 -4
- package/dist/index.js +1142 -630
- package/dist/index.mjs +1137 -617
- package/package.json +2 -1
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +151 -129
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +2137 -2091
- 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 -966
- 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 +184 -125
- package/src/admin/booking/booking.admin.ts +1330 -1073
- package/src/admin/booking/booking.calculator.ts +850 -712
- package/src/admin/booking/booking.types.ts +76 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +62 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +2 -1
- package/src/admin/calendar/resource-calendar.admin.ts +198 -0
- 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 +83 -83
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +139 -139
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +1253 -1253
- 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/clinicWelcome/clinicWelcome.mailing.ts +292 -292
- package/src/admin/mailing/clinicWelcome/index.ts +1 -1
- package/src/admin/mailing/clinicWelcome/templates/welcome.template.ts +225 -225
- package/src/admin/mailing/index.ts +5 -5
- package/src/admin/mailing/patientInvite/index.ts +2 -2
- package/src/admin/mailing/patientInvite/patientInvite.mailing.ts +415 -415
- package/src/admin/mailing/patientInvite/templates/invitation.template.ts +105 -105
- 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 +818 -818
- 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 +260 -260
- 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 +557 -557
- 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 +1153 -1153
- 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 +239 -239
- 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 +17 -17
- package/src/config/tiers.config.ts +255 -229
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +211 -211
- 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 +298 -298
- package/src/services/__tests__/auth.service.test.ts +310 -310
- package/src/services/__tests__/base.service.test.ts +36 -36
- package/src/services/__tests__/user.service.test.ts +530 -530
- 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 +2148 -2148
- 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 +2943 -2941
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +620 -620
- package/src/services/appointment/utils/extended-procedure.utils.ts +354 -354
- package/src/services/appointment/utils/form-initialization.utils.ts +516 -516
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +468 -468
- package/src/services/appointment/utils/zone-photo.utils.ts +302 -302
- package/src/services/auth/auth.service.ts +1435 -1435
- 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 +1693 -1693
- 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 +676 -676
- 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 +265 -265
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +222 -222
- package/src/services/clinic/__tests__/clinic.service.test.ts +302 -302
- 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 +720 -720
- 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 +1023 -1023
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +462 -462
- package/src/services/clinic/utils/index.ts +10 -10
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +83 -83
- 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 +597 -597
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +16 -15
- 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 +286 -286
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +1021 -1021
- package/src/services/patient/patientRequirements.service.ts +309 -309
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/body-assessment.utils.ts +159 -159
- package/src/services/patient/utils/clinic.utils.ts +159 -159
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/hair-scalp-assessment.utils.ts +158 -158
- 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/pre-surgical-assessment.utils.ts +161 -161
- 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/skin-quality-assessment.utils.ts +160 -160
- 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 +2355 -2354
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +2521 -2521
- package/src/services/resource/README.md +119 -0
- package/src/services/resource/index.ts +1 -0
- package/src/services/resource/resource.service.ts +555 -0
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +745 -745
- package/src/services/tier-enforcement.ts +240 -240
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +533 -533
- package/src/services/user/user.v2.service.ts +467 -467
- 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 +524 -517
- package/src/types/calendar/index.ts +261 -260
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +530 -529
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/rbac.types.ts +64 -63
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +50 -47
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +300 -300
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/body-assessment.types.ts +93 -93
- package/src/types/patient/hair-scalp-assessment.types.ts +98 -98
- package/src/types/patient/index.ts +279 -279
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/pre-surgical-assessment.types.ts +95 -95
- package/src/types/patient/skin-quality-assessment.types.ts +105 -105
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +208 -208
- package/src/types/procedure/index.ts +189 -183
- package/src/types/profile/index.ts +39 -39
- package/src/types/resource/README.md +153 -0
- package/src/types/resource/index.ts +199 -0
- package/src/types/reviews/index.ts +132 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +60 -60
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/README.md +94 -0
- package/src/validations/appointment.schema.ts +589 -589
- 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 +21 -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/body-assessment.schema.ts +82 -82
- package/src/validations/patient/hair-scalp-assessment.schema.ts +70 -70
- package/src/validations/patient/medical-info.schema.ts +177 -177
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/pre-surgical-assessment.schema.ts +78 -78
- package/src/validations/patient/skin-quality-assessment.schema.ts +70 -70
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -217
- package/src/validations/practitioner.schema.ts +224 -224
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +136 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/resource.schema.ts +57 -0
- package/src/validations/reviews.schema.ts +195 -195
- package/src/validations/schemas.ts +109 -109
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,177 +1,177 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import {
|
|
3
|
-
AllergyType,
|
|
4
|
-
MedicationAllergySubtype,
|
|
5
|
-
FoodAllergySubtype,
|
|
6
|
-
EnvironmentalAllergySubtype,
|
|
7
|
-
CosmeticAllergySubtype,
|
|
8
|
-
} from "../../types/patient/allergies";
|
|
9
|
-
import { BlockingCondition } from "../../backoffice/types/static/blocking-condition.types";
|
|
10
|
-
import { timestampSchema } from "../common.schema";
|
|
11
|
-
|
|
12
|
-
export const allergySubtypeSchema = z.union([
|
|
13
|
-
z.nativeEnum(MedicationAllergySubtype),
|
|
14
|
-
z.nativeEnum(FoodAllergySubtype),
|
|
15
|
-
z.nativeEnum(EnvironmentalAllergySubtype),
|
|
16
|
-
z.nativeEnum(CosmeticAllergySubtype),
|
|
17
|
-
z.literal("other"),
|
|
18
|
-
]);
|
|
19
|
-
|
|
20
|
-
export const allergySchema = z.object({
|
|
21
|
-
type: z.nativeEnum(AllergyType),
|
|
22
|
-
subtype: allergySubtypeSchema,
|
|
23
|
-
name: z.string().optional().nullable(),
|
|
24
|
-
severity: z.enum(["mild", "moderate", "severe"]).optional(),
|
|
25
|
-
reaction: z.string().optional().nullable(),
|
|
26
|
-
diagnosed: timestampSchema.optional().nullable(),
|
|
27
|
-
notes: z.string().optional().nullable(),
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
export const vitalStatsSchema = z.object({
|
|
31
|
-
height: z.number().positive().optional(),
|
|
32
|
-
weight: z.number().positive().optional(),
|
|
33
|
-
bloodType: z
|
|
34
|
-
.enum(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"])
|
|
35
|
-
.optional(),
|
|
36
|
-
bloodPressure: z
|
|
37
|
-
.object({
|
|
38
|
-
systolic: z.number().min(70).max(200),
|
|
39
|
-
diastolic: z.number().min(40).max(130),
|
|
40
|
-
lastMeasured: timestampSchema,
|
|
41
|
-
})
|
|
42
|
-
.optional(),
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
export const blockingConditionSchema = z.object({
|
|
46
|
-
condition: z.nativeEnum(BlockingCondition),
|
|
47
|
-
diagnosedAt: timestampSchema,
|
|
48
|
-
notes: z.string().optional().nullable(),
|
|
49
|
-
isActive: z.boolean(),
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
export const contraindicationDynamicSchema = z.object({
|
|
53
|
-
id: z.string(),
|
|
54
|
-
name: z.string(),
|
|
55
|
-
description: z.string().optional(),
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
export const contraindicationSchema = z.object({
|
|
59
|
-
condition: contraindicationDynamicSchema,
|
|
60
|
-
lastOccurrence: timestampSchema,
|
|
61
|
-
frequency: z.enum(["rare", "occasional", "frequent"]),
|
|
62
|
-
notes: z.string().optional().nullable(),
|
|
63
|
-
isActive: z.boolean(),
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
// Base medication schema without refinement (for update operations that need .partial())
|
|
67
|
-
const baseMedicationSchema = z.object({
|
|
68
|
-
name: z.string().min(1),
|
|
69
|
-
dosage: z.string().min(1),
|
|
70
|
-
frequency: z.string().min(1),
|
|
71
|
-
startDate: timestampSchema.optional().nullable(),
|
|
72
|
-
endDate: timestampSchema.optional().nullable(),
|
|
73
|
-
prescribedBy: z.string().optional().nullable(),
|
|
74
|
-
});
|
|
75
|
-
|
|
76
|
-
// Medication schema with date validation refinement
|
|
77
|
-
export const medicationSchema = baseMedicationSchema.refine(
|
|
78
|
-
(data) => {
|
|
79
|
-
// If either date is not provided, skip validation (both are optional)
|
|
80
|
-
// However, if endDate is provided, startDate must also be provided
|
|
81
|
-
if (!data.endDate) {
|
|
82
|
-
return true;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// If endDate exists but startDate doesn't, this is invalid
|
|
86
|
-
if (!data.startDate) {
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
// Both dates must be Timestamp objects with toDate method
|
|
91
|
-
const startDate = data.startDate.toDate();
|
|
92
|
-
const endDate = data.endDate.toDate();
|
|
93
|
-
|
|
94
|
-
// End date must be >= start date
|
|
95
|
-
return endDate >= startDate;
|
|
96
|
-
},
|
|
97
|
-
{
|
|
98
|
-
message: "End date requires a start date and must be equal to or after start date",
|
|
99
|
-
path: ["endDate"], // This will attach the error to the endDate field
|
|
100
|
-
}
|
|
101
|
-
);
|
|
102
|
-
|
|
103
|
-
export const patientMedicalInfoSchema = z.object({
|
|
104
|
-
patientId: z.string(),
|
|
105
|
-
vitalStats: vitalStatsSchema,
|
|
106
|
-
blockingConditions: z.array(blockingConditionSchema),
|
|
107
|
-
contraindications: z.array(contraindicationSchema),
|
|
108
|
-
allergies: z.array(allergySchema),
|
|
109
|
-
currentMedications: z.array(medicationSchema),
|
|
110
|
-
emergencyNotes: z.string().optional(),
|
|
111
|
-
lastUpdated: timestampSchema,
|
|
112
|
-
updatedBy: z.string(),
|
|
113
|
-
verifiedBy: z.string().optional(),
|
|
114
|
-
verifiedAt: timestampSchema.optional(),
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
export const createPatientMedicalInfoSchema = patientMedicalInfoSchema.omit({
|
|
118
|
-
patientId: true,
|
|
119
|
-
lastUpdated: true,
|
|
120
|
-
updatedBy: true,
|
|
121
|
-
verifiedBy: true,
|
|
122
|
-
verifiedAt: true,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
export const updatePatientMedicalInfoSchema =
|
|
126
|
-
createPatientMedicalInfoSchema.partial();
|
|
127
|
-
|
|
128
|
-
// Šeme za pojedinačne operacije
|
|
129
|
-
export const updateVitalStatsSchema = vitalStatsSchema;
|
|
130
|
-
|
|
131
|
-
export const addAllergySchema = allergySchema;
|
|
132
|
-
export const updateAllergySchema = allergySchema.partial().extend({
|
|
133
|
-
allergyIndex: z.number().min(0),
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
export const addBlockingConditionSchema = blockingConditionSchema;
|
|
137
|
-
export const updateBlockingConditionSchema = blockingConditionSchema
|
|
138
|
-
.partial()
|
|
139
|
-
.extend({
|
|
140
|
-
conditionIndex: z.number().min(0),
|
|
141
|
-
});
|
|
142
|
-
|
|
143
|
-
export const addContraindicationSchema = contraindicationSchema;
|
|
144
|
-
export const updateContraindicationSchema = contraindicationSchema
|
|
145
|
-
.partial()
|
|
146
|
-
.extend({
|
|
147
|
-
contraindicationIndex: z.number().min(0),
|
|
148
|
-
});
|
|
149
|
-
|
|
150
|
-
export const addMedicationSchema = medicationSchema;
|
|
151
|
-
export const updateMedicationSchema = baseMedicationSchema.partial().extend({
|
|
152
|
-
medicationIndex: z.number().min(0),
|
|
153
|
-
}).refine(
|
|
154
|
-
(data) => {
|
|
155
|
-
// If either date is not provided, skip validation (both are optional)
|
|
156
|
-
// However, if endDate is provided, startDate must also be provided
|
|
157
|
-
if (!data.endDate) {
|
|
158
|
-
return true;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// If endDate exists but startDate doesn't, this is invalid
|
|
162
|
-
if (!data.startDate) {
|
|
163
|
-
return false;
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
// Both dates must be Timestamp objects with toDate method
|
|
167
|
-
const startDate = data.startDate.toDate();
|
|
168
|
-
const endDate = data.endDate.toDate();
|
|
169
|
-
|
|
170
|
-
// End date must be >= start date
|
|
171
|
-
return endDate >= startDate;
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
message: "End date requires a start date and must be equal to or after start date",
|
|
175
|
-
path: ["endDate"], // This will attach the error to the endDate field
|
|
176
|
-
}
|
|
177
|
-
);
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import {
|
|
3
|
+
AllergyType,
|
|
4
|
+
MedicationAllergySubtype,
|
|
5
|
+
FoodAllergySubtype,
|
|
6
|
+
EnvironmentalAllergySubtype,
|
|
7
|
+
CosmeticAllergySubtype,
|
|
8
|
+
} from "../../types/patient/allergies";
|
|
9
|
+
import { BlockingCondition } from "../../backoffice/types/static/blocking-condition.types";
|
|
10
|
+
import { timestampSchema } from "../common.schema";
|
|
11
|
+
|
|
12
|
+
export const allergySubtypeSchema = z.union([
|
|
13
|
+
z.nativeEnum(MedicationAllergySubtype),
|
|
14
|
+
z.nativeEnum(FoodAllergySubtype),
|
|
15
|
+
z.nativeEnum(EnvironmentalAllergySubtype),
|
|
16
|
+
z.nativeEnum(CosmeticAllergySubtype),
|
|
17
|
+
z.literal("other"),
|
|
18
|
+
]);
|
|
19
|
+
|
|
20
|
+
export const allergySchema = z.object({
|
|
21
|
+
type: z.nativeEnum(AllergyType),
|
|
22
|
+
subtype: allergySubtypeSchema,
|
|
23
|
+
name: z.string().optional().nullable(),
|
|
24
|
+
severity: z.enum(["mild", "moderate", "severe"]).optional(),
|
|
25
|
+
reaction: z.string().optional().nullable(),
|
|
26
|
+
diagnosed: timestampSchema.optional().nullable(),
|
|
27
|
+
notes: z.string().optional().nullable(),
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export const vitalStatsSchema = z.object({
|
|
31
|
+
height: z.number().positive().optional(),
|
|
32
|
+
weight: z.number().positive().optional(),
|
|
33
|
+
bloodType: z
|
|
34
|
+
.enum(["A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"])
|
|
35
|
+
.optional(),
|
|
36
|
+
bloodPressure: z
|
|
37
|
+
.object({
|
|
38
|
+
systolic: z.number().min(70).max(200),
|
|
39
|
+
diastolic: z.number().min(40).max(130),
|
|
40
|
+
lastMeasured: timestampSchema,
|
|
41
|
+
})
|
|
42
|
+
.optional(),
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
export const blockingConditionSchema = z.object({
|
|
46
|
+
condition: z.nativeEnum(BlockingCondition),
|
|
47
|
+
diagnosedAt: timestampSchema,
|
|
48
|
+
notes: z.string().optional().nullable(),
|
|
49
|
+
isActive: z.boolean(),
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
export const contraindicationDynamicSchema = z.object({
|
|
53
|
+
id: z.string(),
|
|
54
|
+
name: z.string(),
|
|
55
|
+
description: z.string().optional(),
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
export const contraindicationSchema = z.object({
|
|
59
|
+
condition: contraindicationDynamicSchema,
|
|
60
|
+
lastOccurrence: timestampSchema,
|
|
61
|
+
frequency: z.enum(["rare", "occasional", "frequent"]),
|
|
62
|
+
notes: z.string().optional().nullable(),
|
|
63
|
+
isActive: z.boolean(),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Base medication schema without refinement (for update operations that need .partial())
|
|
67
|
+
const baseMedicationSchema = z.object({
|
|
68
|
+
name: z.string().min(1),
|
|
69
|
+
dosage: z.string().min(1),
|
|
70
|
+
frequency: z.string().min(1),
|
|
71
|
+
startDate: timestampSchema.optional().nullable(),
|
|
72
|
+
endDate: timestampSchema.optional().nullable(),
|
|
73
|
+
prescribedBy: z.string().optional().nullable(),
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
// Medication schema with date validation refinement
|
|
77
|
+
export const medicationSchema = baseMedicationSchema.refine(
|
|
78
|
+
(data) => {
|
|
79
|
+
// If either date is not provided, skip validation (both are optional)
|
|
80
|
+
// However, if endDate is provided, startDate must also be provided
|
|
81
|
+
if (!data.endDate) {
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// If endDate exists but startDate doesn't, this is invalid
|
|
86
|
+
if (!data.startDate) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Both dates must be Timestamp objects with toDate method
|
|
91
|
+
const startDate = data.startDate.toDate();
|
|
92
|
+
const endDate = data.endDate.toDate();
|
|
93
|
+
|
|
94
|
+
// End date must be >= start date
|
|
95
|
+
return endDate >= startDate;
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
message: "End date requires a start date and must be equal to or after start date",
|
|
99
|
+
path: ["endDate"], // This will attach the error to the endDate field
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
export const patientMedicalInfoSchema = z.object({
|
|
104
|
+
patientId: z.string(),
|
|
105
|
+
vitalStats: vitalStatsSchema,
|
|
106
|
+
blockingConditions: z.array(blockingConditionSchema),
|
|
107
|
+
contraindications: z.array(contraindicationSchema),
|
|
108
|
+
allergies: z.array(allergySchema),
|
|
109
|
+
currentMedications: z.array(medicationSchema),
|
|
110
|
+
emergencyNotes: z.string().optional(),
|
|
111
|
+
lastUpdated: timestampSchema,
|
|
112
|
+
updatedBy: z.string(),
|
|
113
|
+
verifiedBy: z.string().optional(),
|
|
114
|
+
verifiedAt: timestampSchema.optional(),
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
export const createPatientMedicalInfoSchema = patientMedicalInfoSchema.omit({
|
|
118
|
+
patientId: true,
|
|
119
|
+
lastUpdated: true,
|
|
120
|
+
updatedBy: true,
|
|
121
|
+
verifiedBy: true,
|
|
122
|
+
verifiedAt: true,
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
export const updatePatientMedicalInfoSchema =
|
|
126
|
+
createPatientMedicalInfoSchema.partial();
|
|
127
|
+
|
|
128
|
+
// Šeme za pojedinačne operacije
|
|
129
|
+
export const updateVitalStatsSchema = vitalStatsSchema;
|
|
130
|
+
|
|
131
|
+
export const addAllergySchema = allergySchema;
|
|
132
|
+
export const updateAllergySchema = allergySchema.partial().extend({
|
|
133
|
+
allergyIndex: z.number().min(0),
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
export const addBlockingConditionSchema = blockingConditionSchema;
|
|
137
|
+
export const updateBlockingConditionSchema = blockingConditionSchema
|
|
138
|
+
.partial()
|
|
139
|
+
.extend({
|
|
140
|
+
conditionIndex: z.number().min(0),
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
export const addContraindicationSchema = contraindicationSchema;
|
|
144
|
+
export const updateContraindicationSchema = contraindicationSchema
|
|
145
|
+
.partial()
|
|
146
|
+
.extend({
|
|
147
|
+
contraindicationIndex: z.number().min(0),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
export const addMedicationSchema = medicationSchema;
|
|
151
|
+
export const updateMedicationSchema = baseMedicationSchema.partial().extend({
|
|
152
|
+
medicationIndex: z.number().min(0),
|
|
153
|
+
}).refine(
|
|
154
|
+
(data) => {
|
|
155
|
+
// If either date is not provided, skip validation (both are optional)
|
|
156
|
+
// However, if endDate is provided, startDate must also be provided
|
|
157
|
+
if (!data.endDate) {
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// If endDate exists but startDate doesn't, this is invalid
|
|
162
|
+
if (!data.startDate) {
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Both dates must be Timestamp objects with toDate method
|
|
167
|
+
const startDate = data.startDate.toDate();
|
|
168
|
+
const endDate = data.endDate.toDate();
|
|
169
|
+
|
|
170
|
+
// End date must be >= start date
|
|
171
|
+
return endDate >= startDate;
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
message: "End date requires a start date and must be equal to or after start date",
|
|
175
|
+
path: ["endDate"], // This will attach the error to the endDate field
|
|
176
|
+
}
|
|
177
|
+
);
|
|
@@ -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
|
+
});
|