@blackcode_sa/metaestetics-api 1.6.0 → 1.6.2
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/index.d.mts +17 -184
- package/dist/index.d.ts +17 -184
- package/dist/index.js +448 -415
- package/dist/index.mjs +431 -395
- package/package.json +1 -1
- package/src/services/practitioner/practitioner.service.ts +41 -6
- package/src/validations/clinic.schema.ts +5 -25
- package/src/validations/practitioner.schema.ts +3 -3
- package/src/validations/procedure.schema.ts +1 -1
- package/src/validations/shared.schema.ts +78 -0
package/dist/index.js
CHANGED
|
@@ -131,7 +131,6 @@ __export(index_exports, {
|
|
|
131
131
|
clinicContactInfoSchema: () => clinicContactInfoSchema,
|
|
132
132
|
clinicGroupSchema: () => clinicGroupSchema,
|
|
133
133
|
clinicGroupSetupSchema: () => clinicGroupSetupSchema,
|
|
134
|
-
clinicInfoSchema: () => clinicInfoSchema,
|
|
135
134
|
clinicLocationSchema: () => clinicLocationSchema,
|
|
136
135
|
clinicReviewInfoSchema: () => clinicReviewInfoSchema,
|
|
137
136
|
clinicReviewSchema: () => clinicReviewSchema,
|
|
@@ -159,7 +158,6 @@ __export(index_exports, {
|
|
|
159
158
|
createProcedureReviewSchema: () => createProcedureReviewSchema,
|
|
160
159
|
createReviewSchema: () => createReviewSchema,
|
|
161
160
|
createUserOptionsSchema: () => createUserOptionsSchema,
|
|
162
|
-
doctorInfoSchema: () => doctorInfoSchema,
|
|
163
161
|
documentElementSchema: () => documentElementSchema,
|
|
164
162
|
documentElementWithoutIdSchema: () => documentElementWithoutIdSchema,
|
|
165
163
|
documentTemplateSchema: () => documentTemplateSchema,
|
|
@@ -198,7 +196,6 @@ __export(index_exports, {
|
|
|
198
196
|
procedureInfoSchema: () => procedureInfoSchema,
|
|
199
197
|
procedureReviewInfoSchema: () => procedureReviewInfoSchema,
|
|
200
198
|
procedureReviewSchema: () => procedureReviewSchema,
|
|
201
|
-
procedureSummaryInfoSchema: () => procedureSummaryInfoSchema,
|
|
202
199
|
requesterInfoSchema: () => requesterInfoSchema,
|
|
203
200
|
reviewSchema: () => reviewSchema,
|
|
204
201
|
searchAppointmentsSchema: () => searchAppointmentsSchema,
|
|
@@ -464,7 +461,7 @@ var UserRole = /* @__PURE__ */ ((UserRole2) => {
|
|
|
464
461
|
var USERS_COLLECTION = "users";
|
|
465
462
|
|
|
466
463
|
// src/services/auth.service.ts
|
|
467
|
-
var
|
|
464
|
+
var import_zod19 = require("zod");
|
|
468
465
|
|
|
469
466
|
// src/validations/schemas.ts
|
|
470
467
|
var import_zod3 = require("zod");
|
|
@@ -989,7 +986,7 @@ var USER_ERRORS = {
|
|
|
989
986
|
};
|
|
990
987
|
|
|
991
988
|
// src/services/user.service.ts
|
|
992
|
-
var
|
|
989
|
+
var import_zod15 = require("zod");
|
|
993
990
|
|
|
994
991
|
// src/services/patient/patient.service.ts
|
|
995
992
|
var import_firestore11 = require("firebase/firestore");
|
|
@@ -2643,7 +2640,7 @@ var PatientService = class extends BaseService {
|
|
|
2643
2640
|
};
|
|
2644
2641
|
|
|
2645
2642
|
// src/services/clinic/utils/admin.utils.ts
|
|
2646
|
-
var
|
|
2643
|
+
var import_firestore13 = require("firebase/firestore");
|
|
2647
2644
|
|
|
2648
2645
|
// src/types/clinic/preferences.types.ts
|
|
2649
2646
|
var PracticeType = /* @__PURE__ */ ((PracticeType2) => {
|
|
@@ -2770,52 +2767,8 @@ var SubscriptionModel = /* @__PURE__ */ ((SubscriptionModel2) => {
|
|
|
2770
2767
|
|
|
2771
2768
|
// src/validations/clinic.schema.ts
|
|
2772
2769
|
var import_zod12 = require("zod");
|
|
2773
|
-
var import_firestore13 = require("firebase/firestore");
|
|
2774
|
-
|
|
2775
|
-
// src/validations/practitioner.schema.ts
|
|
2776
|
-
var import_zod11 = require("zod");
|
|
2777
2770
|
var import_firestore12 = require("firebase/firestore");
|
|
2778
2771
|
|
|
2779
|
-
// src/backoffice/types/static/certification.types.ts
|
|
2780
|
-
var CertificationLevel = /* @__PURE__ */ ((CertificationLevel2) => {
|
|
2781
|
-
CertificationLevel2["AESTHETICIAN"] = "aesthetician";
|
|
2782
|
-
CertificationLevel2["NURSE_ASSISTANT"] = "nurse_assistant";
|
|
2783
|
-
CertificationLevel2["NURSE"] = "nurse";
|
|
2784
|
-
CertificationLevel2["NURSE_PRACTITIONER"] = "nurse_practitioner";
|
|
2785
|
-
CertificationLevel2["PHYSICIAN_ASSISTANT"] = "physician_assistant";
|
|
2786
|
-
CertificationLevel2["DOCTOR"] = "doctor";
|
|
2787
|
-
CertificationLevel2["SPECIALIST"] = "specialist";
|
|
2788
|
-
CertificationLevel2["PLASTIC_SURGEON"] = "plastic_surgeon";
|
|
2789
|
-
return CertificationLevel2;
|
|
2790
|
-
})(CertificationLevel || {});
|
|
2791
|
-
var CertificationSpecialty = /* @__PURE__ */ ((CertificationSpecialty3) => {
|
|
2792
|
-
CertificationSpecialty3["LASER"] = "laser";
|
|
2793
|
-
CertificationSpecialty3["INJECTABLES"] = "injectables";
|
|
2794
|
-
CertificationSpecialty3["CHEMICAL_PEELS"] = "chemical_peels";
|
|
2795
|
-
CertificationSpecialty3["MICRODERMABRASION"] = "microdermabrasion";
|
|
2796
|
-
CertificationSpecialty3["BODY_CONTOURING"] = "body_contouring";
|
|
2797
|
-
CertificationSpecialty3["SKIN_CARE"] = "skin_care";
|
|
2798
|
-
CertificationSpecialty3["WOUND_CARE"] = "wound_care";
|
|
2799
|
-
CertificationSpecialty3["ANESTHESIA"] = "anesthesia";
|
|
2800
|
-
return CertificationSpecialty3;
|
|
2801
|
-
})(CertificationSpecialty || {});
|
|
2802
|
-
|
|
2803
|
-
// src/types/practitioner/index.ts
|
|
2804
|
-
var PRACTITIONERS_COLLECTION = "practitioners";
|
|
2805
|
-
var REGISTER_TOKENS_COLLECTION = "register_tokens";
|
|
2806
|
-
var PractitionerStatus = /* @__PURE__ */ ((PractitionerStatus2) => {
|
|
2807
|
-
PractitionerStatus2["DRAFT"] = "draft";
|
|
2808
|
-
PractitionerStatus2["ACTIVE"] = "active";
|
|
2809
|
-
return PractitionerStatus2;
|
|
2810
|
-
})(PractitionerStatus || {});
|
|
2811
|
-
var PractitionerTokenStatus = /* @__PURE__ */ ((PractitionerTokenStatus2) => {
|
|
2812
|
-
PractitionerTokenStatus2["ACTIVE"] = "active";
|
|
2813
|
-
PractitionerTokenStatus2["USED"] = "used";
|
|
2814
|
-
PractitionerTokenStatus2["EXPIRED"] = "expired";
|
|
2815
|
-
PractitionerTokenStatus2["REVOKED"] = "revoked";
|
|
2816
|
-
return PractitionerTokenStatus2;
|
|
2817
|
-
})(PractitionerTokenStatus || {});
|
|
2818
|
-
|
|
2819
2772
|
// src/validations/reviews.schema.ts
|
|
2820
2773
|
var import_zod10 = require("zod");
|
|
2821
2774
|
var baseReviewSchema = import_zod10.z.object({
|
|
@@ -2949,6 +2902,9 @@ var createReviewSchema = import_zod10.z.object({
|
|
|
2949
2902
|
}
|
|
2950
2903
|
);
|
|
2951
2904
|
|
|
2905
|
+
// src/validations/shared.schema.ts
|
|
2906
|
+
var import_zod11 = require("zod");
|
|
2907
|
+
|
|
2952
2908
|
// src/backoffice/types/static/procedure-family.types.ts
|
|
2953
2909
|
var ProcedureFamily = /* @__PURE__ */ ((ProcedureFamily2) => {
|
|
2954
2910
|
ProcedureFamily2["AESTHETICS"] = "aesthetics";
|
|
@@ -2975,59 +2931,21 @@ var Currency = /* @__PURE__ */ ((Currency2) => {
|
|
|
2975
2931
|
return Currency2;
|
|
2976
2932
|
})(Currency || {});
|
|
2977
2933
|
|
|
2978
|
-
// src/validations/
|
|
2979
|
-
var
|
|
2980
|
-
firstName: import_zod11.z.string().min(2).max(50),
|
|
2981
|
-
lastName: import_zod11.z.string().min(2).max(50),
|
|
2982
|
-
title: import_zod11.z.string().min(2).max(100),
|
|
2934
|
+
// src/validations/shared.schema.ts
|
|
2935
|
+
var sharedClinicContactInfoSchema = import_zod11.z.object({
|
|
2983
2936
|
email: import_zod11.z.string().email(),
|
|
2984
|
-
phoneNumber: import_zod11.z.string()
|
|
2985
|
-
|
|
2986
|
-
|
|
2987
|
-
profileImageUrl: import_zod11.z.string().url().optional(),
|
|
2988
|
-
bio: import_zod11.z.string().max(1e3).optional(),
|
|
2989
|
-
languages: import_zod11.z.array(import_zod11.z.string()).min(1)
|
|
2990
|
-
});
|
|
2991
|
-
var practitionerCertificationSchema = import_zod11.z.object({
|
|
2992
|
-
level: import_zod11.z.nativeEnum(CertificationLevel),
|
|
2993
|
-
specialties: import_zod11.z.array(import_zod11.z.nativeEnum(CertificationSpecialty)),
|
|
2994
|
-
licenseNumber: import_zod11.z.string().min(3).max(50),
|
|
2995
|
-
issuingAuthority: import_zod11.z.string().min(2).max(100),
|
|
2996
|
-
issueDate: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()),
|
|
2997
|
-
expiryDate: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()).optional(),
|
|
2998
|
-
verificationStatus: import_zod11.z.enum(["pending", "verified", "rejected"])
|
|
2999
|
-
});
|
|
3000
|
-
var timeSlotSchema = import_zod11.z.object({
|
|
3001
|
-
start: import_zod11.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format"),
|
|
3002
|
-
end: import_zod11.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format")
|
|
3003
|
-
}).nullable();
|
|
3004
|
-
var practitionerWorkingHoursSchema = import_zod11.z.object({
|
|
3005
|
-
practitionerId: import_zod11.z.string().min(1),
|
|
3006
|
-
clinicId: import_zod11.z.string().min(1),
|
|
3007
|
-
monday: timeSlotSchema,
|
|
3008
|
-
tuesday: timeSlotSchema,
|
|
3009
|
-
wednesday: timeSlotSchema,
|
|
3010
|
-
thursday: timeSlotSchema,
|
|
3011
|
-
friday: timeSlotSchema,
|
|
3012
|
-
saturday: timeSlotSchema,
|
|
3013
|
-
sunday: timeSlotSchema,
|
|
3014
|
-
createdAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()),
|
|
3015
|
-
updatedAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date())
|
|
2937
|
+
phoneNumber: import_zod11.z.string(),
|
|
2938
|
+
alternativePhoneNumber: import_zod11.z.string().nullable().optional(),
|
|
2939
|
+
website: import_zod11.z.string().nullable().optional()
|
|
3016
2940
|
});
|
|
3017
|
-
var
|
|
3018
|
-
|
|
3019
|
-
|
|
3020
|
-
|
|
3021
|
-
|
|
3022
|
-
|
|
3023
|
-
|
|
3024
|
-
|
|
3025
|
-
saturday: timeSlotSchema,
|
|
3026
|
-
sunday: timeSlotSchema
|
|
3027
|
-
}),
|
|
3028
|
-
isActive: import_zod11.z.boolean(),
|
|
3029
|
-
createdAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()),
|
|
3030
|
-
updatedAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date())
|
|
2941
|
+
var sharedClinicLocationSchema = import_zod11.z.object({
|
|
2942
|
+
address: import_zod11.z.string(),
|
|
2943
|
+
city: import_zod11.z.string(),
|
|
2944
|
+
country: import_zod11.z.string(),
|
|
2945
|
+
postalCode: import_zod11.z.string(),
|
|
2946
|
+
latitude: import_zod11.z.number().min(-90).max(90),
|
|
2947
|
+
longitude: import_zod11.z.number().min(-180).max(180),
|
|
2948
|
+
geohash: import_zod11.z.string().nullable().optional()
|
|
3031
2949
|
});
|
|
3032
2950
|
var procedureSummaryInfoSchema = import_zod11.z.object({
|
|
3033
2951
|
id: import_zod11.z.string().min(1),
|
|
@@ -3047,79 +2965,22 @@ var procedureSummaryInfoSchema = import_zod11.z.object({
|
|
|
3047
2965
|
practitionerId: import_zod11.z.string().min(1),
|
|
3048
2966
|
practitionerName: import_zod11.z.string().min(1)
|
|
3049
2967
|
});
|
|
3050
|
-
var
|
|
3051
|
-
id: import_zod11.z.string()
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3055
|
-
|
|
3056
|
-
|
|
3057
|
-
clinicsInfo: import_zod11.z.array(clinicInfoSchema),
|
|
3058
|
-
procedures: import_zod11.z.array(import_zod11.z.string()),
|
|
3059
|
-
proceduresInfo: import_zod11.z.array(procedureSummaryInfoSchema),
|
|
3060
|
-
reviewInfo: practitionerReviewInfoSchema,
|
|
3061
|
-
isActive: import_zod11.z.boolean(),
|
|
3062
|
-
isVerified: import_zod11.z.boolean(),
|
|
3063
|
-
status: import_zod11.z.nativeEnum(PractitionerStatus),
|
|
3064
|
-
createdAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()),
|
|
3065
|
-
updatedAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date())
|
|
3066
|
-
});
|
|
3067
|
-
var createPractitionerSchema = import_zod11.z.object({
|
|
3068
|
-
userRef: import_zod11.z.string().min(1),
|
|
3069
|
-
basicInfo: practitionerBasicInfoSchema,
|
|
3070
|
-
certification: practitionerCertificationSchema,
|
|
3071
|
-
clinics: import_zod11.z.array(import_zod11.z.string()).optional(),
|
|
3072
|
-
clinicWorkingHours: import_zod11.z.array(practitionerClinicWorkingHoursSchema).optional(),
|
|
3073
|
-
clinicsInfo: import_zod11.z.array(clinicInfoSchema).optional(),
|
|
3074
|
-
proceduresInfo: import_zod11.z.array(procedureSummaryInfoSchema).optional(),
|
|
3075
|
-
isActive: import_zod11.z.boolean(),
|
|
3076
|
-
isVerified: import_zod11.z.boolean(),
|
|
3077
|
-
status: import_zod11.z.nativeEnum(PractitionerStatus).optional()
|
|
3078
|
-
});
|
|
3079
|
-
var createDraftPractitionerSchema = import_zod11.z.object({
|
|
3080
|
-
basicInfo: practitionerBasicInfoSchema,
|
|
3081
|
-
certification: practitionerCertificationSchema,
|
|
3082
|
-
clinics: import_zod11.z.array(import_zod11.z.string()).optional(),
|
|
3083
|
-
clinicWorkingHours: import_zod11.z.array(practitionerClinicWorkingHoursSchema).optional(),
|
|
3084
|
-
clinicsInfo: import_zod11.z.array(clinicInfoSchema).optional(),
|
|
3085
|
-
proceduresInfo: import_zod11.z.array(procedureSummaryInfoSchema).optional(),
|
|
3086
|
-
isActive: import_zod11.z.boolean().optional().default(false),
|
|
3087
|
-
isVerified: import_zod11.z.boolean().optional().default(false)
|
|
3088
|
-
});
|
|
3089
|
-
var practitionerTokenSchema = import_zod11.z.object({
|
|
3090
|
-
id: import_zod11.z.string().min(1),
|
|
3091
|
-
token: import_zod11.z.string().min(6),
|
|
3092
|
-
practitionerId: import_zod11.z.string().min(1),
|
|
3093
|
-
email: import_zod11.z.string().email(),
|
|
3094
|
-
clinicId: import_zod11.z.string().min(1),
|
|
3095
|
-
status: import_zod11.z.nativeEnum(PractitionerTokenStatus),
|
|
3096
|
-
createdBy: import_zod11.z.string().min(1),
|
|
3097
|
-
createdAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()),
|
|
3098
|
-
expiresAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()),
|
|
3099
|
-
usedBy: import_zod11.z.string().optional(),
|
|
3100
|
-
usedAt: import_zod11.z.instanceof(import_firestore12.Timestamp).or(import_zod11.z.date()).optional()
|
|
3101
|
-
});
|
|
3102
|
-
var createPractitionerTokenSchema = import_zod11.z.object({
|
|
3103
|
-
practitionerId: import_zod11.z.string().min(1),
|
|
3104
|
-
email: import_zod11.z.string().email(),
|
|
3105
|
-
clinicId: import_zod11.z.string().min(1),
|
|
3106
|
-
expiresAt: import_zod11.z.date().optional()
|
|
2968
|
+
var clinicInfoSchema = import_zod11.z.object({
|
|
2969
|
+
id: import_zod11.z.string(),
|
|
2970
|
+
featuredPhoto: import_zod11.z.string(),
|
|
2971
|
+
name: import_zod11.z.string(),
|
|
2972
|
+
description: import_zod11.z.string().nullable().optional(),
|
|
2973
|
+
location: sharedClinicLocationSchema,
|
|
2974
|
+
contactInfo: sharedClinicContactInfoSchema
|
|
3107
2975
|
});
|
|
3108
|
-
var
|
|
3109
|
-
|
|
3110
|
-
|
|
3111
|
-
|
|
3112
|
-
|
|
3113
|
-
|
|
3114
|
-
|
|
3115
|
-
|
|
3116
|
-
phoneNumber: import_zod11.z.string().optional(),
|
|
3117
|
-
profileImageUrl: import_zod11.z.string().optional(),
|
|
3118
|
-
gender: import_zod11.z.enum(["male", "female", "other"]).optional(),
|
|
3119
|
-
bio: import_zod11.z.string().optional()
|
|
3120
|
-
}).optional(),
|
|
3121
|
-
certification: import_zod11.z.any().optional()
|
|
3122
|
-
}).optional()
|
|
2976
|
+
var doctorInfoSchema = import_zod11.z.object({
|
|
2977
|
+
id: import_zod11.z.string(),
|
|
2978
|
+
name: import_zod11.z.string(),
|
|
2979
|
+
description: import_zod11.z.string().nullable().optional(),
|
|
2980
|
+
photo: import_zod11.z.string(),
|
|
2981
|
+
rating: import_zod11.z.number().min(0).max(5),
|
|
2982
|
+
services: import_zod11.z.array(import_zod11.z.string())
|
|
2983
|
+
// List of procedure IDs practitioner offers
|
|
3123
2984
|
});
|
|
3124
2985
|
|
|
3125
2986
|
// src/validations/clinic.schema.ts
|
|
@@ -3172,23 +3033,6 @@ var adminInfoSchema = import_zod12.z.object({
|
|
|
3172
3033
|
name: import_zod12.z.string(),
|
|
3173
3034
|
email: import_zod12.z.string().email()
|
|
3174
3035
|
});
|
|
3175
|
-
var clinicInfoSchema = import_zod12.z.object({
|
|
3176
|
-
id: import_zod12.z.string(),
|
|
3177
|
-
featuredPhoto: import_zod12.z.string(),
|
|
3178
|
-
name: import_zod12.z.string(),
|
|
3179
|
-
description: import_zod12.z.string().nullable().optional(),
|
|
3180
|
-
location: clinicLocationSchema,
|
|
3181
|
-
contactInfo: clinicContactInfoSchema
|
|
3182
|
-
});
|
|
3183
|
-
var doctorInfoSchema = import_zod12.z.object({
|
|
3184
|
-
id: import_zod12.z.string(),
|
|
3185
|
-
name: import_zod12.z.string(),
|
|
3186
|
-
description: import_zod12.z.string().nullable().optional(),
|
|
3187
|
-
photo: import_zod12.z.string(),
|
|
3188
|
-
rating: import_zod12.z.number().min(0).max(5),
|
|
3189
|
-
services: import_zod12.z.array(import_zod12.z.string())
|
|
3190
|
-
// List of procedure IDs practitioner offers
|
|
3191
|
-
});
|
|
3192
3036
|
var clinicAdminSchema = import_zod12.z.object({
|
|
3193
3037
|
id: import_zod12.z.string(),
|
|
3194
3038
|
userRef: import_zod12.z.string(),
|
|
@@ -3198,8 +3042,8 @@ var clinicAdminSchema = import_zod12.z.object({
|
|
|
3198
3042
|
clinicsManagedInfo: import_zod12.z.array(clinicInfoSchema),
|
|
3199
3043
|
contactInfo: contactPersonSchema,
|
|
3200
3044
|
roleTitle: import_zod12.z.string(),
|
|
3201
|
-
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3202
|
-
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3045
|
+
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3046
|
+
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3203
3047
|
isActive: import_zod12.z.boolean()
|
|
3204
3048
|
});
|
|
3205
3049
|
var adminTokenSchema = import_zod12.z.object({
|
|
@@ -3208,9 +3052,9 @@ var adminTokenSchema = import_zod12.z.object({
|
|
|
3208
3052
|
email: import_zod12.z.string().email().optional().nullable(),
|
|
3209
3053
|
status: import_zod12.z.nativeEnum(AdminTokenStatus),
|
|
3210
3054
|
usedByUserRef: import_zod12.z.string().optional(),
|
|
3211
|
-
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3055
|
+
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3212
3056
|
// Timestamp
|
|
3213
|
-
expiresAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3057
|
+
expiresAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp))
|
|
3214
3058
|
// Timestamp
|
|
3215
3059
|
});
|
|
3216
3060
|
var createAdminTokenSchema = import_zod12.z.object({
|
|
@@ -3230,9 +3074,9 @@ var clinicGroupSchema = import_zod12.z.object({
|
|
|
3230
3074
|
adminsInfo: import_zod12.z.array(adminInfoSchema),
|
|
3231
3075
|
adminTokens: import_zod12.z.array(adminTokenSchema),
|
|
3232
3076
|
ownerId: import_zod12.z.string().nullable(),
|
|
3233
|
-
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3077
|
+
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3234
3078
|
// Timestamp
|
|
3235
|
-
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3079
|
+
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3236
3080
|
// Timestamp
|
|
3237
3081
|
isActive: import_zod12.z.boolean(),
|
|
3238
3082
|
logo: import_zod12.z.string().optional().nullable(),
|
|
@@ -3272,9 +3116,9 @@ var clinicSchema = import_zod12.z.object({
|
|
|
3272
3116
|
// servicesInfo: z.array(serviceInfoSchema), // Deprecated, use proceduresInfo
|
|
3273
3117
|
reviewInfo: clinicReviewInfoSchema,
|
|
3274
3118
|
admins: import_zod12.z.array(import_zod12.z.string()),
|
|
3275
|
-
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3119
|
+
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3276
3120
|
// Timestamp
|
|
3277
|
-
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3121
|
+
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3278
3122
|
// Timestamp
|
|
3279
3123
|
isActive: import_zod12.z.boolean(),
|
|
3280
3124
|
isVerified: import_zod12.z.boolean(),
|
|
@@ -3464,7 +3308,7 @@ async function createClinicAdmin(db, data, clinicGroupService) {
|
|
|
3464
3308
|
}
|
|
3465
3309
|
console.log("[CLINIC_ADMIN] Preparing admin data object");
|
|
3466
3310
|
const adminData = {
|
|
3467
|
-
id: (0,
|
|
3311
|
+
id: (0, import_firestore13.doc)((0, import_firestore13.collection)(db, CLINIC_ADMINS_COLLECTION)).id,
|
|
3468
3312
|
// Generate a new ID for the admin document
|
|
3469
3313
|
userRef: validatedData.userRef,
|
|
3470
3314
|
clinicGroupId: clinicGroupId || "",
|
|
@@ -3477,15 +3321,15 @@ async function createClinicAdmin(db, data, clinicGroupService) {
|
|
|
3477
3321
|
contactInfo: validatedData.contactInfo,
|
|
3478
3322
|
roleTitle: validatedData.roleTitle,
|
|
3479
3323
|
isActive: validatedData.isActive,
|
|
3480
|
-
createdAt: (0,
|
|
3481
|
-
updatedAt: (0,
|
|
3324
|
+
createdAt: (0, import_firestore13.serverTimestamp)(),
|
|
3325
|
+
updatedAt: (0, import_firestore13.serverTimestamp)()
|
|
3482
3326
|
};
|
|
3483
3327
|
console.log("[CLINIC_ADMIN] Validating complete admin object");
|
|
3484
3328
|
try {
|
|
3485
3329
|
clinicAdminSchema.parse({
|
|
3486
3330
|
...adminData,
|
|
3487
|
-
createdAt:
|
|
3488
|
-
updatedAt:
|
|
3331
|
+
createdAt: import_firestore13.Timestamp.now(),
|
|
3332
|
+
updatedAt: import_firestore13.Timestamp.now()
|
|
3489
3333
|
});
|
|
3490
3334
|
console.log("[CLINIC_ADMIN] Admin object validation passed");
|
|
3491
3335
|
} catch (schemaError) {
|
|
@@ -3499,7 +3343,7 @@ async function createClinicAdmin(db, data, clinicGroupService) {
|
|
|
3499
3343
|
adminId: adminData.id
|
|
3500
3344
|
});
|
|
3501
3345
|
try {
|
|
3502
|
-
await (0,
|
|
3346
|
+
await (0, import_firestore13.setDoc)((0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminData.id), adminData);
|
|
3503
3347
|
console.log("[CLINIC_ADMIN] Admin saved successfully");
|
|
3504
3348
|
} catch (firestoreError) {
|
|
3505
3349
|
console.error(
|
|
@@ -3548,30 +3392,30 @@ async function checkClinicGroupExists(db, groupId, clinicGroupService) {
|
|
|
3548
3392
|
return !!group;
|
|
3549
3393
|
}
|
|
3550
3394
|
async function getClinicAdmin(db, adminId) {
|
|
3551
|
-
const docRef = (0,
|
|
3552
|
-
const docSnap = await (0,
|
|
3395
|
+
const docRef = (0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminId);
|
|
3396
|
+
const docSnap = await (0, import_firestore13.getDoc)(docRef);
|
|
3553
3397
|
if (docSnap.exists()) {
|
|
3554
3398
|
return docSnap.data();
|
|
3555
3399
|
}
|
|
3556
3400
|
return null;
|
|
3557
3401
|
}
|
|
3558
3402
|
async function getClinicAdminByUserRef(db, userRef) {
|
|
3559
|
-
const q = (0,
|
|
3560
|
-
(0,
|
|
3561
|
-
(0,
|
|
3403
|
+
const q = (0, import_firestore13.query)(
|
|
3404
|
+
(0, import_firestore13.collection)(db, CLINIC_ADMINS_COLLECTION),
|
|
3405
|
+
(0, import_firestore13.where)("userRef", "==", userRef)
|
|
3562
3406
|
);
|
|
3563
|
-
const querySnapshot = await (0,
|
|
3407
|
+
const querySnapshot = await (0, import_firestore13.getDocs)(q);
|
|
3564
3408
|
if (querySnapshot.empty) {
|
|
3565
3409
|
return null;
|
|
3566
3410
|
}
|
|
3567
3411
|
return querySnapshot.docs[0].data();
|
|
3568
3412
|
}
|
|
3569
3413
|
async function getClinicAdminsByGroup(db, clinicGroupId) {
|
|
3570
|
-
const q = (0,
|
|
3571
|
-
(0,
|
|
3572
|
-
(0,
|
|
3414
|
+
const q = (0, import_firestore13.query)(
|
|
3415
|
+
(0, import_firestore13.collection)(db, CLINIC_ADMINS_COLLECTION),
|
|
3416
|
+
(0, import_firestore13.where)("clinicGroupId", "==", clinicGroupId)
|
|
3573
3417
|
);
|
|
3574
|
-
const querySnapshot = await (0,
|
|
3418
|
+
const querySnapshot = await (0, import_firestore13.getDocs)(q);
|
|
3575
3419
|
return querySnapshot.docs.map((doc32) => doc32.data());
|
|
3576
3420
|
}
|
|
3577
3421
|
async function updateClinicAdmin(db, adminId, data) {
|
|
@@ -3581,9 +3425,9 @@ async function updateClinicAdmin(db, adminId, data) {
|
|
|
3581
3425
|
}
|
|
3582
3426
|
const updatedData = {
|
|
3583
3427
|
...data,
|
|
3584
|
-
updatedAt: (0,
|
|
3428
|
+
updatedAt: (0, import_firestore13.serverTimestamp)()
|
|
3585
3429
|
};
|
|
3586
|
-
await (0,
|
|
3430
|
+
await (0, import_firestore13.updateDoc)((0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminId), updatedData);
|
|
3587
3431
|
const updatedAdmin = await getClinicAdmin(db, adminId);
|
|
3588
3432
|
if (!updatedAdmin) {
|
|
3589
3433
|
throw new Error("Failed to retrieve updated admin");
|
|
@@ -3595,7 +3439,7 @@ async function deleteClinicAdmin(db, adminId) {
|
|
|
3595
3439
|
if (!admin) {
|
|
3596
3440
|
throw new Error("Clinic admin not found");
|
|
3597
3441
|
}
|
|
3598
|
-
await (0,
|
|
3442
|
+
await (0, import_firestore13.deleteDoc)((0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminId));
|
|
3599
3443
|
}
|
|
3600
3444
|
async function addClinicToManaged(db, adminId, clinicId, requesterId, clinicService) {
|
|
3601
3445
|
const admin = await getClinicAdmin(db, adminId);
|
|
@@ -3837,7 +3681,182 @@ var ClinicAdminService = class extends BaseService {
|
|
|
3837
3681
|
|
|
3838
3682
|
// src/services/practitioner/practitioner.service.ts
|
|
3839
3683
|
var import_firestore15 = require("firebase/firestore");
|
|
3684
|
+
|
|
3685
|
+
// src/types/practitioner/index.ts
|
|
3686
|
+
var PRACTITIONERS_COLLECTION = "practitioners";
|
|
3687
|
+
var REGISTER_TOKENS_COLLECTION = "register_tokens";
|
|
3688
|
+
var PractitionerStatus = /* @__PURE__ */ ((PractitionerStatus2) => {
|
|
3689
|
+
PractitionerStatus2["DRAFT"] = "draft";
|
|
3690
|
+
PractitionerStatus2["ACTIVE"] = "active";
|
|
3691
|
+
return PractitionerStatus2;
|
|
3692
|
+
})(PractitionerStatus || {});
|
|
3693
|
+
var PractitionerTokenStatus = /* @__PURE__ */ ((PractitionerTokenStatus2) => {
|
|
3694
|
+
PractitionerTokenStatus2["ACTIVE"] = "active";
|
|
3695
|
+
PractitionerTokenStatus2["USED"] = "used";
|
|
3696
|
+
PractitionerTokenStatus2["EXPIRED"] = "expired";
|
|
3697
|
+
PractitionerTokenStatus2["REVOKED"] = "revoked";
|
|
3698
|
+
return PractitionerTokenStatus2;
|
|
3699
|
+
})(PractitionerTokenStatus || {});
|
|
3700
|
+
|
|
3701
|
+
// src/validations/practitioner.schema.ts
|
|
3840
3702
|
var import_zod13 = require("zod");
|
|
3703
|
+
var import_firestore14 = require("firebase/firestore");
|
|
3704
|
+
|
|
3705
|
+
// src/backoffice/types/static/certification.types.ts
|
|
3706
|
+
var CertificationLevel = /* @__PURE__ */ ((CertificationLevel2) => {
|
|
3707
|
+
CertificationLevel2["AESTHETICIAN"] = "aesthetician";
|
|
3708
|
+
CertificationLevel2["NURSE_ASSISTANT"] = "nurse_assistant";
|
|
3709
|
+
CertificationLevel2["NURSE"] = "nurse";
|
|
3710
|
+
CertificationLevel2["NURSE_PRACTITIONER"] = "nurse_practitioner";
|
|
3711
|
+
CertificationLevel2["PHYSICIAN_ASSISTANT"] = "physician_assistant";
|
|
3712
|
+
CertificationLevel2["DOCTOR"] = "doctor";
|
|
3713
|
+
CertificationLevel2["SPECIALIST"] = "specialist";
|
|
3714
|
+
CertificationLevel2["PLASTIC_SURGEON"] = "plastic_surgeon";
|
|
3715
|
+
return CertificationLevel2;
|
|
3716
|
+
})(CertificationLevel || {});
|
|
3717
|
+
var CertificationSpecialty = /* @__PURE__ */ ((CertificationSpecialty3) => {
|
|
3718
|
+
CertificationSpecialty3["LASER"] = "laser";
|
|
3719
|
+
CertificationSpecialty3["INJECTABLES"] = "injectables";
|
|
3720
|
+
CertificationSpecialty3["CHEMICAL_PEELS"] = "chemical_peels";
|
|
3721
|
+
CertificationSpecialty3["MICRODERMABRASION"] = "microdermabrasion";
|
|
3722
|
+
CertificationSpecialty3["BODY_CONTOURING"] = "body_contouring";
|
|
3723
|
+
CertificationSpecialty3["SKIN_CARE"] = "skin_care";
|
|
3724
|
+
CertificationSpecialty3["WOUND_CARE"] = "wound_care";
|
|
3725
|
+
CertificationSpecialty3["ANESTHESIA"] = "anesthesia";
|
|
3726
|
+
return CertificationSpecialty3;
|
|
3727
|
+
})(CertificationSpecialty || {});
|
|
3728
|
+
|
|
3729
|
+
// src/validations/practitioner.schema.ts
|
|
3730
|
+
var practitionerBasicInfoSchema = import_zod13.z.object({
|
|
3731
|
+
firstName: import_zod13.z.string().min(2).max(50),
|
|
3732
|
+
lastName: import_zod13.z.string().min(2).max(50),
|
|
3733
|
+
title: import_zod13.z.string().min(2).max(100),
|
|
3734
|
+
email: import_zod13.z.string().email(),
|
|
3735
|
+
phoneNumber: import_zod13.z.string().regex(/^\+?[1-9]\d{1,14}$/, "Invalid phone number"),
|
|
3736
|
+
dateOfBirth: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3737
|
+
gender: import_zod13.z.enum(["male", "female", "other"]),
|
|
3738
|
+
profileImageUrl: import_zod13.z.string().url().optional(),
|
|
3739
|
+
bio: import_zod13.z.string().max(1e3).optional(),
|
|
3740
|
+
languages: import_zod13.z.array(import_zod13.z.string()).min(1)
|
|
3741
|
+
});
|
|
3742
|
+
var practitionerCertificationSchema = import_zod13.z.object({
|
|
3743
|
+
level: import_zod13.z.nativeEnum(CertificationLevel),
|
|
3744
|
+
specialties: import_zod13.z.array(import_zod13.z.nativeEnum(CertificationSpecialty)),
|
|
3745
|
+
licenseNumber: import_zod13.z.string().min(3).max(50),
|
|
3746
|
+
issuingAuthority: import_zod13.z.string().min(2).max(100),
|
|
3747
|
+
issueDate: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3748
|
+
expiryDate: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()).optional(),
|
|
3749
|
+
verificationStatus: import_zod13.z.enum(["pending", "verified", "rejected"])
|
|
3750
|
+
});
|
|
3751
|
+
var timeSlotSchema = import_zod13.z.object({
|
|
3752
|
+
start: import_zod13.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format"),
|
|
3753
|
+
end: import_zod13.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format")
|
|
3754
|
+
}).nullable();
|
|
3755
|
+
var practitionerWorkingHoursSchema = import_zod13.z.object({
|
|
3756
|
+
practitionerId: import_zod13.z.string().min(1),
|
|
3757
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3758
|
+
monday: timeSlotSchema,
|
|
3759
|
+
tuesday: timeSlotSchema,
|
|
3760
|
+
wednesday: timeSlotSchema,
|
|
3761
|
+
thursday: timeSlotSchema,
|
|
3762
|
+
friday: timeSlotSchema,
|
|
3763
|
+
saturday: timeSlotSchema,
|
|
3764
|
+
sunday: timeSlotSchema,
|
|
3765
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3766
|
+
updatedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date())
|
|
3767
|
+
});
|
|
3768
|
+
var practitionerClinicWorkingHoursSchema = import_zod13.z.object({
|
|
3769
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3770
|
+
workingHours: import_zod13.z.object({
|
|
3771
|
+
monday: timeSlotSchema,
|
|
3772
|
+
tuesday: timeSlotSchema,
|
|
3773
|
+
wednesday: timeSlotSchema,
|
|
3774
|
+
thursday: timeSlotSchema,
|
|
3775
|
+
friday: timeSlotSchema,
|
|
3776
|
+
saturday: timeSlotSchema,
|
|
3777
|
+
sunday: timeSlotSchema
|
|
3778
|
+
}),
|
|
3779
|
+
isActive: import_zod13.z.boolean(),
|
|
3780
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3781
|
+
updatedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date())
|
|
3782
|
+
});
|
|
3783
|
+
var practitionerSchema = import_zod13.z.object({
|
|
3784
|
+
id: import_zod13.z.string().min(1),
|
|
3785
|
+
userRef: import_zod13.z.string().min(1),
|
|
3786
|
+
basicInfo: practitionerBasicInfoSchema,
|
|
3787
|
+
certification: practitionerCertificationSchema,
|
|
3788
|
+
clinics: import_zod13.z.array(import_zod13.z.string()),
|
|
3789
|
+
clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema),
|
|
3790
|
+
clinicsInfo: import_zod13.z.array(clinicInfoSchema),
|
|
3791
|
+
procedures: import_zod13.z.array(import_zod13.z.string()),
|
|
3792
|
+
proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema),
|
|
3793
|
+
reviewInfo: practitionerReviewInfoSchema,
|
|
3794
|
+
isActive: import_zod13.z.boolean(),
|
|
3795
|
+
isVerified: import_zod13.z.boolean(),
|
|
3796
|
+
status: import_zod13.z.nativeEnum(PractitionerStatus),
|
|
3797
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3798
|
+
updatedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date())
|
|
3799
|
+
});
|
|
3800
|
+
var createPractitionerSchema = import_zod13.z.object({
|
|
3801
|
+
userRef: import_zod13.z.string().min(1),
|
|
3802
|
+
basicInfo: practitionerBasicInfoSchema,
|
|
3803
|
+
certification: practitionerCertificationSchema,
|
|
3804
|
+
clinics: import_zod13.z.array(import_zod13.z.string()).optional(),
|
|
3805
|
+
clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema).optional(),
|
|
3806
|
+
clinicsInfo: import_zod13.z.array(clinicInfoSchema).optional(),
|
|
3807
|
+
proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
|
|
3808
|
+
isActive: import_zod13.z.boolean(),
|
|
3809
|
+
isVerified: import_zod13.z.boolean(),
|
|
3810
|
+
status: import_zod13.z.nativeEnum(PractitionerStatus).optional()
|
|
3811
|
+
});
|
|
3812
|
+
var createDraftPractitionerSchema = import_zod13.z.object({
|
|
3813
|
+
basicInfo: practitionerBasicInfoSchema,
|
|
3814
|
+
certification: practitionerCertificationSchema,
|
|
3815
|
+
clinics: import_zod13.z.array(import_zod13.z.string()).optional(),
|
|
3816
|
+
clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema).optional(),
|
|
3817
|
+
clinicsInfo: import_zod13.z.array(clinicInfoSchema).optional(),
|
|
3818
|
+
proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
|
|
3819
|
+
isActive: import_zod13.z.boolean().optional().default(false),
|
|
3820
|
+
isVerified: import_zod13.z.boolean().optional().default(false)
|
|
3821
|
+
});
|
|
3822
|
+
var practitionerTokenSchema = import_zod13.z.object({
|
|
3823
|
+
id: import_zod13.z.string().min(1),
|
|
3824
|
+
token: import_zod13.z.string().min(6),
|
|
3825
|
+
practitionerId: import_zod13.z.string().min(1),
|
|
3826
|
+
email: import_zod13.z.string().email(),
|
|
3827
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3828
|
+
status: import_zod13.z.nativeEnum(PractitionerTokenStatus),
|
|
3829
|
+
createdBy: import_zod13.z.string().min(1),
|
|
3830
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3831
|
+
expiresAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3832
|
+
usedBy: import_zod13.z.string().optional(),
|
|
3833
|
+
usedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()).optional()
|
|
3834
|
+
});
|
|
3835
|
+
var createPractitionerTokenSchema = import_zod13.z.object({
|
|
3836
|
+
practitionerId: import_zod13.z.string().min(1),
|
|
3837
|
+
email: import_zod13.z.string().email(),
|
|
3838
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3839
|
+
expiresAt: import_zod13.z.date().optional()
|
|
3840
|
+
});
|
|
3841
|
+
var practitionerSignupSchema = import_zod13.z.object({
|
|
3842
|
+
email: import_zod13.z.string().email(),
|
|
3843
|
+
password: import_zod13.z.string().min(8),
|
|
3844
|
+
firstName: import_zod13.z.string().min(2).max(50),
|
|
3845
|
+
lastName: import_zod13.z.string().min(2).max(50),
|
|
3846
|
+
token: import_zod13.z.string().optional(),
|
|
3847
|
+
profileData: import_zod13.z.object({
|
|
3848
|
+
basicInfo: import_zod13.z.object({
|
|
3849
|
+
phoneNumber: import_zod13.z.string().optional(),
|
|
3850
|
+
profileImageUrl: import_zod13.z.string().optional(),
|
|
3851
|
+
gender: import_zod13.z.enum(["male", "female", "other"]).optional(),
|
|
3852
|
+
bio: import_zod13.z.string().optional()
|
|
3853
|
+
}).optional(),
|
|
3854
|
+
certification: import_zod13.z.any().optional()
|
|
3855
|
+
}).optional()
|
|
3856
|
+
});
|
|
3857
|
+
|
|
3858
|
+
// src/services/practitioner/practitioner.service.ts
|
|
3859
|
+
var import_zod14 = require("zod");
|
|
3841
3860
|
var import_geofire_common2 = require("geofire-common");
|
|
3842
3861
|
var PractitionerService = class extends BaseService {
|
|
3843
3862
|
constructor(db, auth, app, clinicService) {
|
|
@@ -3906,7 +3925,7 @@ var PractitionerService = class extends BaseService {
|
|
|
3906
3925
|
}
|
|
3907
3926
|
return createdPractitioner;
|
|
3908
3927
|
} catch (error) {
|
|
3909
|
-
if (error instanceof
|
|
3928
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
3910
3929
|
throw new Error(`Invalid practitioner data: ${error.message}`);
|
|
3911
3930
|
}
|
|
3912
3931
|
console.error("Error creating practitioner:", error);
|
|
@@ -3928,8 +3947,8 @@ var PractitionerService = class extends BaseService {
|
|
|
3928
3947
|
if (!clinic) {
|
|
3929
3948
|
throw new Error(`Clinic ${clinicId} not found`);
|
|
3930
3949
|
}
|
|
3931
|
-
const
|
|
3932
|
-
if (data.clinics) {
|
|
3950
|
+
const clinicsToAdd = /* @__PURE__ */ new Set([clinicId]);
|
|
3951
|
+
if (data.clinics && data.clinics.length > 0) {
|
|
3933
3952
|
for (const cId of data.clinics) {
|
|
3934
3953
|
if (cId !== clinicId) {
|
|
3935
3954
|
const otherClinic = await this.getClinicService().getClinic(cId);
|
|
@@ -3937,8 +3956,10 @@ var PractitionerService = class extends BaseService {
|
|
|
3937
3956
|
throw new Error(`Clinic ${cId} not found`);
|
|
3938
3957
|
}
|
|
3939
3958
|
}
|
|
3959
|
+
clinicsToAdd.add(cId);
|
|
3940
3960
|
}
|
|
3941
3961
|
}
|
|
3962
|
+
const clinics = Array.from(clinicsToAdd);
|
|
3942
3963
|
const defaultReviewInfo = {
|
|
3943
3964
|
totalReviews: 0,
|
|
3944
3965
|
averageRating: 0,
|
|
@@ -3950,7 +3971,22 @@ var PractitionerService = class extends BaseService {
|
|
|
3950
3971
|
recommendationPercentage: 0
|
|
3951
3972
|
};
|
|
3952
3973
|
const practitionerId = this.generateId();
|
|
3953
|
-
const clinicsInfo =
|
|
3974
|
+
const clinicsInfo = [];
|
|
3975
|
+
for (const cId of clinics) {
|
|
3976
|
+
const clinicData = await this.getClinicService().getClinic(cId);
|
|
3977
|
+
if (clinicData) {
|
|
3978
|
+
clinicsInfo.push({
|
|
3979
|
+
id: clinicData.id,
|
|
3980
|
+
name: clinicData.name,
|
|
3981
|
+
location: clinicData.location,
|
|
3982
|
+
contactInfo: clinicData.contactInfo,
|
|
3983
|
+
// Make sure we're using the right property for featuredPhoto
|
|
3984
|
+
featuredPhoto: clinicData.featuredPhotos && clinicData.featuredPhotos.length > 0 ? clinicData.featuredPhotos[0] : clinicData.coverPhoto || "",
|
|
3985
|
+
description: clinicData.description || null
|
|
3986
|
+
});
|
|
3987
|
+
}
|
|
3988
|
+
}
|
|
3989
|
+
const finalClinicsInfo = validatedData.clinicsInfo && validatedData.clinicsInfo.length > 0 ? validatedData.clinicsInfo : clinicsInfo;
|
|
3954
3990
|
const proceduresInfo = [];
|
|
3955
3991
|
const practitionerData = {
|
|
3956
3992
|
id: practitionerId,
|
|
@@ -3960,7 +3996,7 @@ var PractitionerService = class extends BaseService {
|
|
|
3960
3996
|
certification: validatedData.certification,
|
|
3961
3997
|
clinics,
|
|
3962
3998
|
clinicWorkingHours: validatedData.clinicWorkingHours || [],
|
|
3963
|
-
clinicsInfo,
|
|
3999
|
+
clinicsInfo: finalClinicsInfo,
|
|
3964
4000
|
procedures: [],
|
|
3965
4001
|
proceduresInfo,
|
|
3966
4002
|
reviewInfo: defaultReviewInfo,
|
|
@@ -4002,7 +4038,7 @@ var PractitionerService = class extends BaseService {
|
|
|
4002
4038
|
await (0, import_firestore15.setDoc)((0, import_firestore15.doc)(this.db, tokenPath), token);
|
|
4003
4039
|
return { practitioner: savedPractitioner, token };
|
|
4004
4040
|
} catch (error) {
|
|
4005
|
-
if (error instanceof
|
|
4041
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
4006
4042
|
throw new Error("Invalid practitioner data: " + error.message);
|
|
4007
4043
|
}
|
|
4008
4044
|
throw error;
|
|
@@ -4055,7 +4091,7 @@ var PractitionerService = class extends BaseService {
|
|
|
4055
4091
|
await (0, import_firestore15.setDoc)((0, import_firestore15.doc)(this.db, tokenPath), token);
|
|
4056
4092
|
return token;
|
|
4057
4093
|
} catch (error) {
|
|
4058
|
-
if (error instanceof
|
|
4094
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
4059
4095
|
throw new Error("Invalid token data: " + error.message);
|
|
4060
4096
|
}
|
|
4061
4097
|
throw error;
|
|
@@ -4215,7 +4251,7 @@ var PractitionerService = class extends BaseService {
|
|
|
4215
4251
|
}
|
|
4216
4252
|
return updatedPractitioner;
|
|
4217
4253
|
} catch (error) {
|
|
4218
|
-
if (error instanceof
|
|
4254
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
4219
4255
|
throw new Error(`Invalid practitioner update data: ${error.message}`);
|
|
4220
4256
|
}
|
|
4221
4257
|
console.error(`Error updating practitioner ${practitionerId}:`, error);
|
|
@@ -4743,7 +4779,7 @@ var UserService = class extends BaseService {
|
|
|
4743
4779
|
});
|
|
4744
4780
|
return this.getUserById(uid);
|
|
4745
4781
|
} catch (error) {
|
|
4746
|
-
if (error instanceof
|
|
4782
|
+
if (error instanceof import_zod15.z.ZodError) {
|
|
4747
4783
|
throw USER_ERRORS.VALIDATION_ERROR;
|
|
4748
4784
|
}
|
|
4749
4785
|
throw error;
|
|
@@ -4830,7 +4866,7 @@ var UserService = class extends BaseService {
|
|
|
4830
4866
|
// src/services/clinic/utils/clinic-group.utils.ts
|
|
4831
4867
|
var import_firestore17 = require("firebase/firestore");
|
|
4832
4868
|
var import_geofire_common3 = require("geofire-common");
|
|
4833
|
-
var
|
|
4869
|
+
var import_zod16 = require("zod");
|
|
4834
4870
|
|
|
4835
4871
|
// src/services/clinic/utils/photos.utils.ts
|
|
4836
4872
|
var import_storage3 = require("firebase/storage");
|
|
@@ -5028,7 +5064,7 @@ async function createClinicGroup(db, data, ownerId, isDefault = false, clinicAdm
|
|
|
5028
5064
|
});
|
|
5029
5065
|
return groupData;
|
|
5030
5066
|
} catch (error) {
|
|
5031
|
-
if (error instanceof
|
|
5067
|
+
if (error instanceof import_zod16.z.ZodError) {
|
|
5032
5068
|
console.error(
|
|
5033
5069
|
"[CLINIC_GROUP] Zod validation error:",
|
|
5034
5070
|
JSON.stringify(error.errors, null, 2)
|
|
@@ -5433,12 +5469,12 @@ var ClinicGroupService = class extends BaseService {
|
|
|
5433
5469
|
// src/services/clinic/clinic.service.ts
|
|
5434
5470
|
var import_firestore21 = require("firebase/firestore");
|
|
5435
5471
|
var import_geofire_common7 = require("geofire-common");
|
|
5436
|
-
var
|
|
5472
|
+
var import_zod18 = require("zod");
|
|
5437
5473
|
|
|
5438
5474
|
// src/services/clinic/utils/clinic.utils.ts
|
|
5439
5475
|
var import_firestore18 = require("firebase/firestore");
|
|
5440
5476
|
var import_geofire_common4 = require("geofire-common");
|
|
5441
|
-
var
|
|
5477
|
+
var import_zod17 = require("zod");
|
|
5442
5478
|
async function getClinic(db, clinicId) {
|
|
5443
5479
|
const docRef = (0, import_firestore18.doc)(db, CLINICS_COLLECTION, clinicId);
|
|
5444
5480
|
const docSnap = await (0, import_firestore18.getDoc)(docRef);
|
|
@@ -6110,7 +6146,7 @@ var ClinicService = class extends BaseService {
|
|
|
6110
6146
|
if (!savedClinic) throw new Error("Failed to retrieve created clinic");
|
|
6111
6147
|
return savedClinic;
|
|
6112
6148
|
} catch (error) {
|
|
6113
|
-
if (error instanceof
|
|
6149
|
+
if (error instanceof import_zod18.z.ZodError) {
|
|
6114
6150
|
throw new Error("Invalid clinic data: " + error.message);
|
|
6115
6151
|
}
|
|
6116
6152
|
console.error("Error creating clinic:", error);
|
|
@@ -6158,7 +6194,7 @@ var ClinicService = class extends BaseService {
|
|
|
6158
6194
|
if (!updatedClinic) throw new Error("Failed to retrieve updated clinic");
|
|
6159
6195
|
return updatedClinic;
|
|
6160
6196
|
} catch (error) {
|
|
6161
|
-
if (error instanceof
|
|
6197
|
+
if (error instanceof import_zod18.z.ZodError) {
|
|
6162
6198
|
throw new Error(
|
|
6163
6199
|
"Invalid clinic update data: " + error.errors.map((e) => `${e.path.join(".")} - ${e.message}`).join(", ")
|
|
6164
6200
|
);
|
|
@@ -6617,7 +6653,7 @@ var AuthService = class extends BaseService {
|
|
|
6617
6653
|
clinicAdmin: adminProfile
|
|
6618
6654
|
};
|
|
6619
6655
|
} catch (error) {
|
|
6620
|
-
if (error instanceof
|
|
6656
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6621
6657
|
console.error(
|
|
6622
6658
|
"[AUTH] Zod validation error in signUpClinicAdmin:",
|
|
6623
6659
|
JSON.stringify(error.errors, null, 2)
|
|
@@ -6790,7 +6826,7 @@ var AuthService = class extends BaseService {
|
|
|
6790
6826
|
email
|
|
6791
6827
|
);
|
|
6792
6828
|
} catch (error) {
|
|
6793
|
-
if (error instanceof
|
|
6829
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6794
6830
|
throw AUTH_ERRORS.VALIDATION_ERROR;
|
|
6795
6831
|
}
|
|
6796
6832
|
const firebaseError = error;
|
|
@@ -6913,7 +6949,7 @@ var AuthService = class extends BaseService {
|
|
|
6913
6949
|
await emailSchema.parseAsync(email);
|
|
6914
6950
|
await (0, import_auth5.sendPasswordResetEmail)(this.auth, email);
|
|
6915
6951
|
} catch (error) {
|
|
6916
|
-
if (error instanceof
|
|
6952
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6917
6953
|
throw AUTH_ERRORS.VALIDATION_ERROR;
|
|
6918
6954
|
}
|
|
6919
6955
|
const firebaseError = error;
|
|
@@ -6952,7 +6988,7 @@ var AuthService = class extends BaseService {
|
|
|
6952
6988
|
await passwordSchema.parseAsync(newPassword);
|
|
6953
6989
|
await (0, import_auth5.confirmPasswordReset)(this.auth, oobCode, newPassword);
|
|
6954
6990
|
} catch (error) {
|
|
6955
|
-
if (error instanceof
|
|
6991
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6956
6992
|
throw AUTH_ERRORS.VALIDATION_ERROR;
|
|
6957
6993
|
}
|
|
6958
6994
|
const firebaseError = error;
|
|
@@ -7121,7 +7157,7 @@ var AuthService = class extends BaseService {
|
|
|
7121
7157
|
practitioner
|
|
7122
7158
|
};
|
|
7123
7159
|
} catch (error) {
|
|
7124
|
-
if (error instanceof
|
|
7160
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
7125
7161
|
console.error(
|
|
7126
7162
|
"[AUTH] Zod validation error in signUpPractitioner:",
|
|
7127
7163
|
JSON.stringify(error.errors, null, 2)
|
|
@@ -7386,59 +7422,59 @@ var import_firestore24 = require("firebase/firestore");
|
|
|
7386
7422
|
var PROCEDURES_COLLECTION = "procedures";
|
|
7387
7423
|
|
|
7388
7424
|
// src/validations/procedure.schema.ts
|
|
7389
|
-
var
|
|
7390
|
-
var createProcedureSchema =
|
|
7391
|
-
name:
|
|
7392
|
-
description:
|
|
7393
|
-
family:
|
|
7394
|
-
categoryId:
|
|
7395
|
-
subcategoryId:
|
|
7396
|
-
technologyId:
|
|
7397
|
-
productId:
|
|
7398
|
-
price:
|
|
7399
|
-
currency:
|
|
7400
|
-
pricingMeasure:
|
|
7401
|
-
duration:
|
|
7425
|
+
var import_zod20 = require("zod");
|
|
7426
|
+
var createProcedureSchema = import_zod20.z.object({
|
|
7427
|
+
name: import_zod20.z.string().min(1).max(200),
|
|
7428
|
+
description: import_zod20.z.string().min(1).max(2e3),
|
|
7429
|
+
family: import_zod20.z.nativeEnum(ProcedureFamily),
|
|
7430
|
+
categoryId: import_zod20.z.string().min(1),
|
|
7431
|
+
subcategoryId: import_zod20.z.string().min(1),
|
|
7432
|
+
technologyId: import_zod20.z.string().min(1),
|
|
7433
|
+
productId: import_zod20.z.string().min(1),
|
|
7434
|
+
price: import_zod20.z.number().min(0),
|
|
7435
|
+
currency: import_zod20.z.nativeEnum(Currency),
|
|
7436
|
+
pricingMeasure: import_zod20.z.nativeEnum(PricingMeasure),
|
|
7437
|
+
duration: import_zod20.z.number().min(1).max(480),
|
|
7402
7438
|
// Max 8 hours
|
|
7403
|
-
practitionerId:
|
|
7404
|
-
clinicBranchId:
|
|
7439
|
+
practitionerId: import_zod20.z.string().min(1),
|
|
7440
|
+
clinicBranchId: import_zod20.z.string().min(1)
|
|
7405
7441
|
});
|
|
7406
|
-
var updateProcedureSchema =
|
|
7407
|
-
name:
|
|
7408
|
-
description:
|
|
7409
|
-
price:
|
|
7410
|
-
currency:
|
|
7411
|
-
pricingMeasure:
|
|
7412
|
-
duration:
|
|
7413
|
-
isActive:
|
|
7414
|
-
practitionerId:
|
|
7415
|
-
categoryId:
|
|
7416
|
-
subcategoryId:
|
|
7417
|
-
technologyId:
|
|
7418
|
-
productId:
|
|
7419
|
-
clinicBranchId:
|
|
7442
|
+
var updateProcedureSchema = import_zod20.z.object({
|
|
7443
|
+
name: import_zod20.z.string().min(3).max(100).optional(),
|
|
7444
|
+
description: import_zod20.z.string().min(3).max(1e3).optional(),
|
|
7445
|
+
price: import_zod20.z.number().min(0).optional(),
|
|
7446
|
+
currency: import_zod20.z.nativeEnum(Currency).optional(),
|
|
7447
|
+
pricingMeasure: import_zod20.z.nativeEnum(PricingMeasure).optional(),
|
|
7448
|
+
duration: import_zod20.z.number().min(0).optional(),
|
|
7449
|
+
isActive: import_zod20.z.boolean().optional(),
|
|
7450
|
+
practitionerId: import_zod20.z.string().optional(),
|
|
7451
|
+
categoryId: import_zod20.z.string().optional(),
|
|
7452
|
+
subcategoryId: import_zod20.z.string().optional(),
|
|
7453
|
+
technologyId: import_zod20.z.string().optional(),
|
|
7454
|
+
productId: import_zod20.z.string().optional(),
|
|
7455
|
+
clinicBranchId: import_zod20.z.string().optional()
|
|
7420
7456
|
});
|
|
7421
7457
|
var procedureSchema = createProcedureSchema.extend({
|
|
7422
|
-
id:
|
|
7423
|
-
category:
|
|
7458
|
+
id: import_zod20.z.string().min(1),
|
|
7459
|
+
category: import_zod20.z.any(),
|
|
7424
7460
|
// We'll validate the full category object separately
|
|
7425
|
-
subcategory:
|
|
7461
|
+
subcategory: import_zod20.z.any(),
|
|
7426
7462
|
// We'll validate the full subcategory object separately
|
|
7427
|
-
technology:
|
|
7463
|
+
technology: import_zod20.z.any(),
|
|
7428
7464
|
// We'll validate the full technology object separately
|
|
7429
|
-
product:
|
|
7465
|
+
product: import_zod20.z.any(),
|
|
7430
7466
|
// We'll validate the full product object separately
|
|
7431
|
-
blockingConditions:
|
|
7467
|
+
blockingConditions: import_zod20.z.array(import_zod20.z.any()),
|
|
7432
7468
|
// We'll validate blocking conditions separately
|
|
7433
|
-
treatmentBenefits:
|
|
7469
|
+
treatmentBenefits: import_zod20.z.array(import_zod20.z.any()),
|
|
7434
7470
|
// We'll validate treatment benefits separately
|
|
7435
|
-
preRequirements:
|
|
7471
|
+
preRequirements: import_zod20.z.array(import_zod20.z.any()),
|
|
7436
7472
|
// We'll validate requirements separately
|
|
7437
|
-
postRequirements:
|
|
7473
|
+
postRequirements: import_zod20.z.array(import_zod20.z.any()),
|
|
7438
7474
|
// We'll validate requirements separately
|
|
7439
|
-
certificationRequirement:
|
|
7475
|
+
certificationRequirement: import_zod20.z.any(),
|
|
7440
7476
|
// We'll validate certification requirement separately
|
|
7441
|
-
documentationTemplates:
|
|
7477
|
+
documentationTemplates: import_zod20.z.array(import_zod20.z.any()),
|
|
7442
7478
|
// We'll validate documentation templates separately
|
|
7443
7479
|
clinicInfo: clinicInfoSchema,
|
|
7444
7480
|
// Clinic info validation
|
|
@@ -7446,9 +7482,9 @@ var procedureSchema = createProcedureSchema.extend({
|
|
|
7446
7482
|
// Doctor info validation
|
|
7447
7483
|
reviewInfo: procedureReviewInfoSchema,
|
|
7448
7484
|
// Procedure review info validation
|
|
7449
|
-
isActive:
|
|
7450
|
-
createdAt:
|
|
7451
|
-
updatedAt:
|
|
7485
|
+
isActive: import_zod20.z.boolean(),
|
|
7486
|
+
createdAt: import_zod20.z.date(),
|
|
7487
|
+
updatedAt: import_zod20.z.date()
|
|
7452
7488
|
});
|
|
7453
7489
|
|
|
7454
7490
|
// src/services/procedure/procedure.service.ts
|
|
@@ -8483,42 +8519,42 @@ var SYNCED_CALENDARS_COLLECTION = "syncedCalendars";
|
|
|
8483
8519
|
var import_firestore37 = require("firebase/firestore");
|
|
8484
8520
|
|
|
8485
8521
|
// src/validations/calendar.schema.ts
|
|
8486
|
-
var
|
|
8522
|
+
var import_zod22 = require("zod");
|
|
8487
8523
|
var import_firestore28 = require("firebase/firestore");
|
|
8488
8524
|
|
|
8489
8525
|
// src/validations/profile-info.schema.ts
|
|
8490
|
-
var
|
|
8526
|
+
var import_zod21 = require("zod");
|
|
8491
8527
|
var import_firestore27 = require("firebase/firestore");
|
|
8492
|
-
var clinicInfoSchema2 =
|
|
8493
|
-
id:
|
|
8494
|
-
featuredPhoto:
|
|
8495
|
-
name:
|
|
8496
|
-
description:
|
|
8528
|
+
var clinicInfoSchema2 = import_zod21.z.object({
|
|
8529
|
+
id: import_zod21.z.string(),
|
|
8530
|
+
featuredPhoto: import_zod21.z.string(),
|
|
8531
|
+
name: import_zod21.z.string(),
|
|
8532
|
+
description: import_zod21.z.string(),
|
|
8497
8533
|
location: clinicLocationSchema,
|
|
8498
8534
|
contactInfo: clinicContactInfoSchema
|
|
8499
8535
|
});
|
|
8500
|
-
var practitionerProfileInfoSchema =
|
|
8501
|
-
id:
|
|
8502
|
-
practitionerPhoto:
|
|
8503
|
-
name:
|
|
8504
|
-
email:
|
|
8505
|
-
phone:
|
|
8536
|
+
var practitionerProfileInfoSchema = import_zod21.z.object({
|
|
8537
|
+
id: import_zod21.z.string(),
|
|
8538
|
+
practitionerPhoto: import_zod21.z.string().nullable(),
|
|
8539
|
+
name: import_zod21.z.string(),
|
|
8540
|
+
email: import_zod21.z.string().email(),
|
|
8541
|
+
phone: import_zod21.z.string().nullable(),
|
|
8506
8542
|
certification: practitionerCertificationSchema
|
|
8507
8543
|
});
|
|
8508
|
-
var patientProfileInfoSchema =
|
|
8509
|
-
id:
|
|
8510
|
-
fullName:
|
|
8511
|
-
email:
|
|
8512
|
-
phone:
|
|
8513
|
-
dateOfBirth:
|
|
8514
|
-
gender:
|
|
8544
|
+
var patientProfileInfoSchema = import_zod21.z.object({
|
|
8545
|
+
id: import_zod21.z.string(),
|
|
8546
|
+
fullName: import_zod21.z.string(),
|
|
8547
|
+
email: import_zod21.z.string().email(),
|
|
8548
|
+
phone: import_zod21.z.string().nullable(),
|
|
8549
|
+
dateOfBirth: import_zod21.z.instanceof(import_firestore27.Timestamp),
|
|
8550
|
+
gender: import_zod21.z.nativeEnum(Gender)
|
|
8515
8551
|
});
|
|
8516
8552
|
|
|
8517
8553
|
// src/validations/calendar.schema.ts
|
|
8518
8554
|
var MIN_APPOINTMENT_DURATION = 15;
|
|
8519
|
-
var calendarEventTimeSchema =
|
|
8520
|
-
start:
|
|
8521
|
-
end:
|
|
8555
|
+
var calendarEventTimeSchema = import_zod22.z.object({
|
|
8556
|
+
start: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp)),
|
|
8557
|
+
end: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp))
|
|
8522
8558
|
}).refine(
|
|
8523
8559
|
(data) => {
|
|
8524
8560
|
const startDate = data.start instanceof import_firestore28.Timestamp ? data.start.toDate() : data.start;
|
|
@@ -8539,46 +8575,46 @@ var calendarEventTimeSchema = import_zod21.z.object({
|
|
|
8539
8575
|
path: ["start"]
|
|
8540
8576
|
}
|
|
8541
8577
|
);
|
|
8542
|
-
var timeSlotSchema2 =
|
|
8543
|
-
start:
|
|
8544
|
-
end:
|
|
8545
|
-
isAvailable:
|
|
8578
|
+
var timeSlotSchema2 = import_zod22.z.object({
|
|
8579
|
+
start: import_zod22.z.date(),
|
|
8580
|
+
end: import_zod22.z.date(),
|
|
8581
|
+
isAvailable: import_zod22.z.boolean()
|
|
8546
8582
|
}).refine((data) => data.start < data.end, {
|
|
8547
8583
|
message: "End time must be after start time",
|
|
8548
8584
|
path: ["end"]
|
|
8549
8585
|
});
|
|
8550
|
-
var syncedCalendarEventSchema =
|
|
8551
|
-
eventId:
|
|
8552
|
-
syncedCalendarProvider:
|
|
8553
|
-
syncedAt:
|
|
8586
|
+
var syncedCalendarEventSchema = import_zod22.z.object({
|
|
8587
|
+
eventId: import_zod22.z.string(),
|
|
8588
|
+
syncedCalendarProvider: import_zod22.z.nativeEnum(SyncedCalendarProvider),
|
|
8589
|
+
syncedAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp))
|
|
8554
8590
|
});
|
|
8555
|
-
var procedureInfoSchema =
|
|
8556
|
-
name:
|
|
8557
|
-
description:
|
|
8558
|
-
duration:
|
|
8559
|
-
price:
|
|
8560
|
-
currency:
|
|
8591
|
+
var procedureInfoSchema = import_zod22.z.object({
|
|
8592
|
+
name: import_zod22.z.string(),
|
|
8593
|
+
description: import_zod22.z.string(),
|
|
8594
|
+
duration: import_zod22.z.number().min(MIN_APPOINTMENT_DURATION),
|
|
8595
|
+
price: import_zod22.z.number().min(0),
|
|
8596
|
+
currency: import_zod22.z.nativeEnum(Currency)
|
|
8561
8597
|
});
|
|
8562
|
-
var procedureCategorizationSchema =
|
|
8563
|
-
procedureFamily:
|
|
8598
|
+
var procedureCategorizationSchema = import_zod22.z.object({
|
|
8599
|
+
procedureFamily: import_zod22.z.string(),
|
|
8564
8600
|
// Replace with proper enum when available
|
|
8565
|
-
procedureCategory:
|
|
8601
|
+
procedureCategory: import_zod22.z.string(),
|
|
8566
8602
|
// Replace with proper enum when available
|
|
8567
|
-
procedureSubcategory:
|
|
8603
|
+
procedureSubcategory: import_zod22.z.string(),
|
|
8568
8604
|
// Replace with proper enum when available
|
|
8569
|
-
procedureTechnology:
|
|
8605
|
+
procedureTechnology: import_zod22.z.string(),
|
|
8570
8606
|
// Replace with proper enum when available
|
|
8571
|
-
procedureProduct:
|
|
8607
|
+
procedureProduct: import_zod22.z.string()
|
|
8572
8608
|
// Replace with proper enum when available
|
|
8573
8609
|
});
|
|
8574
|
-
var createAppointmentSchema2 =
|
|
8575
|
-
clinicId:
|
|
8576
|
-
doctorId:
|
|
8577
|
-
patientId:
|
|
8578
|
-
procedureId:
|
|
8610
|
+
var createAppointmentSchema2 = import_zod22.z.object({
|
|
8611
|
+
clinicId: import_zod22.z.string().min(1, "Clinic ID is required"),
|
|
8612
|
+
doctorId: import_zod22.z.string().min(1, "Doctor ID is required"),
|
|
8613
|
+
patientId: import_zod22.z.string().min(1, "Patient ID is required"),
|
|
8614
|
+
procedureId: import_zod22.z.string().min(1, "Procedure ID is required"),
|
|
8579
8615
|
eventLocation: clinicLocationSchema,
|
|
8580
8616
|
eventTime: calendarEventTimeSchema,
|
|
8581
|
-
description:
|
|
8617
|
+
description: import_zod22.z.string().optional()
|
|
8582
8618
|
}).refine(
|
|
8583
8619
|
(data) => {
|
|
8584
8620
|
return true;
|
|
@@ -8587,73 +8623,73 @@ var createAppointmentSchema2 = import_zod21.z.object({
|
|
|
8587
8623
|
message: "Invalid appointment parameters"
|
|
8588
8624
|
}
|
|
8589
8625
|
);
|
|
8590
|
-
var updateAppointmentSchema2 =
|
|
8591
|
-
appointmentId:
|
|
8592
|
-
clinicId:
|
|
8593
|
-
doctorId:
|
|
8594
|
-
patientId:
|
|
8626
|
+
var updateAppointmentSchema2 = import_zod22.z.object({
|
|
8627
|
+
appointmentId: import_zod22.z.string().min(1, "Appointment ID is required"),
|
|
8628
|
+
clinicId: import_zod22.z.string().min(1, "Clinic ID is required"),
|
|
8629
|
+
doctorId: import_zod22.z.string().min(1, "Doctor ID is required"),
|
|
8630
|
+
patientId: import_zod22.z.string().min(1, "Patient ID is required"),
|
|
8595
8631
|
eventTime: calendarEventTimeSchema.optional(),
|
|
8596
|
-
description:
|
|
8597
|
-
status:
|
|
8632
|
+
description: import_zod22.z.string().optional(),
|
|
8633
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus).optional()
|
|
8598
8634
|
});
|
|
8599
|
-
var createCalendarEventSchema =
|
|
8600
|
-
id:
|
|
8601
|
-
clinicBranchId:
|
|
8602
|
-
clinicBranchInfo:
|
|
8603
|
-
practitionerProfileId:
|
|
8635
|
+
var createCalendarEventSchema = import_zod22.z.object({
|
|
8636
|
+
id: import_zod22.z.string(),
|
|
8637
|
+
clinicBranchId: import_zod22.z.string().nullable().optional(),
|
|
8638
|
+
clinicBranchInfo: import_zod22.z.any().nullable().optional(),
|
|
8639
|
+
practitionerProfileId: import_zod22.z.string().nullable().optional(),
|
|
8604
8640
|
practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
|
|
8605
|
-
patientProfileId:
|
|
8641
|
+
patientProfileId: import_zod22.z.string().nullable().optional(),
|
|
8606
8642
|
patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
|
|
8607
|
-
procedureId:
|
|
8608
|
-
appointmentId:
|
|
8609
|
-
syncedCalendarEventId:
|
|
8610
|
-
eventName:
|
|
8643
|
+
procedureId: import_zod22.z.string().nullable().optional(),
|
|
8644
|
+
appointmentId: import_zod22.z.string().nullable().optional(),
|
|
8645
|
+
syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
|
|
8646
|
+
eventName: import_zod22.z.string().min(1, "Event name is required"),
|
|
8611
8647
|
eventLocation: clinicLocationSchema.optional(),
|
|
8612
8648
|
eventTime: calendarEventTimeSchema,
|
|
8613
|
-
description:
|
|
8614
|
-
status:
|
|
8615
|
-
syncStatus:
|
|
8616
|
-
eventType:
|
|
8617
|
-
createdAt:
|
|
8649
|
+
description: import_zod22.z.string().optional(),
|
|
8650
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus),
|
|
8651
|
+
syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus),
|
|
8652
|
+
eventType: import_zod22.z.nativeEnum(CalendarEventType),
|
|
8653
|
+
createdAt: import_zod22.z.any(),
|
|
8618
8654
|
// FieldValue for server timestamp
|
|
8619
|
-
updatedAt:
|
|
8655
|
+
updatedAt: import_zod22.z.any()
|
|
8620
8656
|
// FieldValue for server timestamp
|
|
8621
8657
|
});
|
|
8622
|
-
var updateCalendarEventSchema =
|
|
8623
|
-
syncedCalendarEventId:
|
|
8624
|
-
appointmentId:
|
|
8625
|
-
eventName:
|
|
8658
|
+
var updateCalendarEventSchema = import_zod22.z.object({
|
|
8659
|
+
syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
|
|
8660
|
+
appointmentId: import_zod22.z.string().nullable().optional(),
|
|
8661
|
+
eventName: import_zod22.z.string().optional(),
|
|
8626
8662
|
eventTime: calendarEventTimeSchema.optional(),
|
|
8627
|
-
description:
|
|
8628
|
-
status:
|
|
8629
|
-
syncStatus:
|
|
8630
|
-
eventType:
|
|
8631
|
-
updatedAt:
|
|
8663
|
+
description: import_zod22.z.string().optional(),
|
|
8664
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus).optional(),
|
|
8665
|
+
syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus).optional(),
|
|
8666
|
+
eventType: import_zod22.z.nativeEnum(CalendarEventType).optional(),
|
|
8667
|
+
updatedAt: import_zod22.z.any()
|
|
8632
8668
|
// FieldValue for server timestamp
|
|
8633
8669
|
});
|
|
8634
|
-
var calendarEventSchema =
|
|
8635
|
-
id:
|
|
8636
|
-
clinicBranchId:
|
|
8637
|
-
clinicBranchInfo:
|
|
8670
|
+
var calendarEventSchema = import_zod22.z.object({
|
|
8671
|
+
id: import_zod22.z.string(),
|
|
8672
|
+
clinicBranchId: import_zod22.z.string().nullable().optional(),
|
|
8673
|
+
clinicBranchInfo: import_zod22.z.any().nullable().optional(),
|
|
8638
8674
|
// Will be replaced with proper clinic info schema
|
|
8639
|
-
practitionerProfileId:
|
|
8675
|
+
practitionerProfileId: import_zod22.z.string().nullable().optional(),
|
|
8640
8676
|
practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
|
|
8641
|
-
patientProfileId:
|
|
8677
|
+
patientProfileId: import_zod22.z.string().nullable().optional(),
|
|
8642
8678
|
patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
|
|
8643
|
-
procedureId:
|
|
8679
|
+
procedureId: import_zod22.z.string().nullable().optional(),
|
|
8644
8680
|
procedureInfo: procedureInfoSchema.nullable().optional(),
|
|
8645
8681
|
procedureCategorization: procedureCategorizationSchema.nullable().optional(),
|
|
8646
|
-
appointmentId:
|
|
8647
|
-
syncedCalendarEventId:
|
|
8648
|
-
eventName:
|
|
8682
|
+
appointmentId: import_zod22.z.string().nullable().optional(),
|
|
8683
|
+
syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
|
|
8684
|
+
eventName: import_zod22.z.string(),
|
|
8649
8685
|
eventLocation: clinicLocationSchema.optional(),
|
|
8650
8686
|
eventTime: calendarEventTimeSchema,
|
|
8651
|
-
description:
|
|
8652
|
-
status:
|
|
8653
|
-
syncStatus:
|
|
8654
|
-
eventType:
|
|
8655
|
-
createdAt:
|
|
8656
|
-
updatedAt:
|
|
8687
|
+
description: import_zod22.z.string().optional(),
|
|
8688
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus),
|
|
8689
|
+
syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus),
|
|
8690
|
+
eventType: import_zod22.z.nativeEnum(CalendarEventType),
|
|
8691
|
+
createdAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp)),
|
|
8692
|
+
updatedAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp))
|
|
8657
8693
|
});
|
|
8658
8694
|
|
|
8659
8695
|
// src/services/calendar/utils/clinic.utils.ts
|
|
@@ -11191,7 +11227,7 @@ var import_firestore38 = require("firebase/firestore");
|
|
|
11191
11227
|
var REVIEWS_COLLECTION = "reviews";
|
|
11192
11228
|
|
|
11193
11229
|
// src/services/reviews/reviews.service.ts
|
|
11194
|
-
var
|
|
11230
|
+
var import_zod23 = require("zod");
|
|
11195
11231
|
var ReviewService = class extends BaseService {
|
|
11196
11232
|
constructor(db, auth, app) {
|
|
11197
11233
|
super(db, auth, app);
|
|
@@ -11297,7 +11333,7 @@ var ReviewService = class extends BaseService {
|
|
|
11297
11333
|
await Promise.all(updatePromises);
|
|
11298
11334
|
return review;
|
|
11299
11335
|
} catch (error) {
|
|
11300
|
-
if (error instanceof
|
|
11336
|
+
if (error instanceof import_zod23.z.ZodError) {
|
|
11301
11337
|
throw new Error(`Invalid review data: ${error.message}`);
|
|
11302
11338
|
}
|
|
11303
11339
|
throw error;
|
|
@@ -13560,54 +13596,54 @@ var ProductService = class extends BaseService {
|
|
|
13560
13596
|
};
|
|
13561
13597
|
|
|
13562
13598
|
// src/validations/notification.schema.ts
|
|
13563
|
-
var
|
|
13564
|
-
var baseNotificationSchema =
|
|
13565
|
-
id:
|
|
13566
|
-
userId:
|
|
13567
|
-
notificationTime:
|
|
13599
|
+
var import_zod24 = require("zod");
|
|
13600
|
+
var baseNotificationSchema = import_zod24.z.object({
|
|
13601
|
+
id: import_zod24.z.string().optional(),
|
|
13602
|
+
userId: import_zod24.z.string(),
|
|
13603
|
+
notificationTime: import_zod24.z.any(),
|
|
13568
13604
|
// Timestamp
|
|
13569
|
-
notificationType:
|
|
13570
|
-
notificationTokens:
|
|
13571
|
-
status:
|
|
13572
|
-
createdAt:
|
|
13605
|
+
notificationType: import_zod24.z.nativeEnum(NotificationType),
|
|
13606
|
+
notificationTokens: import_zod24.z.array(import_zod24.z.string()),
|
|
13607
|
+
status: import_zod24.z.nativeEnum(NotificationStatus),
|
|
13608
|
+
createdAt: import_zod24.z.any().optional(),
|
|
13573
13609
|
// Timestamp
|
|
13574
|
-
updatedAt:
|
|
13610
|
+
updatedAt: import_zod24.z.any().optional(),
|
|
13575
13611
|
// Timestamp
|
|
13576
|
-
title:
|
|
13577
|
-
body:
|
|
13578
|
-
isRead:
|
|
13579
|
-
userRole:
|
|
13612
|
+
title: import_zod24.z.string(),
|
|
13613
|
+
body: import_zod24.z.string(),
|
|
13614
|
+
isRead: import_zod24.z.boolean(),
|
|
13615
|
+
userRole: import_zod24.z.nativeEnum(UserRole)
|
|
13580
13616
|
});
|
|
13581
13617
|
var preRequirementNotificationSchema = baseNotificationSchema.extend({
|
|
13582
|
-
notificationType:
|
|
13583
|
-
treatmentId:
|
|
13584
|
-
requirements:
|
|
13585
|
-
deadline:
|
|
13618
|
+
notificationType: import_zod24.z.literal("preRequirement" /* PRE_REQUIREMENT */),
|
|
13619
|
+
treatmentId: import_zod24.z.string(),
|
|
13620
|
+
requirements: import_zod24.z.array(import_zod24.z.string()),
|
|
13621
|
+
deadline: import_zod24.z.any()
|
|
13586
13622
|
// Timestamp
|
|
13587
13623
|
});
|
|
13588
13624
|
var postRequirementNotificationSchema = baseNotificationSchema.extend({
|
|
13589
|
-
notificationType:
|
|
13590
|
-
treatmentId:
|
|
13591
|
-
requirements:
|
|
13592
|
-
deadline:
|
|
13625
|
+
notificationType: import_zod24.z.literal("postRequirement" /* POST_REQUIREMENT */),
|
|
13626
|
+
treatmentId: import_zod24.z.string(),
|
|
13627
|
+
requirements: import_zod24.z.array(import_zod24.z.string()),
|
|
13628
|
+
deadline: import_zod24.z.any()
|
|
13593
13629
|
// Timestamp
|
|
13594
13630
|
});
|
|
13595
13631
|
var appointmentReminderNotificationSchema = baseNotificationSchema.extend({
|
|
13596
|
-
notificationType:
|
|
13597
|
-
appointmentId:
|
|
13598
|
-
appointmentTime:
|
|
13632
|
+
notificationType: import_zod24.z.literal("appointmentReminder" /* APPOINTMENT_REMINDER */),
|
|
13633
|
+
appointmentId: import_zod24.z.string(),
|
|
13634
|
+
appointmentTime: import_zod24.z.any(),
|
|
13599
13635
|
// Timestamp
|
|
13600
|
-
treatmentType:
|
|
13601
|
-
doctorName:
|
|
13636
|
+
treatmentType: import_zod24.z.string(),
|
|
13637
|
+
doctorName: import_zod24.z.string()
|
|
13602
13638
|
});
|
|
13603
13639
|
var appointmentNotificationSchema = baseNotificationSchema.extend({
|
|
13604
|
-
notificationType:
|
|
13605
|
-
appointmentId:
|
|
13606
|
-
appointmentStatus:
|
|
13607
|
-
previousStatus:
|
|
13608
|
-
reason:
|
|
13640
|
+
notificationType: import_zod24.z.literal("appointmentNotification" /* APPOINTMENT_NOTIFICATION */),
|
|
13641
|
+
appointmentId: import_zod24.z.string(),
|
|
13642
|
+
appointmentStatus: import_zod24.z.string(),
|
|
13643
|
+
previousStatus: import_zod24.z.string(),
|
|
13644
|
+
reason: import_zod24.z.string().optional()
|
|
13609
13645
|
});
|
|
13610
|
-
var notificationSchema =
|
|
13646
|
+
var notificationSchema = import_zod24.z.discriminatedUnion("notificationType", [
|
|
13611
13647
|
preRequirementNotificationSchema,
|
|
13612
13648
|
postRequirementNotificationSchema,
|
|
13613
13649
|
appointmentReminderNotificationSchema,
|
|
@@ -13748,7 +13784,6 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
|
|
|
13748
13784
|
clinicContactInfoSchema,
|
|
13749
13785
|
clinicGroupSchema,
|
|
13750
13786
|
clinicGroupSetupSchema,
|
|
13751
|
-
clinicInfoSchema,
|
|
13752
13787
|
clinicLocationSchema,
|
|
13753
13788
|
clinicReviewInfoSchema,
|
|
13754
13789
|
clinicReviewSchema,
|
|
@@ -13776,7 +13811,6 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
|
|
|
13776
13811
|
createProcedureReviewSchema,
|
|
13777
13812
|
createReviewSchema,
|
|
13778
13813
|
createUserOptionsSchema,
|
|
13779
|
-
doctorInfoSchema,
|
|
13780
13814
|
documentElementSchema,
|
|
13781
13815
|
documentElementWithoutIdSchema,
|
|
13782
13816
|
documentTemplateSchema,
|
|
@@ -13815,7 +13849,6 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
|
|
|
13815
13849
|
procedureInfoSchema,
|
|
13816
13850
|
procedureReviewInfoSchema,
|
|
13817
13851
|
procedureReviewSchema,
|
|
13818
|
-
procedureSummaryInfoSchema,
|
|
13819
13852
|
requesterInfoSchema,
|
|
13820
13853
|
reviewSchema,
|
|
13821
13854
|
searchAppointmentsSchema,
|