@blackcode_sa/metaestetics-api 1.6.1 → 1.6.3
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 +34 -184
- package/dist/index.d.ts +34 -184
- package/dist/index.js +493 -412
- package/dist/index.mjs +476 -392
- package/package.json +1 -1
- package/src/services/patient/patient.service.ts +31 -1
- package/src/services/patient/utils/practitioner.utils.ts +79 -1
- package/src/services/practitioner/practitioner.service.ts +6 -1
- package/src/types/patient/index.ts +6 -0
- 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");
|
|
@@ -2297,6 +2294,51 @@ var getPatientsByPractitionerUtil = async (db, practitionerId, options) => {
|
|
|
2297
2294
|
);
|
|
2298
2295
|
}
|
|
2299
2296
|
};
|
|
2297
|
+
var getPatientsByPractitionerWithDetailsUtil = async (db, practitionerId, options) => {
|
|
2298
|
+
try {
|
|
2299
|
+
console.log(
|
|
2300
|
+
`[getPatientsByPractitionerWithDetailsUtil] Fetching detailed patient profiles for practitioner ID: ${practitionerId} with options:`,
|
|
2301
|
+
options
|
|
2302
|
+
);
|
|
2303
|
+
const patientProfiles = await getPatientsByPractitionerUtil(
|
|
2304
|
+
db,
|
|
2305
|
+
practitionerId,
|
|
2306
|
+
options
|
|
2307
|
+
);
|
|
2308
|
+
const patientProfilesWithDetails = await Promise.all(
|
|
2309
|
+
patientProfiles.map(async (profile) => {
|
|
2310
|
+
try {
|
|
2311
|
+
const sensitiveInfoDoc = await (0, import_firestore9.getDoc)(
|
|
2312
|
+
getSensitiveInfoDocRef(db, profile.id)
|
|
2313
|
+
);
|
|
2314
|
+
const sensitiveInfo = sensitiveInfoDoc.exists() ? sensitiveInfoDoc.data() : void 0;
|
|
2315
|
+
return {
|
|
2316
|
+
patientProfile: profile,
|
|
2317
|
+
patientSensitiveInfo: sensitiveInfo
|
|
2318
|
+
};
|
|
2319
|
+
} catch (error) {
|
|
2320
|
+
console.error(
|
|
2321
|
+
`[getPatientsByPractitionerWithDetailsUtil] Error fetching sensitive info for patient ${profile.id}:`,
|
|
2322
|
+
error
|
|
2323
|
+
);
|
|
2324
|
+
return { patientProfile: profile };
|
|
2325
|
+
}
|
|
2326
|
+
})
|
|
2327
|
+
);
|
|
2328
|
+
console.log(
|
|
2329
|
+
`[getPatientsByPractitionerWithDetailsUtil] Found ${patientProfilesWithDetails.length} detailed patient profiles for practitioner ID: ${practitionerId}`
|
|
2330
|
+
);
|
|
2331
|
+
return patientProfilesWithDetails;
|
|
2332
|
+
} catch (error) {
|
|
2333
|
+
console.error(
|
|
2334
|
+
`[getPatientsByPractitionerWithDetailsUtil] Error fetching detailed patient profiles:`,
|
|
2335
|
+
error
|
|
2336
|
+
);
|
|
2337
|
+
throw new Error(
|
|
2338
|
+
`Failed to retrieve detailed patient profiles: ${error instanceof Error ? error.message : String(error)}`
|
|
2339
|
+
);
|
|
2340
|
+
}
|
|
2341
|
+
};
|
|
2300
2342
|
|
|
2301
2343
|
// src/services/patient/utils/clinic.utils.ts
|
|
2302
2344
|
var import_firestore10 = require("firebase/firestore");
|
|
@@ -2625,6 +2667,25 @@ var PatientService = class extends BaseService {
|
|
|
2625
2667
|
);
|
|
2626
2668
|
return getPatientsByPractitionerUtil(this.db, practitionerId, options);
|
|
2627
2669
|
}
|
|
2670
|
+
/**
|
|
2671
|
+
* Gets all patients associated with a specific practitioner with their sensitive information.
|
|
2672
|
+
*
|
|
2673
|
+
* @param {string} practitionerId - ID of the practitioner whose patients to retrieve
|
|
2674
|
+
* @param {Object} options - Optional parameters for pagination
|
|
2675
|
+
* @param {number} options.limit - Maximum number of profiles to return
|
|
2676
|
+
* @param {string} options.startAfter - The ID of the document to start after (for pagination)
|
|
2677
|
+
* @returns {Promise<PatientProfileForDoctor[]>} A promise resolving to an array of patient profiles with sensitive info
|
|
2678
|
+
*/
|
|
2679
|
+
async getPatientsByPractitionerWithDetails(practitionerId, options) {
|
|
2680
|
+
console.log(
|
|
2681
|
+
`[PatientService.getPatientsByPractitionerWithDetails] Fetching detailed patient profiles for practitioner: ${practitionerId}`
|
|
2682
|
+
);
|
|
2683
|
+
return getPatientsByPractitionerWithDetailsUtil(
|
|
2684
|
+
this.db,
|
|
2685
|
+
practitionerId,
|
|
2686
|
+
options
|
|
2687
|
+
);
|
|
2688
|
+
}
|
|
2628
2689
|
/**
|
|
2629
2690
|
* Gets all patients associated with a specific clinic.
|
|
2630
2691
|
*
|
|
@@ -2643,7 +2704,7 @@ var PatientService = class extends BaseService {
|
|
|
2643
2704
|
};
|
|
2644
2705
|
|
|
2645
2706
|
// src/services/clinic/utils/admin.utils.ts
|
|
2646
|
-
var
|
|
2707
|
+
var import_firestore13 = require("firebase/firestore");
|
|
2647
2708
|
|
|
2648
2709
|
// src/types/clinic/preferences.types.ts
|
|
2649
2710
|
var PracticeType = /* @__PURE__ */ ((PracticeType2) => {
|
|
@@ -2770,52 +2831,8 @@ var SubscriptionModel = /* @__PURE__ */ ((SubscriptionModel2) => {
|
|
|
2770
2831
|
|
|
2771
2832
|
// src/validations/clinic.schema.ts
|
|
2772
2833
|
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
2834
|
var import_firestore12 = require("firebase/firestore");
|
|
2778
2835
|
|
|
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
2836
|
// src/validations/reviews.schema.ts
|
|
2820
2837
|
var import_zod10 = require("zod");
|
|
2821
2838
|
var baseReviewSchema = import_zod10.z.object({
|
|
@@ -2949,6 +2966,9 @@ var createReviewSchema = import_zod10.z.object({
|
|
|
2949
2966
|
}
|
|
2950
2967
|
);
|
|
2951
2968
|
|
|
2969
|
+
// src/validations/shared.schema.ts
|
|
2970
|
+
var import_zod11 = require("zod");
|
|
2971
|
+
|
|
2952
2972
|
// src/backoffice/types/static/procedure-family.types.ts
|
|
2953
2973
|
var ProcedureFamily = /* @__PURE__ */ ((ProcedureFamily2) => {
|
|
2954
2974
|
ProcedureFamily2["AESTHETICS"] = "aesthetics";
|
|
@@ -2975,59 +2995,21 @@ var Currency = /* @__PURE__ */ ((Currency2) => {
|
|
|
2975
2995
|
return Currency2;
|
|
2976
2996
|
})(Currency || {});
|
|
2977
2997
|
|
|
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),
|
|
2998
|
+
// src/validations/shared.schema.ts
|
|
2999
|
+
var sharedClinicContactInfoSchema = import_zod11.z.object({
|
|
2983
3000
|
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)
|
|
3001
|
+
phoneNumber: import_zod11.z.string(),
|
|
3002
|
+
alternativePhoneNumber: import_zod11.z.string().nullable().optional(),
|
|
3003
|
+
website: import_zod11.z.string().nullable().optional()
|
|
2990
3004
|
});
|
|
2991
|
-
var
|
|
2992
|
-
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
2996
|
-
|
|
2997
|
-
|
|
2998
|
-
|
|
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())
|
|
3016
|
-
});
|
|
3017
|
-
var practitionerClinicWorkingHoursSchema = import_zod11.z.object({
|
|
3018
|
-
clinicId: import_zod11.z.string().min(1),
|
|
3019
|
-
workingHours: import_zod11.z.object({
|
|
3020
|
-
monday: timeSlotSchema,
|
|
3021
|
-
tuesday: timeSlotSchema,
|
|
3022
|
-
wednesday: timeSlotSchema,
|
|
3023
|
-
thursday: timeSlotSchema,
|
|
3024
|
-
friday: timeSlotSchema,
|
|
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())
|
|
3005
|
+
var sharedClinicLocationSchema = import_zod11.z.object({
|
|
3006
|
+
address: import_zod11.z.string(),
|
|
3007
|
+
city: import_zod11.z.string(),
|
|
3008
|
+
country: import_zod11.z.string(),
|
|
3009
|
+
postalCode: import_zod11.z.string(),
|
|
3010
|
+
latitude: import_zod11.z.number().min(-90).max(90),
|
|
3011
|
+
longitude: import_zod11.z.number().min(-180).max(180),
|
|
3012
|
+
geohash: import_zod11.z.string().nullable().optional()
|
|
3031
3013
|
});
|
|
3032
3014
|
var procedureSummaryInfoSchema = import_zod11.z.object({
|
|
3033
3015
|
id: import_zod11.z.string().min(1),
|
|
@@ -3047,79 +3029,22 @@ var procedureSummaryInfoSchema = import_zod11.z.object({
|
|
|
3047
3029
|
practitionerId: import_zod11.z.string().min(1),
|
|
3048
3030
|
practitionerName: import_zod11.z.string().min(1)
|
|
3049
3031
|
});
|
|
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())
|
|
3032
|
+
var clinicInfoSchema = import_zod11.z.object({
|
|
3033
|
+
id: import_zod11.z.string(),
|
|
3034
|
+
featuredPhoto: import_zod11.z.string(),
|
|
3035
|
+
name: import_zod11.z.string(),
|
|
3036
|
+
description: import_zod11.z.string().nullable().optional(),
|
|
3037
|
+
location: sharedClinicLocationSchema,
|
|
3038
|
+
contactInfo: sharedClinicContactInfoSchema
|
|
3066
3039
|
});
|
|
3067
|
-
var
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
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()
|
|
3107
|
-
});
|
|
3108
|
-
var practitionerSignupSchema = import_zod11.z.object({
|
|
3109
|
-
email: import_zod11.z.string().email(),
|
|
3110
|
-
password: import_zod11.z.string().min(8),
|
|
3111
|
-
firstName: import_zod11.z.string().min(2).max(50),
|
|
3112
|
-
lastName: import_zod11.z.string().min(2).max(50),
|
|
3113
|
-
token: import_zod11.z.string().optional(),
|
|
3114
|
-
profileData: import_zod11.z.object({
|
|
3115
|
-
basicInfo: import_zod11.z.object({
|
|
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()
|
|
3040
|
+
var doctorInfoSchema = import_zod11.z.object({
|
|
3041
|
+
id: import_zod11.z.string(),
|
|
3042
|
+
name: import_zod11.z.string(),
|
|
3043
|
+
description: import_zod11.z.string().nullable().optional(),
|
|
3044
|
+
photo: import_zod11.z.string(),
|
|
3045
|
+
rating: import_zod11.z.number().min(0).max(5),
|
|
3046
|
+
services: import_zod11.z.array(import_zod11.z.string())
|
|
3047
|
+
// List of procedure IDs practitioner offers
|
|
3123
3048
|
});
|
|
3124
3049
|
|
|
3125
3050
|
// src/validations/clinic.schema.ts
|
|
@@ -3172,23 +3097,6 @@ var adminInfoSchema = import_zod12.z.object({
|
|
|
3172
3097
|
name: import_zod12.z.string(),
|
|
3173
3098
|
email: import_zod12.z.string().email()
|
|
3174
3099
|
});
|
|
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
3100
|
var clinicAdminSchema = import_zod12.z.object({
|
|
3193
3101
|
id: import_zod12.z.string(),
|
|
3194
3102
|
userRef: import_zod12.z.string(),
|
|
@@ -3198,8 +3106,8 @@ var clinicAdminSchema = import_zod12.z.object({
|
|
|
3198
3106
|
clinicsManagedInfo: import_zod12.z.array(clinicInfoSchema),
|
|
3199
3107
|
contactInfo: contactPersonSchema,
|
|
3200
3108
|
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(
|
|
3109
|
+
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3110
|
+
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3203
3111
|
isActive: import_zod12.z.boolean()
|
|
3204
3112
|
});
|
|
3205
3113
|
var adminTokenSchema = import_zod12.z.object({
|
|
@@ -3208,9 +3116,9 @@ var adminTokenSchema = import_zod12.z.object({
|
|
|
3208
3116
|
email: import_zod12.z.string().email().optional().nullable(),
|
|
3209
3117
|
status: import_zod12.z.nativeEnum(AdminTokenStatus),
|
|
3210
3118
|
usedByUserRef: import_zod12.z.string().optional(),
|
|
3211
|
-
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)),
|
|
3212
3120
|
// Timestamp
|
|
3213
|
-
expiresAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3121
|
+
expiresAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp))
|
|
3214
3122
|
// Timestamp
|
|
3215
3123
|
});
|
|
3216
3124
|
var createAdminTokenSchema = import_zod12.z.object({
|
|
@@ -3230,9 +3138,9 @@ var clinicGroupSchema = import_zod12.z.object({
|
|
|
3230
3138
|
adminsInfo: import_zod12.z.array(adminInfoSchema),
|
|
3231
3139
|
adminTokens: import_zod12.z.array(adminTokenSchema),
|
|
3232
3140
|
ownerId: import_zod12.z.string().nullable(),
|
|
3233
|
-
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3141
|
+
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3234
3142
|
// Timestamp
|
|
3235
|
-
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3143
|
+
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3236
3144
|
// Timestamp
|
|
3237
3145
|
isActive: import_zod12.z.boolean(),
|
|
3238
3146
|
logo: import_zod12.z.string().optional().nullable(),
|
|
@@ -3272,9 +3180,9 @@ var clinicSchema = import_zod12.z.object({
|
|
|
3272
3180
|
// servicesInfo: z.array(serviceInfoSchema), // Deprecated, use proceduresInfo
|
|
3273
3181
|
reviewInfo: clinicReviewInfoSchema,
|
|
3274
3182
|
admins: import_zod12.z.array(import_zod12.z.string()),
|
|
3275
|
-
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3183
|
+
createdAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3276
3184
|
// Timestamp
|
|
3277
|
-
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(
|
|
3185
|
+
updatedAt: import_zod12.z.instanceof(Date).or(import_zod12.z.instanceof(import_firestore12.Timestamp)),
|
|
3278
3186
|
// Timestamp
|
|
3279
3187
|
isActive: import_zod12.z.boolean(),
|
|
3280
3188
|
isVerified: import_zod12.z.boolean(),
|
|
@@ -3464,7 +3372,7 @@ async function createClinicAdmin(db, data, clinicGroupService) {
|
|
|
3464
3372
|
}
|
|
3465
3373
|
console.log("[CLINIC_ADMIN] Preparing admin data object");
|
|
3466
3374
|
const adminData = {
|
|
3467
|
-
id: (0,
|
|
3375
|
+
id: (0, import_firestore13.doc)((0, import_firestore13.collection)(db, CLINIC_ADMINS_COLLECTION)).id,
|
|
3468
3376
|
// Generate a new ID for the admin document
|
|
3469
3377
|
userRef: validatedData.userRef,
|
|
3470
3378
|
clinicGroupId: clinicGroupId || "",
|
|
@@ -3477,15 +3385,15 @@ async function createClinicAdmin(db, data, clinicGroupService) {
|
|
|
3477
3385
|
contactInfo: validatedData.contactInfo,
|
|
3478
3386
|
roleTitle: validatedData.roleTitle,
|
|
3479
3387
|
isActive: validatedData.isActive,
|
|
3480
|
-
createdAt: (0,
|
|
3481
|
-
updatedAt: (0,
|
|
3388
|
+
createdAt: (0, import_firestore13.serverTimestamp)(),
|
|
3389
|
+
updatedAt: (0, import_firestore13.serverTimestamp)()
|
|
3482
3390
|
};
|
|
3483
3391
|
console.log("[CLINIC_ADMIN] Validating complete admin object");
|
|
3484
3392
|
try {
|
|
3485
3393
|
clinicAdminSchema.parse({
|
|
3486
3394
|
...adminData,
|
|
3487
|
-
createdAt:
|
|
3488
|
-
updatedAt:
|
|
3395
|
+
createdAt: import_firestore13.Timestamp.now(),
|
|
3396
|
+
updatedAt: import_firestore13.Timestamp.now()
|
|
3489
3397
|
});
|
|
3490
3398
|
console.log("[CLINIC_ADMIN] Admin object validation passed");
|
|
3491
3399
|
} catch (schemaError) {
|
|
@@ -3499,7 +3407,7 @@ async function createClinicAdmin(db, data, clinicGroupService) {
|
|
|
3499
3407
|
adminId: adminData.id
|
|
3500
3408
|
});
|
|
3501
3409
|
try {
|
|
3502
|
-
await (0,
|
|
3410
|
+
await (0, import_firestore13.setDoc)((0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminData.id), adminData);
|
|
3503
3411
|
console.log("[CLINIC_ADMIN] Admin saved successfully");
|
|
3504
3412
|
} catch (firestoreError) {
|
|
3505
3413
|
console.error(
|
|
@@ -3548,30 +3456,30 @@ async function checkClinicGroupExists(db, groupId, clinicGroupService) {
|
|
|
3548
3456
|
return !!group;
|
|
3549
3457
|
}
|
|
3550
3458
|
async function getClinicAdmin(db, adminId) {
|
|
3551
|
-
const docRef = (0,
|
|
3552
|
-
const docSnap = await (0,
|
|
3459
|
+
const docRef = (0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminId);
|
|
3460
|
+
const docSnap = await (0, import_firestore13.getDoc)(docRef);
|
|
3553
3461
|
if (docSnap.exists()) {
|
|
3554
3462
|
return docSnap.data();
|
|
3555
3463
|
}
|
|
3556
3464
|
return null;
|
|
3557
3465
|
}
|
|
3558
3466
|
async function getClinicAdminByUserRef(db, userRef) {
|
|
3559
|
-
const q = (0,
|
|
3560
|
-
(0,
|
|
3561
|
-
(0,
|
|
3467
|
+
const q = (0, import_firestore13.query)(
|
|
3468
|
+
(0, import_firestore13.collection)(db, CLINIC_ADMINS_COLLECTION),
|
|
3469
|
+
(0, import_firestore13.where)("userRef", "==", userRef)
|
|
3562
3470
|
);
|
|
3563
|
-
const querySnapshot = await (0,
|
|
3471
|
+
const querySnapshot = await (0, import_firestore13.getDocs)(q);
|
|
3564
3472
|
if (querySnapshot.empty) {
|
|
3565
3473
|
return null;
|
|
3566
3474
|
}
|
|
3567
3475
|
return querySnapshot.docs[0].data();
|
|
3568
3476
|
}
|
|
3569
3477
|
async function getClinicAdminsByGroup(db, clinicGroupId) {
|
|
3570
|
-
const q = (0,
|
|
3571
|
-
(0,
|
|
3572
|
-
(0,
|
|
3478
|
+
const q = (0, import_firestore13.query)(
|
|
3479
|
+
(0, import_firestore13.collection)(db, CLINIC_ADMINS_COLLECTION),
|
|
3480
|
+
(0, import_firestore13.where)("clinicGroupId", "==", clinicGroupId)
|
|
3573
3481
|
);
|
|
3574
|
-
const querySnapshot = await (0,
|
|
3482
|
+
const querySnapshot = await (0, import_firestore13.getDocs)(q);
|
|
3575
3483
|
return querySnapshot.docs.map((doc32) => doc32.data());
|
|
3576
3484
|
}
|
|
3577
3485
|
async function updateClinicAdmin(db, adminId, data) {
|
|
@@ -3581,9 +3489,9 @@ async function updateClinicAdmin(db, adminId, data) {
|
|
|
3581
3489
|
}
|
|
3582
3490
|
const updatedData = {
|
|
3583
3491
|
...data,
|
|
3584
|
-
updatedAt: (0,
|
|
3492
|
+
updatedAt: (0, import_firestore13.serverTimestamp)()
|
|
3585
3493
|
};
|
|
3586
|
-
await (0,
|
|
3494
|
+
await (0, import_firestore13.updateDoc)((0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminId), updatedData);
|
|
3587
3495
|
const updatedAdmin = await getClinicAdmin(db, adminId);
|
|
3588
3496
|
if (!updatedAdmin) {
|
|
3589
3497
|
throw new Error("Failed to retrieve updated admin");
|
|
@@ -3595,7 +3503,7 @@ async function deleteClinicAdmin(db, adminId) {
|
|
|
3595
3503
|
if (!admin) {
|
|
3596
3504
|
throw new Error("Clinic admin not found");
|
|
3597
3505
|
}
|
|
3598
|
-
await (0,
|
|
3506
|
+
await (0, import_firestore13.deleteDoc)((0, import_firestore13.doc)(db, CLINIC_ADMINS_COLLECTION, adminId));
|
|
3599
3507
|
}
|
|
3600
3508
|
async function addClinicToManaged(db, adminId, clinicId, requesterId, clinicService) {
|
|
3601
3509
|
const admin = await getClinicAdmin(db, adminId);
|
|
@@ -3837,7 +3745,182 @@ var ClinicAdminService = class extends BaseService {
|
|
|
3837
3745
|
|
|
3838
3746
|
// src/services/practitioner/practitioner.service.ts
|
|
3839
3747
|
var import_firestore15 = require("firebase/firestore");
|
|
3748
|
+
|
|
3749
|
+
// src/types/practitioner/index.ts
|
|
3750
|
+
var PRACTITIONERS_COLLECTION = "practitioners";
|
|
3751
|
+
var REGISTER_TOKENS_COLLECTION = "register_tokens";
|
|
3752
|
+
var PractitionerStatus = /* @__PURE__ */ ((PractitionerStatus2) => {
|
|
3753
|
+
PractitionerStatus2["DRAFT"] = "draft";
|
|
3754
|
+
PractitionerStatus2["ACTIVE"] = "active";
|
|
3755
|
+
return PractitionerStatus2;
|
|
3756
|
+
})(PractitionerStatus || {});
|
|
3757
|
+
var PractitionerTokenStatus = /* @__PURE__ */ ((PractitionerTokenStatus2) => {
|
|
3758
|
+
PractitionerTokenStatus2["ACTIVE"] = "active";
|
|
3759
|
+
PractitionerTokenStatus2["USED"] = "used";
|
|
3760
|
+
PractitionerTokenStatus2["EXPIRED"] = "expired";
|
|
3761
|
+
PractitionerTokenStatus2["REVOKED"] = "revoked";
|
|
3762
|
+
return PractitionerTokenStatus2;
|
|
3763
|
+
})(PractitionerTokenStatus || {});
|
|
3764
|
+
|
|
3765
|
+
// src/validations/practitioner.schema.ts
|
|
3840
3766
|
var import_zod13 = require("zod");
|
|
3767
|
+
var import_firestore14 = require("firebase/firestore");
|
|
3768
|
+
|
|
3769
|
+
// src/backoffice/types/static/certification.types.ts
|
|
3770
|
+
var CertificationLevel = /* @__PURE__ */ ((CertificationLevel2) => {
|
|
3771
|
+
CertificationLevel2["AESTHETICIAN"] = "aesthetician";
|
|
3772
|
+
CertificationLevel2["NURSE_ASSISTANT"] = "nurse_assistant";
|
|
3773
|
+
CertificationLevel2["NURSE"] = "nurse";
|
|
3774
|
+
CertificationLevel2["NURSE_PRACTITIONER"] = "nurse_practitioner";
|
|
3775
|
+
CertificationLevel2["PHYSICIAN_ASSISTANT"] = "physician_assistant";
|
|
3776
|
+
CertificationLevel2["DOCTOR"] = "doctor";
|
|
3777
|
+
CertificationLevel2["SPECIALIST"] = "specialist";
|
|
3778
|
+
CertificationLevel2["PLASTIC_SURGEON"] = "plastic_surgeon";
|
|
3779
|
+
return CertificationLevel2;
|
|
3780
|
+
})(CertificationLevel || {});
|
|
3781
|
+
var CertificationSpecialty = /* @__PURE__ */ ((CertificationSpecialty3) => {
|
|
3782
|
+
CertificationSpecialty3["LASER"] = "laser";
|
|
3783
|
+
CertificationSpecialty3["INJECTABLES"] = "injectables";
|
|
3784
|
+
CertificationSpecialty3["CHEMICAL_PEELS"] = "chemical_peels";
|
|
3785
|
+
CertificationSpecialty3["MICRODERMABRASION"] = "microdermabrasion";
|
|
3786
|
+
CertificationSpecialty3["BODY_CONTOURING"] = "body_contouring";
|
|
3787
|
+
CertificationSpecialty3["SKIN_CARE"] = "skin_care";
|
|
3788
|
+
CertificationSpecialty3["WOUND_CARE"] = "wound_care";
|
|
3789
|
+
CertificationSpecialty3["ANESTHESIA"] = "anesthesia";
|
|
3790
|
+
return CertificationSpecialty3;
|
|
3791
|
+
})(CertificationSpecialty || {});
|
|
3792
|
+
|
|
3793
|
+
// src/validations/practitioner.schema.ts
|
|
3794
|
+
var practitionerBasicInfoSchema = import_zod13.z.object({
|
|
3795
|
+
firstName: import_zod13.z.string().min(2).max(50),
|
|
3796
|
+
lastName: import_zod13.z.string().min(2).max(50),
|
|
3797
|
+
title: import_zod13.z.string().min(2).max(100),
|
|
3798
|
+
email: import_zod13.z.string().email(),
|
|
3799
|
+
phoneNumber: import_zod13.z.string().regex(/^\+?[1-9]\d{1,14}$/, "Invalid phone number"),
|
|
3800
|
+
dateOfBirth: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3801
|
+
gender: import_zod13.z.enum(["male", "female", "other"]),
|
|
3802
|
+
profileImageUrl: import_zod13.z.string().url().optional(),
|
|
3803
|
+
bio: import_zod13.z.string().max(1e3).optional(),
|
|
3804
|
+
languages: import_zod13.z.array(import_zod13.z.string()).min(1)
|
|
3805
|
+
});
|
|
3806
|
+
var practitionerCertificationSchema = import_zod13.z.object({
|
|
3807
|
+
level: import_zod13.z.nativeEnum(CertificationLevel),
|
|
3808
|
+
specialties: import_zod13.z.array(import_zod13.z.nativeEnum(CertificationSpecialty)),
|
|
3809
|
+
licenseNumber: import_zod13.z.string().min(3).max(50),
|
|
3810
|
+
issuingAuthority: import_zod13.z.string().min(2).max(100),
|
|
3811
|
+
issueDate: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3812
|
+
expiryDate: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()).optional(),
|
|
3813
|
+
verificationStatus: import_zod13.z.enum(["pending", "verified", "rejected"])
|
|
3814
|
+
});
|
|
3815
|
+
var timeSlotSchema = import_zod13.z.object({
|
|
3816
|
+
start: import_zod13.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format"),
|
|
3817
|
+
end: import_zod13.z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, "Invalid time format")
|
|
3818
|
+
}).nullable();
|
|
3819
|
+
var practitionerWorkingHoursSchema = import_zod13.z.object({
|
|
3820
|
+
practitionerId: import_zod13.z.string().min(1),
|
|
3821
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3822
|
+
monday: timeSlotSchema,
|
|
3823
|
+
tuesday: timeSlotSchema,
|
|
3824
|
+
wednesday: timeSlotSchema,
|
|
3825
|
+
thursday: timeSlotSchema,
|
|
3826
|
+
friday: timeSlotSchema,
|
|
3827
|
+
saturday: timeSlotSchema,
|
|
3828
|
+
sunday: timeSlotSchema,
|
|
3829
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3830
|
+
updatedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date())
|
|
3831
|
+
});
|
|
3832
|
+
var practitionerClinicWorkingHoursSchema = import_zod13.z.object({
|
|
3833
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3834
|
+
workingHours: import_zod13.z.object({
|
|
3835
|
+
monday: timeSlotSchema,
|
|
3836
|
+
tuesday: timeSlotSchema,
|
|
3837
|
+
wednesday: timeSlotSchema,
|
|
3838
|
+
thursday: timeSlotSchema,
|
|
3839
|
+
friday: timeSlotSchema,
|
|
3840
|
+
saturday: timeSlotSchema,
|
|
3841
|
+
sunday: timeSlotSchema
|
|
3842
|
+
}),
|
|
3843
|
+
isActive: import_zod13.z.boolean(),
|
|
3844
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3845
|
+
updatedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date())
|
|
3846
|
+
});
|
|
3847
|
+
var practitionerSchema = import_zod13.z.object({
|
|
3848
|
+
id: import_zod13.z.string().min(1),
|
|
3849
|
+
userRef: import_zod13.z.string().min(1),
|
|
3850
|
+
basicInfo: practitionerBasicInfoSchema,
|
|
3851
|
+
certification: practitionerCertificationSchema,
|
|
3852
|
+
clinics: import_zod13.z.array(import_zod13.z.string()),
|
|
3853
|
+
clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema),
|
|
3854
|
+
clinicsInfo: import_zod13.z.array(clinicInfoSchema),
|
|
3855
|
+
procedures: import_zod13.z.array(import_zod13.z.string()),
|
|
3856
|
+
proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema),
|
|
3857
|
+
reviewInfo: practitionerReviewInfoSchema,
|
|
3858
|
+
isActive: import_zod13.z.boolean(),
|
|
3859
|
+
isVerified: import_zod13.z.boolean(),
|
|
3860
|
+
status: import_zod13.z.nativeEnum(PractitionerStatus),
|
|
3861
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3862
|
+
updatedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date())
|
|
3863
|
+
});
|
|
3864
|
+
var createPractitionerSchema = import_zod13.z.object({
|
|
3865
|
+
userRef: import_zod13.z.string().min(1),
|
|
3866
|
+
basicInfo: practitionerBasicInfoSchema,
|
|
3867
|
+
certification: practitionerCertificationSchema,
|
|
3868
|
+
clinics: import_zod13.z.array(import_zod13.z.string()).optional(),
|
|
3869
|
+
clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema).optional(),
|
|
3870
|
+
clinicsInfo: import_zod13.z.array(clinicInfoSchema).optional(),
|
|
3871
|
+
proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
|
|
3872
|
+
isActive: import_zod13.z.boolean(),
|
|
3873
|
+
isVerified: import_zod13.z.boolean(),
|
|
3874
|
+
status: import_zod13.z.nativeEnum(PractitionerStatus).optional()
|
|
3875
|
+
});
|
|
3876
|
+
var createDraftPractitionerSchema = import_zod13.z.object({
|
|
3877
|
+
basicInfo: practitionerBasicInfoSchema,
|
|
3878
|
+
certification: practitionerCertificationSchema,
|
|
3879
|
+
clinics: import_zod13.z.array(import_zod13.z.string()).optional(),
|
|
3880
|
+
clinicWorkingHours: import_zod13.z.array(practitionerClinicWorkingHoursSchema).optional(),
|
|
3881
|
+
clinicsInfo: import_zod13.z.array(clinicInfoSchema).optional(),
|
|
3882
|
+
proceduresInfo: import_zod13.z.array(procedureSummaryInfoSchema).optional(),
|
|
3883
|
+
isActive: import_zod13.z.boolean().optional().default(false),
|
|
3884
|
+
isVerified: import_zod13.z.boolean().optional().default(false)
|
|
3885
|
+
});
|
|
3886
|
+
var practitionerTokenSchema = import_zod13.z.object({
|
|
3887
|
+
id: import_zod13.z.string().min(1),
|
|
3888
|
+
token: import_zod13.z.string().min(6),
|
|
3889
|
+
practitionerId: import_zod13.z.string().min(1),
|
|
3890
|
+
email: import_zod13.z.string().email(),
|
|
3891
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3892
|
+
status: import_zod13.z.nativeEnum(PractitionerTokenStatus),
|
|
3893
|
+
createdBy: import_zod13.z.string().min(1),
|
|
3894
|
+
createdAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3895
|
+
expiresAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()),
|
|
3896
|
+
usedBy: import_zod13.z.string().optional(),
|
|
3897
|
+
usedAt: import_zod13.z.instanceof(import_firestore14.Timestamp).or(import_zod13.z.date()).optional()
|
|
3898
|
+
});
|
|
3899
|
+
var createPractitionerTokenSchema = import_zod13.z.object({
|
|
3900
|
+
practitionerId: import_zod13.z.string().min(1),
|
|
3901
|
+
email: import_zod13.z.string().email(),
|
|
3902
|
+
clinicId: import_zod13.z.string().min(1),
|
|
3903
|
+
expiresAt: import_zod13.z.date().optional()
|
|
3904
|
+
});
|
|
3905
|
+
var practitionerSignupSchema = import_zod13.z.object({
|
|
3906
|
+
email: import_zod13.z.string().email(),
|
|
3907
|
+
password: import_zod13.z.string().min(8),
|
|
3908
|
+
firstName: import_zod13.z.string().min(2).max(50),
|
|
3909
|
+
lastName: import_zod13.z.string().min(2).max(50),
|
|
3910
|
+
token: import_zod13.z.string().optional(),
|
|
3911
|
+
profileData: import_zod13.z.object({
|
|
3912
|
+
basicInfo: import_zod13.z.object({
|
|
3913
|
+
phoneNumber: import_zod13.z.string().optional(),
|
|
3914
|
+
profileImageUrl: import_zod13.z.string().optional(),
|
|
3915
|
+
gender: import_zod13.z.enum(["male", "female", "other"]).optional(),
|
|
3916
|
+
bio: import_zod13.z.string().optional()
|
|
3917
|
+
}).optional(),
|
|
3918
|
+
certification: import_zod13.z.any().optional()
|
|
3919
|
+
}).optional()
|
|
3920
|
+
});
|
|
3921
|
+
|
|
3922
|
+
// src/services/practitioner/practitioner.service.ts
|
|
3923
|
+
var import_zod14 = require("zod");
|
|
3841
3924
|
var import_geofire_common2 = require("geofire-common");
|
|
3842
3925
|
var PractitionerService = class extends BaseService {
|
|
3843
3926
|
constructor(db, auth, app, clinicService) {
|
|
@@ -3906,7 +3989,7 @@ var PractitionerService = class extends BaseService {
|
|
|
3906
3989
|
}
|
|
3907
3990
|
return createdPractitioner;
|
|
3908
3991
|
} catch (error) {
|
|
3909
|
-
if (error instanceof
|
|
3992
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
3910
3993
|
throw new Error(`Invalid practitioner data: ${error.message}`);
|
|
3911
3994
|
}
|
|
3912
3995
|
console.error("Error creating practitioner:", error);
|
|
@@ -3961,7 +4044,8 @@ var PractitionerService = class extends BaseService {
|
|
|
3961
4044
|
name: clinicData.name,
|
|
3962
4045
|
location: clinicData.location,
|
|
3963
4046
|
contactInfo: clinicData.contactInfo,
|
|
3964
|
-
|
|
4047
|
+
// Make sure we're using the right property for featuredPhoto
|
|
4048
|
+
featuredPhoto: clinicData.featuredPhotos && clinicData.featuredPhotos.length > 0 ? clinicData.featuredPhotos[0] : clinicData.coverPhoto || "",
|
|
3965
4049
|
description: clinicData.description || null
|
|
3966
4050
|
});
|
|
3967
4051
|
}
|
|
@@ -4018,7 +4102,7 @@ var PractitionerService = class extends BaseService {
|
|
|
4018
4102
|
await (0, import_firestore15.setDoc)((0, import_firestore15.doc)(this.db, tokenPath), token);
|
|
4019
4103
|
return { practitioner: savedPractitioner, token };
|
|
4020
4104
|
} catch (error) {
|
|
4021
|
-
if (error instanceof
|
|
4105
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
4022
4106
|
throw new Error("Invalid practitioner data: " + error.message);
|
|
4023
4107
|
}
|
|
4024
4108
|
throw error;
|
|
@@ -4071,7 +4155,7 @@ var PractitionerService = class extends BaseService {
|
|
|
4071
4155
|
await (0, import_firestore15.setDoc)((0, import_firestore15.doc)(this.db, tokenPath), token);
|
|
4072
4156
|
return token;
|
|
4073
4157
|
} catch (error) {
|
|
4074
|
-
if (error instanceof
|
|
4158
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
4075
4159
|
throw new Error("Invalid token data: " + error.message);
|
|
4076
4160
|
}
|
|
4077
4161
|
throw error;
|
|
@@ -4231,7 +4315,7 @@ var PractitionerService = class extends BaseService {
|
|
|
4231
4315
|
}
|
|
4232
4316
|
return updatedPractitioner;
|
|
4233
4317
|
} catch (error) {
|
|
4234
|
-
if (error instanceof
|
|
4318
|
+
if (error instanceof import_zod14.z.ZodError) {
|
|
4235
4319
|
throw new Error(`Invalid practitioner update data: ${error.message}`);
|
|
4236
4320
|
}
|
|
4237
4321
|
console.error(`Error updating practitioner ${practitionerId}:`, error);
|
|
@@ -4759,7 +4843,7 @@ var UserService = class extends BaseService {
|
|
|
4759
4843
|
});
|
|
4760
4844
|
return this.getUserById(uid);
|
|
4761
4845
|
} catch (error) {
|
|
4762
|
-
if (error instanceof
|
|
4846
|
+
if (error instanceof import_zod15.z.ZodError) {
|
|
4763
4847
|
throw USER_ERRORS.VALIDATION_ERROR;
|
|
4764
4848
|
}
|
|
4765
4849
|
throw error;
|
|
@@ -4846,7 +4930,7 @@ var UserService = class extends BaseService {
|
|
|
4846
4930
|
// src/services/clinic/utils/clinic-group.utils.ts
|
|
4847
4931
|
var import_firestore17 = require("firebase/firestore");
|
|
4848
4932
|
var import_geofire_common3 = require("geofire-common");
|
|
4849
|
-
var
|
|
4933
|
+
var import_zod16 = require("zod");
|
|
4850
4934
|
|
|
4851
4935
|
// src/services/clinic/utils/photos.utils.ts
|
|
4852
4936
|
var import_storage3 = require("firebase/storage");
|
|
@@ -5044,7 +5128,7 @@ async function createClinicGroup(db, data, ownerId, isDefault = false, clinicAdm
|
|
|
5044
5128
|
});
|
|
5045
5129
|
return groupData;
|
|
5046
5130
|
} catch (error) {
|
|
5047
|
-
if (error instanceof
|
|
5131
|
+
if (error instanceof import_zod16.z.ZodError) {
|
|
5048
5132
|
console.error(
|
|
5049
5133
|
"[CLINIC_GROUP] Zod validation error:",
|
|
5050
5134
|
JSON.stringify(error.errors, null, 2)
|
|
@@ -5449,12 +5533,12 @@ var ClinicGroupService = class extends BaseService {
|
|
|
5449
5533
|
// src/services/clinic/clinic.service.ts
|
|
5450
5534
|
var import_firestore21 = require("firebase/firestore");
|
|
5451
5535
|
var import_geofire_common7 = require("geofire-common");
|
|
5452
|
-
var
|
|
5536
|
+
var import_zod18 = require("zod");
|
|
5453
5537
|
|
|
5454
5538
|
// src/services/clinic/utils/clinic.utils.ts
|
|
5455
5539
|
var import_firestore18 = require("firebase/firestore");
|
|
5456
5540
|
var import_geofire_common4 = require("geofire-common");
|
|
5457
|
-
var
|
|
5541
|
+
var import_zod17 = require("zod");
|
|
5458
5542
|
async function getClinic(db, clinicId) {
|
|
5459
5543
|
const docRef = (0, import_firestore18.doc)(db, CLINICS_COLLECTION, clinicId);
|
|
5460
5544
|
const docSnap = await (0, import_firestore18.getDoc)(docRef);
|
|
@@ -6126,7 +6210,7 @@ var ClinicService = class extends BaseService {
|
|
|
6126
6210
|
if (!savedClinic) throw new Error("Failed to retrieve created clinic");
|
|
6127
6211
|
return savedClinic;
|
|
6128
6212
|
} catch (error) {
|
|
6129
|
-
if (error instanceof
|
|
6213
|
+
if (error instanceof import_zod18.z.ZodError) {
|
|
6130
6214
|
throw new Error("Invalid clinic data: " + error.message);
|
|
6131
6215
|
}
|
|
6132
6216
|
console.error("Error creating clinic:", error);
|
|
@@ -6174,7 +6258,7 @@ var ClinicService = class extends BaseService {
|
|
|
6174
6258
|
if (!updatedClinic) throw new Error("Failed to retrieve updated clinic");
|
|
6175
6259
|
return updatedClinic;
|
|
6176
6260
|
} catch (error) {
|
|
6177
|
-
if (error instanceof
|
|
6261
|
+
if (error instanceof import_zod18.z.ZodError) {
|
|
6178
6262
|
throw new Error(
|
|
6179
6263
|
"Invalid clinic update data: " + error.errors.map((e) => `${e.path.join(".")} - ${e.message}`).join(", ")
|
|
6180
6264
|
);
|
|
@@ -6633,7 +6717,7 @@ var AuthService = class extends BaseService {
|
|
|
6633
6717
|
clinicAdmin: adminProfile
|
|
6634
6718
|
};
|
|
6635
6719
|
} catch (error) {
|
|
6636
|
-
if (error instanceof
|
|
6720
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6637
6721
|
console.error(
|
|
6638
6722
|
"[AUTH] Zod validation error in signUpClinicAdmin:",
|
|
6639
6723
|
JSON.stringify(error.errors, null, 2)
|
|
@@ -6806,7 +6890,7 @@ var AuthService = class extends BaseService {
|
|
|
6806
6890
|
email
|
|
6807
6891
|
);
|
|
6808
6892
|
} catch (error) {
|
|
6809
|
-
if (error instanceof
|
|
6893
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6810
6894
|
throw AUTH_ERRORS.VALIDATION_ERROR;
|
|
6811
6895
|
}
|
|
6812
6896
|
const firebaseError = error;
|
|
@@ -6929,7 +7013,7 @@ var AuthService = class extends BaseService {
|
|
|
6929
7013
|
await emailSchema.parseAsync(email);
|
|
6930
7014
|
await (0, import_auth5.sendPasswordResetEmail)(this.auth, email);
|
|
6931
7015
|
} catch (error) {
|
|
6932
|
-
if (error instanceof
|
|
7016
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6933
7017
|
throw AUTH_ERRORS.VALIDATION_ERROR;
|
|
6934
7018
|
}
|
|
6935
7019
|
const firebaseError = error;
|
|
@@ -6968,7 +7052,7 @@ var AuthService = class extends BaseService {
|
|
|
6968
7052
|
await passwordSchema.parseAsync(newPassword);
|
|
6969
7053
|
await (0, import_auth5.confirmPasswordReset)(this.auth, oobCode, newPassword);
|
|
6970
7054
|
} catch (error) {
|
|
6971
|
-
if (error instanceof
|
|
7055
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
6972
7056
|
throw AUTH_ERRORS.VALIDATION_ERROR;
|
|
6973
7057
|
}
|
|
6974
7058
|
const firebaseError = error;
|
|
@@ -7137,7 +7221,7 @@ var AuthService = class extends BaseService {
|
|
|
7137
7221
|
practitioner
|
|
7138
7222
|
};
|
|
7139
7223
|
} catch (error) {
|
|
7140
|
-
if (error instanceof
|
|
7224
|
+
if (error instanceof import_zod19.z.ZodError) {
|
|
7141
7225
|
console.error(
|
|
7142
7226
|
"[AUTH] Zod validation error in signUpPractitioner:",
|
|
7143
7227
|
JSON.stringify(error.errors, null, 2)
|
|
@@ -7402,59 +7486,59 @@ var import_firestore24 = require("firebase/firestore");
|
|
|
7402
7486
|
var PROCEDURES_COLLECTION = "procedures";
|
|
7403
7487
|
|
|
7404
7488
|
// src/validations/procedure.schema.ts
|
|
7405
|
-
var
|
|
7406
|
-
var createProcedureSchema =
|
|
7407
|
-
name:
|
|
7408
|
-
description:
|
|
7409
|
-
family:
|
|
7410
|
-
categoryId:
|
|
7411
|
-
subcategoryId:
|
|
7412
|
-
technologyId:
|
|
7413
|
-
productId:
|
|
7414
|
-
price:
|
|
7415
|
-
currency:
|
|
7416
|
-
pricingMeasure:
|
|
7417
|
-
duration:
|
|
7489
|
+
var import_zod20 = require("zod");
|
|
7490
|
+
var createProcedureSchema = import_zod20.z.object({
|
|
7491
|
+
name: import_zod20.z.string().min(1).max(200),
|
|
7492
|
+
description: import_zod20.z.string().min(1).max(2e3),
|
|
7493
|
+
family: import_zod20.z.nativeEnum(ProcedureFamily),
|
|
7494
|
+
categoryId: import_zod20.z.string().min(1),
|
|
7495
|
+
subcategoryId: import_zod20.z.string().min(1),
|
|
7496
|
+
technologyId: import_zod20.z.string().min(1),
|
|
7497
|
+
productId: import_zod20.z.string().min(1),
|
|
7498
|
+
price: import_zod20.z.number().min(0),
|
|
7499
|
+
currency: import_zod20.z.nativeEnum(Currency),
|
|
7500
|
+
pricingMeasure: import_zod20.z.nativeEnum(PricingMeasure),
|
|
7501
|
+
duration: import_zod20.z.number().min(1).max(480),
|
|
7418
7502
|
// Max 8 hours
|
|
7419
|
-
practitionerId:
|
|
7420
|
-
clinicBranchId:
|
|
7503
|
+
practitionerId: import_zod20.z.string().min(1),
|
|
7504
|
+
clinicBranchId: import_zod20.z.string().min(1)
|
|
7421
7505
|
});
|
|
7422
|
-
var updateProcedureSchema =
|
|
7423
|
-
name:
|
|
7424
|
-
description:
|
|
7425
|
-
price:
|
|
7426
|
-
currency:
|
|
7427
|
-
pricingMeasure:
|
|
7428
|
-
duration:
|
|
7429
|
-
isActive:
|
|
7430
|
-
practitionerId:
|
|
7431
|
-
categoryId:
|
|
7432
|
-
subcategoryId:
|
|
7433
|
-
technologyId:
|
|
7434
|
-
productId:
|
|
7435
|
-
clinicBranchId:
|
|
7506
|
+
var updateProcedureSchema = import_zod20.z.object({
|
|
7507
|
+
name: import_zod20.z.string().min(3).max(100).optional(),
|
|
7508
|
+
description: import_zod20.z.string().min(3).max(1e3).optional(),
|
|
7509
|
+
price: import_zod20.z.number().min(0).optional(),
|
|
7510
|
+
currency: import_zod20.z.nativeEnum(Currency).optional(),
|
|
7511
|
+
pricingMeasure: import_zod20.z.nativeEnum(PricingMeasure).optional(),
|
|
7512
|
+
duration: import_zod20.z.number().min(0).optional(),
|
|
7513
|
+
isActive: import_zod20.z.boolean().optional(),
|
|
7514
|
+
practitionerId: import_zod20.z.string().optional(),
|
|
7515
|
+
categoryId: import_zod20.z.string().optional(),
|
|
7516
|
+
subcategoryId: import_zod20.z.string().optional(),
|
|
7517
|
+
technologyId: import_zod20.z.string().optional(),
|
|
7518
|
+
productId: import_zod20.z.string().optional(),
|
|
7519
|
+
clinicBranchId: import_zod20.z.string().optional()
|
|
7436
7520
|
});
|
|
7437
7521
|
var procedureSchema = createProcedureSchema.extend({
|
|
7438
|
-
id:
|
|
7439
|
-
category:
|
|
7522
|
+
id: import_zod20.z.string().min(1),
|
|
7523
|
+
category: import_zod20.z.any(),
|
|
7440
7524
|
// We'll validate the full category object separately
|
|
7441
|
-
subcategory:
|
|
7525
|
+
subcategory: import_zod20.z.any(),
|
|
7442
7526
|
// We'll validate the full subcategory object separately
|
|
7443
|
-
technology:
|
|
7527
|
+
technology: import_zod20.z.any(),
|
|
7444
7528
|
// We'll validate the full technology object separately
|
|
7445
|
-
product:
|
|
7529
|
+
product: import_zod20.z.any(),
|
|
7446
7530
|
// We'll validate the full product object separately
|
|
7447
|
-
blockingConditions:
|
|
7531
|
+
blockingConditions: import_zod20.z.array(import_zod20.z.any()),
|
|
7448
7532
|
// We'll validate blocking conditions separately
|
|
7449
|
-
treatmentBenefits:
|
|
7533
|
+
treatmentBenefits: import_zod20.z.array(import_zod20.z.any()),
|
|
7450
7534
|
// We'll validate treatment benefits separately
|
|
7451
|
-
preRequirements:
|
|
7535
|
+
preRequirements: import_zod20.z.array(import_zod20.z.any()),
|
|
7452
7536
|
// We'll validate requirements separately
|
|
7453
|
-
postRequirements:
|
|
7537
|
+
postRequirements: import_zod20.z.array(import_zod20.z.any()),
|
|
7454
7538
|
// We'll validate requirements separately
|
|
7455
|
-
certificationRequirement:
|
|
7539
|
+
certificationRequirement: import_zod20.z.any(),
|
|
7456
7540
|
// We'll validate certification requirement separately
|
|
7457
|
-
documentationTemplates:
|
|
7541
|
+
documentationTemplates: import_zod20.z.array(import_zod20.z.any()),
|
|
7458
7542
|
// We'll validate documentation templates separately
|
|
7459
7543
|
clinicInfo: clinicInfoSchema,
|
|
7460
7544
|
// Clinic info validation
|
|
@@ -7462,9 +7546,9 @@ var procedureSchema = createProcedureSchema.extend({
|
|
|
7462
7546
|
// Doctor info validation
|
|
7463
7547
|
reviewInfo: procedureReviewInfoSchema,
|
|
7464
7548
|
// Procedure review info validation
|
|
7465
|
-
isActive:
|
|
7466
|
-
createdAt:
|
|
7467
|
-
updatedAt:
|
|
7549
|
+
isActive: import_zod20.z.boolean(),
|
|
7550
|
+
createdAt: import_zod20.z.date(),
|
|
7551
|
+
updatedAt: import_zod20.z.date()
|
|
7468
7552
|
});
|
|
7469
7553
|
|
|
7470
7554
|
// src/services/procedure/procedure.service.ts
|
|
@@ -8499,42 +8583,42 @@ var SYNCED_CALENDARS_COLLECTION = "syncedCalendars";
|
|
|
8499
8583
|
var import_firestore37 = require("firebase/firestore");
|
|
8500
8584
|
|
|
8501
8585
|
// src/validations/calendar.schema.ts
|
|
8502
|
-
var
|
|
8586
|
+
var import_zod22 = require("zod");
|
|
8503
8587
|
var import_firestore28 = require("firebase/firestore");
|
|
8504
8588
|
|
|
8505
8589
|
// src/validations/profile-info.schema.ts
|
|
8506
|
-
var
|
|
8590
|
+
var import_zod21 = require("zod");
|
|
8507
8591
|
var import_firestore27 = require("firebase/firestore");
|
|
8508
|
-
var clinicInfoSchema2 =
|
|
8509
|
-
id:
|
|
8510
|
-
featuredPhoto:
|
|
8511
|
-
name:
|
|
8512
|
-
description:
|
|
8592
|
+
var clinicInfoSchema2 = import_zod21.z.object({
|
|
8593
|
+
id: import_zod21.z.string(),
|
|
8594
|
+
featuredPhoto: import_zod21.z.string(),
|
|
8595
|
+
name: import_zod21.z.string(),
|
|
8596
|
+
description: import_zod21.z.string(),
|
|
8513
8597
|
location: clinicLocationSchema,
|
|
8514
8598
|
contactInfo: clinicContactInfoSchema
|
|
8515
8599
|
});
|
|
8516
|
-
var practitionerProfileInfoSchema =
|
|
8517
|
-
id:
|
|
8518
|
-
practitionerPhoto:
|
|
8519
|
-
name:
|
|
8520
|
-
email:
|
|
8521
|
-
phone:
|
|
8600
|
+
var practitionerProfileInfoSchema = import_zod21.z.object({
|
|
8601
|
+
id: import_zod21.z.string(),
|
|
8602
|
+
practitionerPhoto: import_zod21.z.string().nullable(),
|
|
8603
|
+
name: import_zod21.z.string(),
|
|
8604
|
+
email: import_zod21.z.string().email(),
|
|
8605
|
+
phone: import_zod21.z.string().nullable(),
|
|
8522
8606
|
certification: practitionerCertificationSchema
|
|
8523
8607
|
});
|
|
8524
|
-
var patientProfileInfoSchema =
|
|
8525
|
-
id:
|
|
8526
|
-
fullName:
|
|
8527
|
-
email:
|
|
8528
|
-
phone:
|
|
8529
|
-
dateOfBirth:
|
|
8530
|
-
gender:
|
|
8608
|
+
var patientProfileInfoSchema = import_zod21.z.object({
|
|
8609
|
+
id: import_zod21.z.string(),
|
|
8610
|
+
fullName: import_zod21.z.string(),
|
|
8611
|
+
email: import_zod21.z.string().email(),
|
|
8612
|
+
phone: import_zod21.z.string().nullable(),
|
|
8613
|
+
dateOfBirth: import_zod21.z.instanceof(import_firestore27.Timestamp),
|
|
8614
|
+
gender: import_zod21.z.nativeEnum(Gender)
|
|
8531
8615
|
});
|
|
8532
8616
|
|
|
8533
8617
|
// src/validations/calendar.schema.ts
|
|
8534
8618
|
var MIN_APPOINTMENT_DURATION = 15;
|
|
8535
|
-
var calendarEventTimeSchema =
|
|
8536
|
-
start:
|
|
8537
|
-
end:
|
|
8619
|
+
var calendarEventTimeSchema = import_zod22.z.object({
|
|
8620
|
+
start: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp)),
|
|
8621
|
+
end: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp))
|
|
8538
8622
|
}).refine(
|
|
8539
8623
|
(data) => {
|
|
8540
8624
|
const startDate = data.start instanceof import_firestore28.Timestamp ? data.start.toDate() : data.start;
|
|
@@ -8555,46 +8639,46 @@ var calendarEventTimeSchema = import_zod21.z.object({
|
|
|
8555
8639
|
path: ["start"]
|
|
8556
8640
|
}
|
|
8557
8641
|
);
|
|
8558
|
-
var timeSlotSchema2 =
|
|
8559
|
-
start:
|
|
8560
|
-
end:
|
|
8561
|
-
isAvailable:
|
|
8642
|
+
var timeSlotSchema2 = import_zod22.z.object({
|
|
8643
|
+
start: import_zod22.z.date(),
|
|
8644
|
+
end: import_zod22.z.date(),
|
|
8645
|
+
isAvailable: import_zod22.z.boolean()
|
|
8562
8646
|
}).refine((data) => data.start < data.end, {
|
|
8563
8647
|
message: "End time must be after start time",
|
|
8564
8648
|
path: ["end"]
|
|
8565
8649
|
});
|
|
8566
|
-
var syncedCalendarEventSchema =
|
|
8567
|
-
eventId:
|
|
8568
|
-
syncedCalendarProvider:
|
|
8569
|
-
syncedAt:
|
|
8650
|
+
var syncedCalendarEventSchema = import_zod22.z.object({
|
|
8651
|
+
eventId: import_zod22.z.string(),
|
|
8652
|
+
syncedCalendarProvider: import_zod22.z.nativeEnum(SyncedCalendarProvider),
|
|
8653
|
+
syncedAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp))
|
|
8570
8654
|
});
|
|
8571
|
-
var procedureInfoSchema =
|
|
8572
|
-
name:
|
|
8573
|
-
description:
|
|
8574
|
-
duration:
|
|
8575
|
-
price:
|
|
8576
|
-
currency:
|
|
8655
|
+
var procedureInfoSchema = import_zod22.z.object({
|
|
8656
|
+
name: import_zod22.z.string(),
|
|
8657
|
+
description: import_zod22.z.string(),
|
|
8658
|
+
duration: import_zod22.z.number().min(MIN_APPOINTMENT_DURATION),
|
|
8659
|
+
price: import_zod22.z.number().min(0),
|
|
8660
|
+
currency: import_zod22.z.nativeEnum(Currency)
|
|
8577
8661
|
});
|
|
8578
|
-
var procedureCategorizationSchema =
|
|
8579
|
-
procedureFamily:
|
|
8662
|
+
var procedureCategorizationSchema = import_zod22.z.object({
|
|
8663
|
+
procedureFamily: import_zod22.z.string(),
|
|
8580
8664
|
// Replace with proper enum when available
|
|
8581
|
-
procedureCategory:
|
|
8665
|
+
procedureCategory: import_zod22.z.string(),
|
|
8582
8666
|
// Replace with proper enum when available
|
|
8583
|
-
procedureSubcategory:
|
|
8667
|
+
procedureSubcategory: import_zod22.z.string(),
|
|
8584
8668
|
// Replace with proper enum when available
|
|
8585
|
-
procedureTechnology:
|
|
8669
|
+
procedureTechnology: import_zod22.z.string(),
|
|
8586
8670
|
// Replace with proper enum when available
|
|
8587
|
-
procedureProduct:
|
|
8671
|
+
procedureProduct: import_zod22.z.string()
|
|
8588
8672
|
// Replace with proper enum when available
|
|
8589
8673
|
});
|
|
8590
|
-
var createAppointmentSchema2 =
|
|
8591
|
-
clinicId:
|
|
8592
|
-
doctorId:
|
|
8593
|
-
patientId:
|
|
8594
|
-
procedureId:
|
|
8674
|
+
var createAppointmentSchema2 = import_zod22.z.object({
|
|
8675
|
+
clinicId: import_zod22.z.string().min(1, "Clinic ID is required"),
|
|
8676
|
+
doctorId: import_zod22.z.string().min(1, "Doctor ID is required"),
|
|
8677
|
+
patientId: import_zod22.z.string().min(1, "Patient ID is required"),
|
|
8678
|
+
procedureId: import_zod22.z.string().min(1, "Procedure ID is required"),
|
|
8595
8679
|
eventLocation: clinicLocationSchema,
|
|
8596
8680
|
eventTime: calendarEventTimeSchema,
|
|
8597
|
-
description:
|
|
8681
|
+
description: import_zod22.z.string().optional()
|
|
8598
8682
|
}).refine(
|
|
8599
8683
|
(data) => {
|
|
8600
8684
|
return true;
|
|
@@ -8603,73 +8687,73 @@ var createAppointmentSchema2 = import_zod21.z.object({
|
|
|
8603
8687
|
message: "Invalid appointment parameters"
|
|
8604
8688
|
}
|
|
8605
8689
|
);
|
|
8606
|
-
var updateAppointmentSchema2 =
|
|
8607
|
-
appointmentId:
|
|
8608
|
-
clinicId:
|
|
8609
|
-
doctorId:
|
|
8610
|
-
patientId:
|
|
8690
|
+
var updateAppointmentSchema2 = import_zod22.z.object({
|
|
8691
|
+
appointmentId: import_zod22.z.string().min(1, "Appointment ID is required"),
|
|
8692
|
+
clinicId: import_zod22.z.string().min(1, "Clinic ID is required"),
|
|
8693
|
+
doctorId: import_zod22.z.string().min(1, "Doctor ID is required"),
|
|
8694
|
+
patientId: import_zod22.z.string().min(1, "Patient ID is required"),
|
|
8611
8695
|
eventTime: calendarEventTimeSchema.optional(),
|
|
8612
|
-
description:
|
|
8613
|
-
status:
|
|
8696
|
+
description: import_zod22.z.string().optional(),
|
|
8697
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus).optional()
|
|
8614
8698
|
});
|
|
8615
|
-
var createCalendarEventSchema =
|
|
8616
|
-
id:
|
|
8617
|
-
clinicBranchId:
|
|
8618
|
-
clinicBranchInfo:
|
|
8619
|
-
practitionerProfileId:
|
|
8699
|
+
var createCalendarEventSchema = import_zod22.z.object({
|
|
8700
|
+
id: import_zod22.z.string(),
|
|
8701
|
+
clinicBranchId: import_zod22.z.string().nullable().optional(),
|
|
8702
|
+
clinicBranchInfo: import_zod22.z.any().nullable().optional(),
|
|
8703
|
+
practitionerProfileId: import_zod22.z.string().nullable().optional(),
|
|
8620
8704
|
practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
|
|
8621
|
-
patientProfileId:
|
|
8705
|
+
patientProfileId: import_zod22.z.string().nullable().optional(),
|
|
8622
8706
|
patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
|
|
8623
|
-
procedureId:
|
|
8624
|
-
appointmentId:
|
|
8625
|
-
syncedCalendarEventId:
|
|
8626
|
-
eventName:
|
|
8707
|
+
procedureId: import_zod22.z.string().nullable().optional(),
|
|
8708
|
+
appointmentId: import_zod22.z.string().nullable().optional(),
|
|
8709
|
+
syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
|
|
8710
|
+
eventName: import_zod22.z.string().min(1, "Event name is required"),
|
|
8627
8711
|
eventLocation: clinicLocationSchema.optional(),
|
|
8628
8712
|
eventTime: calendarEventTimeSchema,
|
|
8629
|
-
description:
|
|
8630
|
-
status:
|
|
8631
|
-
syncStatus:
|
|
8632
|
-
eventType:
|
|
8633
|
-
createdAt:
|
|
8713
|
+
description: import_zod22.z.string().optional(),
|
|
8714
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus),
|
|
8715
|
+
syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus),
|
|
8716
|
+
eventType: import_zod22.z.nativeEnum(CalendarEventType),
|
|
8717
|
+
createdAt: import_zod22.z.any(),
|
|
8634
8718
|
// FieldValue for server timestamp
|
|
8635
|
-
updatedAt:
|
|
8719
|
+
updatedAt: import_zod22.z.any()
|
|
8636
8720
|
// FieldValue for server timestamp
|
|
8637
8721
|
});
|
|
8638
|
-
var updateCalendarEventSchema =
|
|
8639
|
-
syncedCalendarEventId:
|
|
8640
|
-
appointmentId:
|
|
8641
|
-
eventName:
|
|
8722
|
+
var updateCalendarEventSchema = import_zod22.z.object({
|
|
8723
|
+
syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
|
|
8724
|
+
appointmentId: import_zod22.z.string().nullable().optional(),
|
|
8725
|
+
eventName: import_zod22.z.string().optional(),
|
|
8642
8726
|
eventTime: calendarEventTimeSchema.optional(),
|
|
8643
|
-
description:
|
|
8644
|
-
status:
|
|
8645
|
-
syncStatus:
|
|
8646
|
-
eventType:
|
|
8647
|
-
updatedAt:
|
|
8727
|
+
description: import_zod22.z.string().optional(),
|
|
8728
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus).optional(),
|
|
8729
|
+
syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus).optional(),
|
|
8730
|
+
eventType: import_zod22.z.nativeEnum(CalendarEventType).optional(),
|
|
8731
|
+
updatedAt: import_zod22.z.any()
|
|
8648
8732
|
// FieldValue for server timestamp
|
|
8649
8733
|
});
|
|
8650
|
-
var calendarEventSchema =
|
|
8651
|
-
id:
|
|
8652
|
-
clinicBranchId:
|
|
8653
|
-
clinicBranchInfo:
|
|
8734
|
+
var calendarEventSchema = import_zod22.z.object({
|
|
8735
|
+
id: import_zod22.z.string(),
|
|
8736
|
+
clinicBranchId: import_zod22.z.string().nullable().optional(),
|
|
8737
|
+
clinicBranchInfo: import_zod22.z.any().nullable().optional(),
|
|
8654
8738
|
// Will be replaced with proper clinic info schema
|
|
8655
|
-
practitionerProfileId:
|
|
8739
|
+
practitionerProfileId: import_zod22.z.string().nullable().optional(),
|
|
8656
8740
|
practitionerProfileInfo: practitionerProfileInfoSchema.nullable().optional(),
|
|
8657
|
-
patientProfileId:
|
|
8741
|
+
patientProfileId: import_zod22.z.string().nullable().optional(),
|
|
8658
8742
|
patientProfileInfo: patientProfileInfoSchema.nullable().optional(),
|
|
8659
|
-
procedureId:
|
|
8743
|
+
procedureId: import_zod22.z.string().nullable().optional(),
|
|
8660
8744
|
procedureInfo: procedureInfoSchema.nullable().optional(),
|
|
8661
8745
|
procedureCategorization: procedureCategorizationSchema.nullable().optional(),
|
|
8662
|
-
appointmentId:
|
|
8663
|
-
syncedCalendarEventId:
|
|
8664
|
-
eventName:
|
|
8746
|
+
appointmentId: import_zod22.z.string().nullable().optional(),
|
|
8747
|
+
syncedCalendarEventId: import_zod22.z.array(syncedCalendarEventSchema).nullable().optional(),
|
|
8748
|
+
eventName: import_zod22.z.string(),
|
|
8665
8749
|
eventLocation: clinicLocationSchema.optional(),
|
|
8666
8750
|
eventTime: calendarEventTimeSchema,
|
|
8667
|
-
description:
|
|
8668
|
-
status:
|
|
8669
|
-
syncStatus:
|
|
8670
|
-
eventType:
|
|
8671
|
-
createdAt:
|
|
8672
|
-
updatedAt:
|
|
8751
|
+
description: import_zod22.z.string().optional(),
|
|
8752
|
+
status: import_zod22.z.nativeEnum(CalendarEventStatus),
|
|
8753
|
+
syncStatus: import_zod22.z.nativeEnum(CalendarSyncStatus),
|
|
8754
|
+
eventType: import_zod22.z.nativeEnum(CalendarEventType),
|
|
8755
|
+
createdAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp)),
|
|
8756
|
+
updatedAt: import_zod22.z.instanceof(Date).or(import_zod22.z.instanceof(import_firestore28.Timestamp))
|
|
8673
8757
|
});
|
|
8674
8758
|
|
|
8675
8759
|
// src/services/calendar/utils/clinic.utils.ts
|
|
@@ -11207,7 +11291,7 @@ var import_firestore38 = require("firebase/firestore");
|
|
|
11207
11291
|
var REVIEWS_COLLECTION = "reviews";
|
|
11208
11292
|
|
|
11209
11293
|
// src/services/reviews/reviews.service.ts
|
|
11210
|
-
var
|
|
11294
|
+
var import_zod23 = require("zod");
|
|
11211
11295
|
var ReviewService = class extends BaseService {
|
|
11212
11296
|
constructor(db, auth, app) {
|
|
11213
11297
|
super(db, auth, app);
|
|
@@ -11313,7 +11397,7 @@ var ReviewService = class extends BaseService {
|
|
|
11313
11397
|
await Promise.all(updatePromises);
|
|
11314
11398
|
return review;
|
|
11315
11399
|
} catch (error) {
|
|
11316
|
-
if (error instanceof
|
|
11400
|
+
if (error instanceof import_zod23.z.ZodError) {
|
|
11317
11401
|
throw new Error(`Invalid review data: ${error.message}`);
|
|
11318
11402
|
}
|
|
11319
11403
|
throw error;
|
|
@@ -13576,54 +13660,54 @@ var ProductService = class extends BaseService {
|
|
|
13576
13660
|
};
|
|
13577
13661
|
|
|
13578
13662
|
// src/validations/notification.schema.ts
|
|
13579
|
-
var
|
|
13580
|
-
var baseNotificationSchema =
|
|
13581
|
-
id:
|
|
13582
|
-
userId:
|
|
13583
|
-
notificationTime:
|
|
13663
|
+
var import_zod24 = require("zod");
|
|
13664
|
+
var baseNotificationSchema = import_zod24.z.object({
|
|
13665
|
+
id: import_zod24.z.string().optional(),
|
|
13666
|
+
userId: import_zod24.z.string(),
|
|
13667
|
+
notificationTime: import_zod24.z.any(),
|
|
13584
13668
|
// Timestamp
|
|
13585
|
-
notificationType:
|
|
13586
|
-
notificationTokens:
|
|
13587
|
-
status:
|
|
13588
|
-
createdAt:
|
|
13669
|
+
notificationType: import_zod24.z.nativeEnum(NotificationType),
|
|
13670
|
+
notificationTokens: import_zod24.z.array(import_zod24.z.string()),
|
|
13671
|
+
status: import_zod24.z.nativeEnum(NotificationStatus),
|
|
13672
|
+
createdAt: import_zod24.z.any().optional(),
|
|
13589
13673
|
// Timestamp
|
|
13590
|
-
updatedAt:
|
|
13674
|
+
updatedAt: import_zod24.z.any().optional(),
|
|
13591
13675
|
// Timestamp
|
|
13592
|
-
title:
|
|
13593
|
-
body:
|
|
13594
|
-
isRead:
|
|
13595
|
-
userRole:
|
|
13676
|
+
title: import_zod24.z.string(),
|
|
13677
|
+
body: import_zod24.z.string(),
|
|
13678
|
+
isRead: import_zod24.z.boolean(),
|
|
13679
|
+
userRole: import_zod24.z.nativeEnum(UserRole)
|
|
13596
13680
|
});
|
|
13597
13681
|
var preRequirementNotificationSchema = baseNotificationSchema.extend({
|
|
13598
|
-
notificationType:
|
|
13599
|
-
treatmentId:
|
|
13600
|
-
requirements:
|
|
13601
|
-
deadline:
|
|
13682
|
+
notificationType: import_zod24.z.literal("preRequirement" /* PRE_REQUIREMENT */),
|
|
13683
|
+
treatmentId: import_zod24.z.string(),
|
|
13684
|
+
requirements: import_zod24.z.array(import_zod24.z.string()),
|
|
13685
|
+
deadline: import_zod24.z.any()
|
|
13602
13686
|
// Timestamp
|
|
13603
13687
|
});
|
|
13604
13688
|
var postRequirementNotificationSchema = baseNotificationSchema.extend({
|
|
13605
|
-
notificationType:
|
|
13606
|
-
treatmentId:
|
|
13607
|
-
requirements:
|
|
13608
|
-
deadline:
|
|
13689
|
+
notificationType: import_zod24.z.literal("postRequirement" /* POST_REQUIREMENT */),
|
|
13690
|
+
treatmentId: import_zod24.z.string(),
|
|
13691
|
+
requirements: import_zod24.z.array(import_zod24.z.string()),
|
|
13692
|
+
deadline: import_zod24.z.any()
|
|
13609
13693
|
// Timestamp
|
|
13610
13694
|
});
|
|
13611
13695
|
var appointmentReminderNotificationSchema = baseNotificationSchema.extend({
|
|
13612
|
-
notificationType:
|
|
13613
|
-
appointmentId:
|
|
13614
|
-
appointmentTime:
|
|
13696
|
+
notificationType: import_zod24.z.literal("appointmentReminder" /* APPOINTMENT_REMINDER */),
|
|
13697
|
+
appointmentId: import_zod24.z.string(),
|
|
13698
|
+
appointmentTime: import_zod24.z.any(),
|
|
13615
13699
|
// Timestamp
|
|
13616
|
-
treatmentType:
|
|
13617
|
-
doctorName:
|
|
13700
|
+
treatmentType: import_zod24.z.string(),
|
|
13701
|
+
doctorName: import_zod24.z.string()
|
|
13618
13702
|
});
|
|
13619
13703
|
var appointmentNotificationSchema = baseNotificationSchema.extend({
|
|
13620
|
-
notificationType:
|
|
13621
|
-
appointmentId:
|
|
13622
|
-
appointmentStatus:
|
|
13623
|
-
previousStatus:
|
|
13624
|
-
reason:
|
|
13704
|
+
notificationType: import_zod24.z.literal("appointmentNotification" /* APPOINTMENT_NOTIFICATION */),
|
|
13705
|
+
appointmentId: import_zod24.z.string(),
|
|
13706
|
+
appointmentStatus: import_zod24.z.string(),
|
|
13707
|
+
previousStatus: import_zod24.z.string(),
|
|
13708
|
+
reason: import_zod24.z.string().optional()
|
|
13625
13709
|
});
|
|
13626
|
-
var notificationSchema =
|
|
13710
|
+
var notificationSchema = import_zod24.z.discriminatedUnion("notificationType", [
|
|
13627
13711
|
preRequirementNotificationSchema,
|
|
13628
13712
|
postRequirementNotificationSchema,
|
|
13629
13713
|
appointmentReminderNotificationSchema,
|
|
@@ -13764,7 +13848,6 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
|
|
|
13764
13848
|
clinicContactInfoSchema,
|
|
13765
13849
|
clinicGroupSchema,
|
|
13766
13850
|
clinicGroupSetupSchema,
|
|
13767
|
-
clinicInfoSchema,
|
|
13768
13851
|
clinicLocationSchema,
|
|
13769
13852
|
clinicReviewInfoSchema,
|
|
13770
13853
|
clinicReviewSchema,
|
|
@@ -13792,7 +13875,6 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
|
|
|
13792
13875
|
createProcedureReviewSchema,
|
|
13793
13876
|
createReviewSchema,
|
|
13794
13877
|
createUserOptionsSchema,
|
|
13795
|
-
doctorInfoSchema,
|
|
13796
13878
|
documentElementSchema,
|
|
13797
13879
|
documentElementWithoutIdSchema,
|
|
13798
13880
|
documentTemplateSchema,
|
|
@@ -13831,7 +13913,6 @@ var RequirementType = /* @__PURE__ */ ((RequirementType2) => {
|
|
|
13831
13913
|
procedureInfoSchema,
|
|
13832
13914
|
procedureReviewInfoSchema,
|
|
13833
13915
|
procedureReviewSchema,
|
|
13834
|
-
procedureSummaryInfoSchema,
|
|
13835
13916
|
requesterInfoSchema,
|
|
13836
13917
|
reviewSchema,
|
|
13837
13918
|
searchAppointmentsSchema,
|