@blackcode_sa/metaestetics-api 1.12.62 → 1.12.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/index.d.mts +4 -2
- package/dist/admin/index.d.ts +4 -2
- package/dist/admin/index.js +4 -45
- package/dist/admin/index.mjs +4 -45
- package/dist/backoffice/index.d.mts +86 -1
- package/dist/backoffice/index.d.ts +86 -1
- package/dist/backoffice/index.js +308 -0
- package/dist/backoffice/index.mjs +306 -0
- package/dist/index.d.mts +99 -3
- package/dist/index.d.ts +99 -3
- package/dist/index.js +545 -281
- package/dist/index.mjs +867 -603
- package/package.json +119 -119
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +128 -128
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1844 -1844
- package/src/admin/aggregation/appointment/index.ts +1 -1
- package/src/admin/aggregation/clinic/README.md +52 -52
- package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +703 -703
- package/src/admin/aggregation/clinic/index.ts +1 -1
- package/src/admin/aggregation/forms/README.md +13 -13
- package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
- package/src/admin/aggregation/forms/index.ts +1 -1
- package/src/admin/aggregation/index.ts +8 -8
- package/src/admin/aggregation/patient/README.md +27 -27
- package/src/admin/aggregation/patient/index.ts +1 -1
- package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
- package/src/admin/aggregation/practitioner/README.md +42 -42
- package/src/admin/aggregation/practitioner/index.ts +1 -1
- package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
- package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
- package/src/admin/aggregation/procedure/README.md +43 -43
- package/src/admin/aggregation/procedure/index.ts +1 -1
- package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
- package/src/admin/aggregation/reviews/index.ts +1 -1
- package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +641 -689
- package/src/admin/booking/README.md +125 -125
- package/src/admin/booking/booking.admin.ts +1037 -1037
- package/src/admin/booking/booking.calculator.ts +712 -712
- package/src/admin/booking/booking.types.ts +59 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +7 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +1 -1
- package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
- package/src/admin/documentation-templates/index.ts +1 -1
- package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
- package/src/admin/free-consultation/index.ts +1 -1
- package/src/admin/index.ts +75 -75
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +95 -95
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
- package/src/admin/mailing/appointment/index.ts +1 -1
- package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
- package/src/admin/mailing/base.mailing.service.ts +208 -208
- package/src/admin/mailing/index.ts +3 -3
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
- package/src/admin/mailing/practitionerInvite/index.ts +2 -2
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
- package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
- package/src/admin/notifications/index.ts +1 -1
- package/src/admin/notifications/notifications.admin.ts +710 -710
- package/src/admin/requirements/README.md +128 -128
- package/src/admin/requirements/index.ts +1 -1
- package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
- package/src/admin/users/index.ts +1 -1
- package/src/admin/users/user-profile.admin.ts +405 -405
- package/src/backoffice/constants/certification.constants.ts +13 -13
- package/src/backoffice/constants/index.ts +1 -1
- package/src/backoffice/errors/backoffice.errors.ts +181 -181
- package/src/backoffice/errors/index.ts +1 -1
- package/src/backoffice/expo-safe/README.md +26 -26
- package/src/backoffice/expo-safe/index.ts +41 -41
- package/src/backoffice/index.ts +5 -5
- package/src/backoffice/services/FIXES_README.md +102 -102
- package/src/backoffice/services/README.md +40 -40
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +318 -318
- package/src/backoffice/services/constants.service.ts +385 -385
- package/src/backoffice/services/documentation-template.service.ts +202 -202
- package/src/backoffice/services/index.ts +11 -8
- package/src/backoffice/services/migrate-products.ts +116 -116
- package/src/backoffice/services/product.service.ts +553 -553
- package/src/backoffice/services/requirement.service.ts +235 -235
- package/src/backoffice/services/subcategory.service.ts +395 -395
- package/src/backoffice/services/technology.service.ts +1083 -1070
- package/src/backoffice/types/README.md +12 -12
- package/src/backoffice/types/admin-constants.types.ts +69 -69
- package/src/backoffice/types/brand.types.ts +29 -29
- package/src/backoffice/types/category.types.ts +62 -62
- package/src/backoffice/types/documentation-templates.types.ts +28 -28
- package/src/backoffice/types/index.ts +10 -10
- package/src/backoffice/types/procedure-product.types.ts +38 -38
- package/src/backoffice/types/product.types.ts +240 -240
- package/src/backoffice/types/requirement.types.ts +63 -63
- package/src/backoffice/types/static/README.md +18 -18
- package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
- package/src/backoffice/types/static/certification.types.ts +37 -37
- package/src/backoffice/types/static/contraindication.types.ts +19 -19
- package/src/backoffice/types/static/index.ts +6 -6
- package/src/backoffice/types/static/pricing.types.ts +16 -16
- package/src/backoffice/types/static/procedure-family.types.ts +14 -14
- package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
- package/src/backoffice/types/subcategory.types.ts +34 -34
- package/src/backoffice/types/technology.types.ts +163 -161
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -163
- package/src/config/__mocks__/firebase.ts +99 -99
- package/src/config/firebase.ts +78 -78
- package/src/config/index.ts +9 -9
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +200 -200
- package/src/errors/clinic.errors.ts +32 -32
- package/src/errors/firebase.errors.ts +47 -47
- package/src/errors/user.errors.ts +99 -99
- package/src/index.backup.ts +407 -407
- package/src/index.ts +6 -6
- package/src/locales/en.ts +31 -31
- package/src/recommender/admin/index.ts +1 -1
- package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
- package/src/recommender/front/index.ts +1 -1
- package/src/recommender/front/services/onboarding.service.ts +5 -5
- package/src/recommender/front/services/recommender.service.ts +3 -3
- package/src/recommender/index.ts +1 -1
- package/src/services/PATIENTAUTH.MD +197 -197
- package/src/services/README.md +106 -106
- package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
- package/src/services/__tests__/auth/auth.setup.ts +293 -293
- package/src/services/__tests__/auth.service.test.ts +346 -346
- package/src/services/__tests__/base.service.test.ts +77 -77
- package/src/services/__tests__/user.service.test.ts +528 -528
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2505 -2082
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +552 -552
- package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
- package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +353 -353
- package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
- package/src/services/auth/auth.service.ts +989 -989
- package/src/services/auth/auth.v2.service.ts +961 -961
- package/src/services/auth/index.ts +7 -7
- package/src/services/auth/utils/error.utils.ts +90 -90
- package/src/services/auth/utils/firebase.utils.ts +49 -49
- package/src/services/auth/utils/index.ts +21 -21
- package/src/services/auth/utils/practitioner.utils.ts +125 -125
- package/src/services/base.service.ts +41 -41
- package/src/services/calendar/calendar.service.ts +1077 -1077
- package/src/services/calendar/calendar.v2.service.ts +1683 -1683
- package/src/services/calendar/calendar.v3.service.ts +313 -313
- package/src/services/calendar/externalCalendar.service.ts +178 -178
- package/src/services/calendar/index.ts +5 -5
- package/src/services/calendar/synced-calendars.service.ts +743 -743
- package/src/services/calendar/utils/appointment.utils.ts +265 -265
- package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
- package/src/services/calendar/utils/clinic.utils.ts +237 -237
- package/src/services/calendar/utils/docs.utils.ts +157 -157
- package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
- package/src/services/calendar/utils/index.ts +8 -8
- package/src/services/calendar/utils/patient.utils.ts +198 -198
- package/src/services/calendar/utils/practitioner.utils.ts +221 -221
- package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
- package/src/services/clinic/README.md +204 -204
- package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
- package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
- package/src/services/clinic/billing-transactions.service.ts +217 -217
- package/src/services/clinic/clinic-admin.service.ts +202 -202
- package/src/services/clinic/clinic-group.service.ts +310 -310
- package/src/services/clinic/clinic.service.ts +708 -708
- package/src/services/clinic/index.ts +5 -5
- package/src/services/clinic/practitioner-invite.service.ts +519 -519
- package/src/services/clinic/utils/admin.utils.ts +551 -551
- package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
- package/src/services/clinic/utils/clinic.utils.ts +949 -949
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +446 -446
- package/src/services/clinic/utils/index.ts +11 -11
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +84 -84
- package/src/services/clinic/utils/tag.utils.ts +124 -124
- package/src/services/documentation-templates/documentation-template.service.ts +537 -537
- package/src/services/documentation-templates/filled-document.service.ts +587 -587
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +13 -13
- package/src/services/media/index.ts +1 -1
- package/src/services/media/media.service.ts +418 -418
- package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
- package/src/services/notifications/index.ts +1 -1
- package/src/services/notifications/notification.service.ts +215 -215
- package/src/services/patient/README.md +48 -48
- package/src/services/patient/To-Do.md +43 -43
- package/src/services/patient/__tests__/patient.service.test.ts +294 -294
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +883 -883
- package/src/services/patient/patientRequirements.service.ts +285 -285
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/clinic.utils.ts +80 -80
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/index.ts +9 -9
- package/src/services/patient/utils/location.utils.ts +126 -126
- package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
- package/src/services/patient/utils/medical.utils.ts +458 -458
- package/src/services/patient/utils/practitioner.utils.ts +260 -260
- package/src/services/patient/utils/profile.utils.ts +510 -510
- package/src/services/patient/utils/sensitive.utils.ts +260 -260
- package/src/services/patient/utils/token.utils.ts +211 -211
- package/src/services/practitioner/README.md +145 -145
- package/src/services/practitioner/index.ts +1 -1
- package/src/services/practitioner/practitioner.service.ts +1742 -1742
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +1682 -1682
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +636 -683
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +489 -489
- package/src/services/user/user.v2.service.ts +466 -466
- package/src/types/appointment/index.ts +481 -453
- package/src/types/calendar/index.ts +258 -258
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +489 -489
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +44 -44
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +265 -265
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/index.ts +275 -273
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +206 -206
- package/src/types/procedure/index.ts +181 -181
- package/src/types/profile/index.ts +39 -39
- package/src/types/reviews/index.ts +130 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +38 -38
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/appointment.schema.ts +574 -574
- package/src/validations/calendar.schema.ts +225 -225
- package/src/validations/clinic.schema.ts +493 -493
- package/src/validations/common.schema.ts +25 -25
- package/src/validations/documentation-templates/index.ts +1 -1
- package/src/validations/documentation-templates/template.schema.ts +220 -220
- package/src/validations/documentation-templates.schema.ts +10 -10
- package/src/validations/index.ts +20 -20
- package/src/validations/media.schema.ts +10 -10
- package/src/validations/notification.schema.ts +90 -90
- package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
- package/src/validations/patient/medical-info.schema.ts +125 -125
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -216
- package/src/validations/practitioner.schema.ts +222 -222
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +124 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/reviews.schema.ts +189 -195
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,195 +1,189 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Base review schema with common properties
|
|
5
|
-
*/
|
|
6
|
-
const baseReviewSchema = z.object({
|
|
7
|
-
id: z.string().min(1),
|
|
8
|
-
patientId: z.string().min(1),
|
|
9
|
-
fullReviewId: z.string().min(1),
|
|
10
|
-
createdAt: z.date(),
|
|
11
|
-
updatedAt: z.date(),
|
|
12
|
-
comment: z.string().min(1).max(2000),
|
|
13
|
-
isVerified: z.boolean(),
|
|
14
|
-
isPublished: z.boolean(),
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Base review creation schema
|
|
19
|
-
*/
|
|
20
|
-
const baseReviewCreateSchema = z.object({
|
|
21
|
-
patientId: z.string().min(1),
|
|
22
|
-
comment: z.string().min(1).max(2000),
|
|
23
|
-
isVerified: z.boolean().default(false),
|
|
24
|
-
isPublished: z.boolean().default(true),
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Clinic review schema
|
|
29
|
-
*/
|
|
30
|
-
export const clinicReviewSchema = baseReviewSchema.extend({
|
|
31
|
-
clinicId: z.string().min(1),
|
|
32
|
-
cleanliness: z.number().min(1).max(5),
|
|
33
|
-
facilities: z.number().min(1).max(5),
|
|
34
|
-
staffFriendliness: z.number().min(1).max(5),
|
|
35
|
-
waitingTime: z.number().min(1).max(5),
|
|
36
|
-
accessibility: z.number().min(1).max(5),
|
|
37
|
-
overallRating: z.number().min(1).max(5),
|
|
38
|
-
wouldRecommend: z.boolean(),
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Clinic review creation schema
|
|
43
|
-
*/
|
|
44
|
-
export const createClinicReviewSchema = baseReviewCreateSchema.extend({
|
|
45
|
-
clinicId: z.string().min(1),
|
|
46
|
-
cleanliness: z.number().min(1).max(5),
|
|
47
|
-
facilities: z.number().min(1).max(5),
|
|
48
|
-
staffFriendliness: z.number().min(1).max(5),
|
|
49
|
-
waitingTime: z.number().min(1).max(5),
|
|
50
|
-
accessibility: z.number().min(1).max(5),
|
|
51
|
-
wouldRecommend: z.boolean(),
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Practitioner review schema
|
|
56
|
-
*/
|
|
57
|
-
export const practitionerReviewSchema = baseReviewSchema.extend({
|
|
58
|
-
practitionerId: z.string().min(1),
|
|
59
|
-
knowledgeAndExpertise: z.number().min(1).max(5),
|
|
60
|
-
communicationSkills: z.number().min(1).max(5),
|
|
61
|
-
bedSideManner: z.number().min(1).max(5),
|
|
62
|
-
thoroughness: z.number().min(1).max(5),
|
|
63
|
-
trustworthiness: z.number().min(1).max(5),
|
|
64
|
-
overallRating: z.number().min(1).max(5),
|
|
65
|
-
wouldRecommend: z.boolean(),
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
/**
|
|
69
|
-
* Practitioner review creation schema
|
|
70
|
-
*/
|
|
71
|
-
export const createPractitionerReviewSchema = baseReviewCreateSchema.extend({
|
|
72
|
-
practitionerId: z.string().min(1),
|
|
73
|
-
knowledgeAndExpertise: z.number().min(1).max(5),
|
|
74
|
-
communicationSkills: z.number().min(1).max(5),
|
|
75
|
-
bedSideManner: z.number().min(1).max(5),
|
|
76
|
-
thoroughness: z.number().min(1).max(5),
|
|
77
|
-
trustworthiness: z.number().min(1).max(5),
|
|
78
|
-
wouldRecommend: z.boolean(),
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Procedure review schema
|
|
83
|
-
*/
|
|
84
|
-
export const procedureReviewSchema = baseReviewSchema.extend({
|
|
85
|
-
procedureId: z.string().min(1),
|
|
86
|
-
effectivenessOfTreatment: z.number().min(1).max(5),
|
|
87
|
-
outcomeExplanation: z.number().min(1).max(5),
|
|
88
|
-
painManagement: z.number().min(1).max(5),
|
|
89
|
-
followUpCare: z.number().min(1).max(5),
|
|
90
|
-
valueForMoney: z.number().min(1).max(5),
|
|
91
|
-
overallRating: z.number().min(1).max(5),
|
|
92
|
-
wouldRecommend: z.boolean(),
|
|
93
|
-
});
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Procedure review creation schema
|
|
97
|
-
*/
|
|
98
|
-
export const createProcedureReviewSchema = baseReviewCreateSchema.extend({
|
|
99
|
-
procedureId: z.string().min(1),
|
|
100
|
-
effectivenessOfTreatment: z.number().min(1).max(5),
|
|
101
|
-
outcomeExplanation: z.number().min(1).max(5),
|
|
102
|
-
painManagement: z.number().min(1).max(5),
|
|
103
|
-
followUpCare: z.number().min(1).max(5),
|
|
104
|
-
valueForMoney: z.number().min(1).max(5),
|
|
105
|
-
wouldRecommend: z.boolean(),
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
{
|
|
191
|
-
message:
|
|
192
|
-
"At least one review type (clinic, practitioner, procedure, or extended procedure) must be provided",
|
|
193
|
-
path: ["reviewType"],
|
|
194
|
-
}
|
|
195
|
-
);
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Base review schema with common properties
|
|
5
|
+
*/
|
|
6
|
+
const baseReviewSchema = z.object({
|
|
7
|
+
id: z.string().min(1),
|
|
8
|
+
patientId: z.string().min(1),
|
|
9
|
+
fullReviewId: z.string().min(1),
|
|
10
|
+
createdAt: z.date(),
|
|
11
|
+
updatedAt: z.date(),
|
|
12
|
+
comment: z.string().min(1).max(2000),
|
|
13
|
+
isVerified: z.boolean(),
|
|
14
|
+
isPublished: z.boolean(),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Base review creation schema
|
|
19
|
+
*/
|
|
20
|
+
const baseReviewCreateSchema = z.object({
|
|
21
|
+
patientId: z.string().min(1),
|
|
22
|
+
comment: z.string().min(1).max(2000),
|
|
23
|
+
isVerified: z.boolean().default(false),
|
|
24
|
+
isPublished: z.boolean().default(true),
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Clinic review schema
|
|
29
|
+
*/
|
|
30
|
+
export const clinicReviewSchema = baseReviewSchema.extend({
|
|
31
|
+
clinicId: z.string().min(1),
|
|
32
|
+
cleanliness: z.number().min(1).max(5),
|
|
33
|
+
facilities: z.number().min(1).max(5),
|
|
34
|
+
staffFriendliness: z.number().min(1).max(5),
|
|
35
|
+
waitingTime: z.number().min(1).max(5),
|
|
36
|
+
accessibility: z.number().min(1).max(5),
|
|
37
|
+
overallRating: z.number().min(1).max(5),
|
|
38
|
+
wouldRecommend: z.boolean(),
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Clinic review creation schema
|
|
43
|
+
*/
|
|
44
|
+
export const createClinicReviewSchema = baseReviewCreateSchema.extend({
|
|
45
|
+
clinicId: z.string().min(1),
|
|
46
|
+
cleanliness: z.number().min(1).max(5),
|
|
47
|
+
facilities: z.number().min(1).max(5),
|
|
48
|
+
staffFriendliness: z.number().min(1).max(5),
|
|
49
|
+
waitingTime: z.number().min(1).max(5),
|
|
50
|
+
accessibility: z.number().min(1).max(5),
|
|
51
|
+
wouldRecommend: z.boolean(),
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Practitioner review schema
|
|
56
|
+
*/
|
|
57
|
+
export const practitionerReviewSchema = baseReviewSchema.extend({
|
|
58
|
+
practitionerId: z.string().min(1),
|
|
59
|
+
knowledgeAndExpertise: z.number().min(1).max(5),
|
|
60
|
+
communicationSkills: z.number().min(1).max(5),
|
|
61
|
+
bedSideManner: z.number().min(1).max(5),
|
|
62
|
+
thoroughness: z.number().min(1).max(5),
|
|
63
|
+
trustworthiness: z.number().min(1).max(5),
|
|
64
|
+
overallRating: z.number().min(1).max(5),
|
|
65
|
+
wouldRecommend: z.boolean(),
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Practitioner review creation schema
|
|
70
|
+
*/
|
|
71
|
+
export const createPractitionerReviewSchema = baseReviewCreateSchema.extend({
|
|
72
|
+
practitionerId: z.string().min(1),
|
|
73
|
+
knowledgeAndExpertise: z.number().min(1).max(5),
|
|
74
|
+
communicationSkills: z.number().min(1).max(5),
|
|
75
|
+
bedSideManner: z.number().min(1).max(5),
|
|
76
|
+
thoroughness: z.number().min(1).max(5),
|
|
77
|
+
trustworthiness: z.number().min(1).max(5),
|
|
78
|
+
wouldRecommend: z.boolean(),
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Procedure review schema
|
|
83
|
+
*/
|
|
84
|
+
export const procedureReviewSchema = baseReviewSchema.extend({
|
|
85
|
+
procedureId: z.string().min(1),
|
|
86
|
+
effectivenessOfTreatment: z.number().min(1).max(5),
|
|
87
|
+
outcomeExplanation: z.number().min(1).max(5),
|
|
88
|
+
painManagement: z.number().min(1).max(5),
|
|
89
|
+
followUpCare: z.number().min(1).max(5),
|
|
90
|
+
valueForMoney: z.number().min(1).max(5),
|
|
91
|
+
overallRating: z.number().min(1).max(5),
|
|
92
|
+
wouldRecommend: z.boolean(),
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Procedure review creation schema
|
|
97
|
+
*/
|
|
98
|
+
export const createProcedureReviewSchema = baseReviewCreateSchema.extend({
|
|
99
|
+
procedureId: z.string().min(1),
|
|
100
|
+
effectivenessOfTreatment: z.number().min(1).max(5),
|
|
101
|
+
outcomeExplanation: z.number().min(1).max(5),
|
|
102
|
+
painManagement: z.number().min(1).max(5),
|
|
103
|
+
followUpCare: z.number().min(1).max(5),
|
|
104
|
+
valueForMoney: z.number().min(1).max(5),
|
|
105
|
+
wouldRecommend: z.boolean(),
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Review info (condensed) schema for clinic
|
|
110
|
+
*/
|
|
111
|
+
export const clinicReviewInfoSchema = z.object({
|
|
112
|
+
totalReviews: z.number().min(0),
|
|
113
|
+
averageRating: z.number().min(0).max(5),
|
|
114
|
+
cleanliness: z.number().min(0).max(5),
|
|
115
|
+
facilities: z.number().min(0).max(5),
|
|
116
|
+
staffFriendliness: z.number().min(0).max(5),
|
|
117
|
+
waitingTime: z.number().min(0).max(5),
|
|
118
|
+
accessibility: z.number().min(0).max(5),
|
|
119
|
+
recommendationPercentage: z.number().min(0).max(100),
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Review info (condensed) schema for practitioner
|
|
124
|
+
*/
|
|
125
|
+
export const practitionerReviewInfoSchema = z.object({
|
|
126
|
+
totalReviews: z.number().min(0),
|
|
127
|
+
averageRating: z.number().min(0).max(5),
|
|
128
|
+
knowledgeAndExpertise: z.number().min(0).max(5),
|
|
129
|
+
communicationSkills: z.number().min(0).max(5),
|
|
130
|
+
bedSideManner: z.number().min(0).max(5),
|
|
131
|
+
thoroughness: z.number().min(0).max(5),
|
|
132
|
+
trustworthiness: z.number().min(0).max(5),
|
|
133
|
+
recommendationPercentage: z.number().min(0).max(100),
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Review info (condensed) schema for procedure
|
|
138
|
+
*/
|
|
139
|
+
export const procedureReviewInfoSchema = z.object({
|
|
140
|
+
totalReviews: z.number().min(0),
|
|
141
|
+
averageRating: z.number().min(0).max(5),
|
|
142
|
+
effectivenessOfTreatment: z.number().min(0).max(5),
|
|
143
|
+
outcomeExplanation: z.number().min(0).max(5),
|
|
144
|
+
painManagement: z.number().min(0).max(5),
|
|
145
|
+
followUpCare: z.number().min(0).max(5),
|
|
146
|
+
valueForMoney: z.number().min(0).max(5),
|
|
147
|
+
recommendationPercentage: z.number().min(0).max(100),
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Combined review schema
|
|
152
|
+
*/
|
|
153
|
+
export const reviewSchema = z.object({
|
|
154
|
+
id: z.string().min(1),
|
|
155
|
+
appointmentId: z.string().min(1),
|
|
156
|
+
patientId: z.string().min(1),
|
|
157
|
+
createdAt: z.date(),
|
|
158
|
+
updatedAt: z.date(),
|
|
159
|
+
clinicReview: clinicReviewSchema.optional(),
|
|
160
|
+
practitionerReview: practitionerReviewSchema.optional(),
|
|
161
|
+
procedureReview: procedureReviewSchema.optional(),
|
|
162
|
+
overallComment: z.string().min(1).max(2000),
|
|
163
|
+
overallRating: z.number().min(1).max(5),
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Combined review creation schema
|
|
168
|
+
*/
|
|
169
|
+
export const createReviewSchema = z
|
|
170
|
+
.object({
|
|
171
|
+
patientId: z.string().min(1),
|
|
172
|
+
clinicReview: createClinicReviewSchema.optional(),
|
|
173
|
+
practitionerReview: createPractitionerReviewSchema.optional(),
|
|
174
|
+
procedureReview: createProcedureReviewSchema.optional(),
|
|
175
|
+
overallComment: z.string().min(1).max(2000),
|
|
176
|
+
})
|
|
177
|
+
.refine(
|
|
178
|
+
(data) => {
|
|
179
|
+
// Ensure at least one review type is provided
|
|
180
|
+
return (
|
|
181
|
+
data.clinicReview || data.practitionerReview || data.procedureReview
|
|
182
|
+
);
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
message:
|
|
186
|
+
"At least one review type (clinic, practitioner, or procedure) must be provided",
|
|
187
|
+
path: ["reviewType"],
|
|
188
|
+
}
|
|
189
|
+
);
|
|
@@ -1,104 +1,104 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { UserRole } from "../types";
|
|
3
|
-
import { Timestamp, FieldValue } from "firebase/firestore";
|
|
4
|
-
|
|
5
|
-
export const emailSchema = z
|
|
6
|
-
.string()
|
|
7
|
-
.email("Invalid email format")
|
|
8
|
-
.min(5, "Email must be at least 5 characters")
|
|
9
|
-
.max(255, "Email must be less than 255 characters");
|
|
10
|
-
|
|
11
|
-
export const passwordSchema = z
|
|
12
|
-
.string()
|
|
13
|
-
.min(8, "Password must be at least 8 characters")
|
|
14
|
-
.max(100, "Password must be less than 100 characters")
|
|
15
|
-
.regex(
|
|
16
|
-
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\w\W]{8,}$/,
|
|
17
|
-
"Password must contain at least one uppercase letter, one lowercase letter, and one number"
|
|
18
|
-
);
|
|
19
|
-
|
|
20
|
-
export const userRoleSchema = z.nativeEnum(UserRole);
|
|
21
|
-
|
|
22
|
-
export const userRolesSchema = z
|
|
23
|
-
.array(userRoleSchema)
|
|
24
|
-
.min(1, "User must have at least one role")
|
|
25
|
-
.max(3, "User cannot have more than 3 roles");
|
|
26
|
-
|
|
27
|
-
// export const timestampSchema = z.custom<Timestamp | FieldValue | Date>(
|
|
28
|
-
// (data) => {
|
|
29
|
-
// // If it's a serverTimestamp (FieldValue), it's valid
|
|
30
|
-
// if (data && typeof data === "object" && "isEqual" in data) {
|
|
31
|
-
// return true;
|
|
32
|
-
// }
|
|
33
|
-
|
|
34
|
-
// // If it's a Timestamp object, validate its structure
|
|
35
|
-
// if (
|
|
36
|
-
// data &&
|
|
37
|
-
// typeof data === "object" &&
|
|
38
|
-
// "toDate" in data &&
|
|
39
|
-
// "seconds" in data &&
|
|
40
|
-
// "nanoseconds" in data
|
|
41
|
-
// ) {
|
|
42
|
-
// return true;
|
|
43
|
-
// }
|
|
44
|
-
|
|
45
|
-
// // If it's a JavaScript Date object (what Firestore returns on client), it's valid
|
|
46
|
-
// if (data instanceof Date) {
|
|
47
|
-
// return true;
|
|
48
|
-
// }
|
|
49
|
-
|
|
50
|
-
// return false;
|
|
51
|
-
// },
|
|
52
|
-
// "Must be a Timestamp object, Date object, or serverTimestamp"
|
|
53
|
-
// );
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Validaciona šema za clinic admin opcije pri kreiranju
|
|
57
|
-
*/
|
|
58
|
-
export const clinicAdminOptionsSchema = z
|
|
59
|
-
.object({
|
|
60
|
-
isGroupOwner: z.boolean(),
|
|
61
|
-
groupToken: z.string().optional(),
|
|
62
|
-
groupId: z.string().optional(),
|
|
63
|
-
})
|
|
64
|
-
.refine(
|
|
65
|
-
(data) => {
|
|
66
|
-
// Ako nije owner, mora imati i token i groupId
|
|
67
|
-
if (!data.isGroupOwner && (!data.groupToken || !data.groupId)) {
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
|
-
// Ako je owner, ne sme imati ni token ni groupId
|
|
71
|
-
if (data.isGroupOwner && (data.groupToken || data.groupId)) {
|
|
72
|
-
return false;
|
|
73
|
-
}
|
|
74
|
-
return true;
|
|
75
|
-
},
|
|
76
|
-
{
|
|
77
|
-
message: "Invalid clinic admin options configuration",
|
|
78
|
-
}
|
|
79
|
-
);
|
|
80
|
-
|
|
81
|
-
/**
|
|
82
|
-
* Validaciona šema za opcije pri kreiranju korisnika
|
|
83
|
-
*/
|
|
84
|
-
export const createUserOptionsSchema = z.object({
|
|
85
|
-
clinicAdminData: clinicAdminOptionsSchema.optional(),
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
export const userSchema = z.object({
|
|
89
|
-
uid: z.string(),
|
|
90
|
-
email: z.string().email().nullable(),
|
|
91
|
-
roles: z.array(userRoleSchema),
|
|
92
|
-
isAnonymous: z.boolean(),
|
|
93
|
-
createdAt: z.any(),
|
|
94
|
-
updatedAt: z.any(),
|
|
95
|
-
lastLoginAt: z.any(),
|
|
96
|
-
patientProfile: z.string().optional(),
|
|
97
|
-
practitionerProfile: z.string().optional(),
|
|
98
|
-
adminProfile: z.string().optional(),
|
|
99
|
-
});
|
|
100
|
-
|
|
101
|
-
export type ValidationSchema = z.infer<typeof userSchema>;
|
|
102
|
-
|
|
103
|
-
// Documentation Templates
|
|
104
|
-
export * from "./documentation-templates.schema";
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { UserRole } from "../types";
|
|
3
|
+
import { Timestamp, FieldValue } from "firebase/firestore";
|
|
4
|
+
|
|
5
|
+
export const emailSchema = z
|
|
6
|
+
.string()
|
|
7
|
+
.email("Invalid email format")
|
|
8
|
+
.min(5, "Email must be at least 5 characters")
|
|
9
|
+
.max(255, "Email must be less than 255 characters");
|
|
10
|
+
|
|
11
|
+
export const passwordSchema = z
|
|
12
|
+
.string()
|
|
13
|
+
.min(8, "Password must be at least 8 characters")
|
|
14
|
+
.max(100, "Password must be less than 100 characters")
|
|
15
|
+
.regex(
|
|
16
|
+
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d\w\W]{8,}$/,
|
|
17
|
+
"Password must contain at least one uppercase letter, one lowercase letter, and one number"
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
export const userRoleSchema = z.nativeEnum(UserRole);
|
|
21
|
+
|
|
22
|
+
export const userRolesSchema = z
|
|
23
|
+
.array(userRoleSchema)
|
|
24
|
+
.min(1, "User must have at least one role")
|
|
25
|
+
.max(3, "User cannot have more than 3 roles");
|
|
26
|
+
|
|
27
|
+
// export const timestampSchema = z.custom<Timestamp | FieldValue | Date>(
|
|
28
|
+
// (data) => {
|
|
29
|
+
// // If it's a serverTimestamp (FieldValue), it's valid
|
|
30
|
+
// if (data && typeof data === "object" && "isEqual" in data) {
|
|
31
|
+
// return true;
|
|
32
|
+
// }
|
|
33
|
+
|
|
34
|
+
// // If it's a Timestamp object, validate its structure
|
|
35
|
+
// if (
|
|
36
|
+
// data &&
|
|
37
|
+
// typeof data === "object" &&
|
|
38
|
+
// "toDate" in data &&
|
|
39
|
+
// "seconds" in data &&
|
|
40
|
+
// "nanoseconds" in data
|
|
41
|
+
// ) {
|
|
42
|
+
// return true;
|
|
43
|
+
// }
|
|
44
|
+
|
|
45
|
+
// // If it's a JavaScript Date object (what Firestore returns on client), it's valid
|
|
46
|
+
// if (data instanceof Date) {
|
|
47
|
+
// return true;
|
|
48
|
+
// }
|
|
49
|
+
|
|
50
|
+
// return false;
|
|
51
|
+
// },
|
|
52
|
+
// "Must be a Timestamp object, Date object, or serverTimestamp"
|
|
53
|
+
// );
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Validaciona šema za clinic admin opcije pri kreiranju
|
|
57
|
+
*/
|
|
58
|
+
export const clinicAdminOptionsSchema = z
|
|
59
|
+
.object({
|
|
60
|
+
isGroupOwner: z.boolean(),
|
|
61
|
+
groupToken: z.string().optional(),
|
|
62
|
+
groupId: z.string().optional(),
|
|
63
|
+
})
|
|
64
|
+
.refine(
|
|
65
|
+
(data) => {
|
|
66
|
+
// Ako nije owner, mora imati i token i groupId
|
|
67
|
+
if (!data.isGroupOwner && (!data.groupToken || !data.groupId)) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
// Ako je owner, ne sme imati ni token ni groupId
|
|
71
|
+
if (data.isGroupOwner && (data.groupToken || data.groupId)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return true;
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
message: "Invalid clinic admin options configuration",
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Validaciona šema za opcije pri kreiranju korisnika
|
|
83
|
+
*/
|
|
84
|
+
export const createUserOptionsSchema = z.object({
|
|
85
|
+
clinicAdminData: clinicAdminOptionsSchema.optional(),
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
export const userSchema = z.object({
|
|
89
|
+
uid: z.string(),
|
|
90
|
+
email: z.string().email().nullable(),
|
|
91
|
+
roles: z.array(userRoleSchema),
|
|
92
|
+
isAnonymous: z.boolean(),
|
|
93
|
+
createdAt: z.any(),
|
|
94
|
+
updatedAt: z.any(),
|
|
95
|
+
lastLoginAt: z.any(),
|
|
96
|
+
patientProfile: z.string().optional(),
|
|
97
|
+
practitionerProfile: z.string().optional(),
|
|
98
|
+
adminProfile: z.string().optional(),
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
export type ValidationSchema = z.infer<typeof userSchema>;
|
|
102
|
+
|
|
103
|
+
// Documentation Templates
|
|
104
|
+
export * from "./documentation-templates.schema";
|