@blackcode_sa/metaestetics-api 1.15.14 → 1.15.17-staging.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/index.d.mts +377 -222
- package/dist/admin/index.d.ts +377 -222
- package/dist/admin/index.js +625 -206
- package/dist/admin/index.mjs +624 -206
- package/dist/backoffice/index.d.mts +24 -0
- package/dist/backoffice/index.d.ts +24 -0
- package/dist/index.d.mts +297 -9
- package/dist/index.d.ts +297 -9
- package/dist/index.js +1144 -632
- package/dist/index.mjs +1139 -619
- package/package.json +2 -1
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +151 -129
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +2137 -2091
- package/src/admin/aggregation/appointment/index.ts +1 -1
- package/src/admin/aggregation/clinic/README.md +52 -52
- package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +966 -966
- package/src/admin/aggregation/clinic/index.ts +1 -1
- package/src/admin/aggregation/forms/README.md +13 -13
- package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
- package/src/admin/aggregation/forms/index.ts +1 -1
- package/src/admin/aggregation/index.ts +8 -8
- package/src/admin/aggregation/patient/README.md +27 -27
- package/src/admin/aggregation/patient/index.ts +1 -1
- package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
- package/src/admin/aggregation/practitioner/README.md +42 -42
- package/src/admin/aggregation/practitioner/index.ts +1 -1
- package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
- package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
- package/src/admin/aggregation/procedure/README.md +43 -43
- package/src/admin/aggregation/procedure/index.ts +1 -1
- package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
- package/src/admin/aggregation/reviews/index.ts +1 -1
- package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +689 -689
- package/src/admin/analytics/analytics.admin.service.ts +278 -278
- package/src/admin/analytics/index.ts +2 -2
- package/src/admin/booking/README.md +184 -125
- package/src/admin/booking/booking.admin.ts +1330 -1073
- package/src/admin/booking/booking.calculator.ts +850 -712
- package/src/admin/booking/booking.types.ts +76 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +62 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +2 -1
- package/src/admin/calendar/resource-calendar.admin.ts +198 -0
- package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
- package/src/admin/documentation-templates/index.ts +1 -1
- package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
- package/src/admin/free-consultation/index.ts +1 -1
- package/src/admin/index.ts +83 -83
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +139 -139
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +1253 -1253
- package/src/admin/mailing/appointment/index.ts +1 -1
- package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
- package/src/admin/mailing/base.mailing.service.ts +208 -208
- package/src/admin/mailing/clinicWelcome/clinicWelcome.mailing.ts +292 -292
- package/src/admin/mailing/clinicWelcome/index.ts +1 -1
- package/src/admin/mailing/clinicWelcome/templates/welcome.template.ts +225 -225
- package/src/admin/mailing/index.ts +5 -5
- package/src/admin/mailing/patientInvite/index.ts +2 -2
- package/src/admin/mailing/patientInvite/patientInvite.mailing.ts +415 -415
- package/src/admin/mailing/patientInvite/templates/invitation.template.ts +105 -105
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
- package/src/admin/mailing/practitionerInvite/index.ts +2 -2
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
- package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
- package/src/admin/notifications/index.ts +1 -1
- package/src/admin/notifications/notifications.admin.ts +818 -818
- package/src/admin/requirements/README.md +128 -128
- package/src/admin/requirements/index.ts +1 -1
- package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
- package/src/admin/users/index.ts +1 -1
- package/src/admin/users/user-profile.admin.ts +405 -405
- package/src/backoffice/constants/certification.constants.ts +13 -13
- package/src/backoffice/constants/index.ts +1 -1
- package/src/backoffice/errors/backoffice.errors.ts +181 -181
- package/src/backoffice/errors/index.ts +1 -1
- package/src/backoffice/expo-safe/README.md +26 -26
- package/src/backoffice/expo-safe/index.ts +41 -41
- package/src/backoffice/index.ts +5 -5
- package/src/backoffice/services/FIXES_README.md +102 -102
- package/src/backoffice/services/README.md +57 -57
- package/src/backoffice/services/analytics.service.proposal.md +863 -863
- package/src/backoffice/services/analytics.service.summary.md +143 -143
- package/src/backoffice/services/brand.service.ts +260 -260
- package/src/backoffice/services/category.service.ts +384 -384
- package/src/backoffice/services/constants.service.ts +385 -385
- package/src/backoffice/services/documentation-template.service.ts +202 -202
- package/src/backoffice/services/index.ts +10 -10
- package/src/backoffice/services/migrate-products.ts +116 -116
- package/src/backoffice/services/product.service.ts +557 -557
- package/src/backoffice/services/requirement.service.ts +235 -235
- package/src/backoffice/services/subcategory.service.ts +461 -461
- package/src/backoffice/services/technology.service.ts +1153 -1153
- package/src/backoffice/types/README.md +12 -12
- package/src/backoffice/types/admin-constants.types.ts +69 -69
- package/src/backoffice/types/brand.types.ts +29 -29
- package/src/backoffice/types/category.types.ts +67 -67
- package/src/backoffice/types/documentation-templates.types.ts +28 -28
- package/src/backoffice/types/index.ts +10 -10
- package/src/backoffice/types/procedure-product.types.ts +38 -38
- package/src/backoffice/types/product.types.ts +239 -239
- package/src/backoffice/types/requirement.types.ts +63 -63
- package/src/backoffice/types/static/README.md +18 -18
- package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
- package/src/backoffice/types/static/certification.types.ts +37 -37
- package/src/backoffice/types/static/contraindication.types.ts +19 -19
- package/src/backoffice/types/static/index.ts +6 -6
- package/src/backoffice/types/static/pricing.types.ts +16 -16
- package/src/backoffice/types/static/procedure-family.types.ts +14 -14
- package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
- package/src/backoffice/types/subcategory.types.ts +34 -34
- package/src/backoffice/types/technology.types.ts +168 -168
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -164
- package/src/config/__mocks__/firebase.ts +99 -99
- package/src/config/firebase.ts +78 -78
- package/src/config/index.ts +17 -17
- package/src/config/tiers.config.ts +255 -229
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +211 -211
- package/src/errors/clinic.errors.ts +32 -32
- package/src/errors/firebase.errors.ts +47 -47
- package/src/errors/user.errors.ts +99 -99
- package/src/index.backup.ts +407 -407
- package/src/index.ts +6 -6
- package/src/locales/en.ts +31 -31
- package/src/recommender/admin/index.ts +1 -1
- package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
- package/src/recommender/front/index.ts +1 -1
- package/src/recommender/front/services/onboarding.service.ts +5 -5
- package/src/recommender/front/services/recommender.service.ts +3 -3
- package/src/recommender/index.ts +1 -1
- package/src/services/PATIENTAUTH.MD +197 -197
- package/src/services/README.md +106 -106
- package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
- package/src/services/__tests__/auth/auth.setup.ts +298 -298
- package/src/services/__tests__/auth.service.test.ts +310 -310
- package/src/services/__tests__/base.service.test.ts +36 -36
- package/src/services/__tests__/user.service.test.ts +530 -530
- package/src/services/analytics/ARCHITECTURE.md +199 -199
- package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -225
- package/src/services/analytics/GROUPED_ANALYTICS.md +501 -501
- package/src/services/analytics/QUICK_START.md +393 -393
- package/src/services/analytics/README.md +304 -304
- package/src/services/analytics/SUMMARY.md +141 -141
- package/src/services/analytics/TRENDS.md +380 -380
- package/src/services/analytics/USAGE_GUIDE.md +518 -518
- package/src/services/analytics/analytics-cloud.service.ts +222 -222
- package/src/services/analytics/analytics.service.ts +2148 -2148
- package/src/services/analytics/index.ts +4 -4
- package/src/services/analytics/review-analytics.service.ts +941 -941
- package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -138
- package/src/services/analytics/utils/cost-calculation.utils.ts +182 -182
- package/src/services/analytics/utils/grouping.utils.ts +434 -434
- package/src/services/analytics/utils/stored-analytics.utils.ts +347 -347
- package/src/services/analytics/utils/time-calculation.utils.ts +186 -186
- package/src/services/analytics/utils/trend-calculation.utils.ts +200 -200
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2943 -2941
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +620 -620
- package/src/services/appointment/utils/extended-procedure.utils.ts +354 -354
- package/src/services/appointment/utils/form-initialization.utils.ts +516 -516
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +468 -468
- package/src/services/appointment/utils/zone-photo.utils.ts +302 -302
- package/src/services/auth/auth.service.ts +1435 -1435
- package/src/services/auth/auth.v2.service.ts +961 -961
- package/src/services/auth/index.ts +7 -7
- package/src/services/auth/utils/error.utils.ts +90 -90
- package/src/services/auth/utils/firebase.utils.ts +49 -49
- package/src/services/auth/utils/index.ts +21 -21
- package/src/services/auth/utils/practitioner.utils.ts +125 -125
- package/src/services/base.service.ts +41 -41
- package/src/services/calendar/calendar.service.ts +1077 -1077
- package/src/services/calendar/calendar.v2.service.ts +1693 -1693
- package/src/services/calendar/calendar.v3.service.ts +313 -313
- package/src/services/calendar/externalCalendar.service.ts +178 -178
- package/src/services/calendar/index.ts +5 -5
- package/src/services/calendar/synced-calendars.service.ts +743 -743
- package/src/services/calendar/utils/appointment.utils.ts +265 -265
- package/src/services/calendar/utils/calendar-event.utils.ts +676 -676
- package/src/services/calendar/utils/clinic.utils.ts +237 -237
- package/src/services/calendar/utils/docs.utils.ts +157 -157
- package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
- package/src/services/calendar/utils/index.ts +8 -8
- package/src/services/calendar/utils/patient.utils.ts +198 -198
- package/src/services/calendar/utils/practitioner.utils.ts +221 -221
- package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
- package/src/services/clinic/README.md +204 -204
- package/src/services/clinic/__tests__/clinic-admin.service.test.ts +265 -265
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +222 -222
- package/src/services/clinic/__tests__/clinic.service.test.ts +302 -302
- package/src/services/clinic/billing-transactions.service.ts +217 -217
- package/src/services/clinic/clinic-admin.service.ts +202 -202
- package/src/services/clinic/clinic-group.service.ts +310 -310
- package/src/services/clinic/clinic.service.ts +720 -720
- package/src/services/clinic/index.ts +5 -5
- package/src/services/clinic/practitioner-invite.service.ts +519 -519
- package/src/services/clinic/utils/admin.utils.ts +551 -551
- package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
- package/src/services/clinic/utils/clinic.utils.ts +1023 -1023
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +462 -462
- package/src/services/clinic/utils/index.ts +10 -10
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +83 -83
- package/src/services/clinic/utils/tag.utils.ts +124 -124
- package/src/services/documentation-templates/documentation-template.service.ts +537 -537
- package/src/services/documentation-templates/filled-document.service.ts +597 -597
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +16 -15
- package/src/services/media/index.ts +1 -1
- package/src/services/media/media.service.ts +418 -418
- package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
- package/src/services/notifications/index.ts +1 -1
- package/src/services/notifications/notification.service.ts +215 -215
- package/src/services/patient/README.md +48 -48
- package/src/services/patient/To-Do.md +43 -43
- package/src/services/patient/__tests__/patient.service.test.ts +286 -286
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +1021 -1021
- package/src/services/patient/patientRequirements.service.ts +309 -309
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/body-assessment.utils.ts +159 -159
- package/src/services/patient/utils/clinic.utils.ts +159 -159
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/hair-scalp-assessment.utils.ts +158 -158
- package/src/services/patient/utils/index.ts +9 -9
- package/src/services/patient/utils/location.utils.ts +126 -126
- package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
- package/src/services/patient/utils/medical.utils.ts +458 -458
- package/src/services/patient/utils/practitioner.utils.ts +260 -260
- package/src/services/patient/utils/pre-surgical-assessment.utils.ts +161 -161
- package/src/services/patient/utils/profile.utils.ts +510 -510
- package/src/services/patient/utils/sensitive.utils.ts +260 -260
- package/src/services/patient/utils/skin-quality-assessment.utils.ts +160 -160
- package/src/services/patient/utils/token.utils.ts +211 -211
- package/src/services/practitioner/README.md +145 -145
- package/src/services/practitioner/index.ts +1 -1
- package/src/services/practitioner/practitioner.service.ts +2355 -2354
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +2521 -2521
- package/src/services/resource/README.md +119 -0
- package/src/services/resource/index.ts +1 -0
- package/src/services/resource/resource.service.ts +555 -0
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +745 -745
- package/src/services/tier-enforcement.ts +240 -240
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +533 -533
- package/src/services/user/user.v2.service.ts +467 -467
- package/src/types/analytics/analytics.types.ts +597 -597
- package/src/types/analytics/grouped-analytics.types.ts +173 -173
- package/src/types/analytics/index.ts +4 -4
- package/src/types/analytics/stored-analytics.types.ts +137 -137
- package/src/types/appointment/index.ts +524 -517
- package/src/types/calendar/index.ts +261 -260
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +530 -529
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/rbac.types.ts +64 -63
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +50 -47
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +300 -300
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/body-assessment.types.ts +93 -93
- package/src/types/patient/hair-scalp-assessment.types.ts +98 -98
- package/src/types/patient/index.ts +279 -279
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/pre-surgical-assessment.types.ts +95 -95
- package/src/types/patient/skin-quality-assessment.types.ts +105 -105
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +208 -208
- package/src/types/procedure/index.ts +189 -183
- package/src/types/profile/index.ts +39 -39
- package/src/types/resource/README.md +153 -0
- package/src/types/resource/index.ts +199 -0
- package/src/types/reviews/index.ts +132 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +60 -60
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/README.md +94 -0
- package/src/validations/appointment.schema.ts +589 -589
- package/src/validations/calendar.schema.ts +225 -225
- package/src/validations/clinic.schema.ts +494 -494
- package/src/validations/common.schema.ts +25 -25
- package/src/validations/documentation-templates/index.ts +1 -1
- package/src/validations/documentation-templates/template.schema.ts +220 -220
- package/src/validations/documentation-templates.schema.ts +10 -10
- package/src/validations/index.ts +21 -20
- package/src/validations/media.schema.ts +10 -10
- package/src/validations/notification.schema.ts +90 -90
- package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
- package/src/validations/patient/body-assessment.schema.ts +82 -82
- package/src/validations/patient/hair-scalp-assessment.schema.ts +70 -70
- package/src/validations/patient/medical-info.schema.ts +177 -177
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/pre-surgical-assessment.schema.ts +78 -78
- package/src/validations/patient/skin-quality-assessment.schema.ts +70 -70
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -217
- package/src/validations/practitioner.schema.ts +224 -224
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +136 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/resource.schema.ts +57 -0
- package/src/validations/reviews.schema.ts +195 -195
- package/src/validations/schemas.ts +109 -109
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,292 +1,292 @@
|
|
|
1
|
-
import { BaseMailingService } from "../base.mailing.service";
|
|
2
|
-
import { clinicWelcomeTemplate } from "./templates/welcome.template";
|
|
3
|
-
import { Logger } from "../../logger";
|
|
4
|
-
import { ClinicGroup, CLINIC_GROUPS_COLLECTION } from "../../../types/clinic";
|
|
5
|
-
|
|
6
|
-
/**
|
|
7
|
-
* Minimal interface for the mailgun.js client
|
|
8
|
-
*/
|
|
9
|
-
interface NewMailgunMessagesAPI {
|
|
10
|
-
create(domain: string, data: any): Promise<any>;
|
|
11
|
-
}
|
|
12
|
-
interface NewMailgunClient {
|
|
13
|
-
messages: NewMailgunMessagesAPI;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Interface for clinic welcome email data
|
|
18
|
-
*/
|
|
19
|
-
export interface ClinicWelcomeEmailData {
|
|
20
|
-
/** Admin information */
|
|
21
|
-
admin: {
|
|
22
|
-
name: string;
|
|
23
|
-
email: string;
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
/** Clinic group information */
|
|
27
|
-
clinicGroup: {
|
|
28
|
-
id: string;
|
|
29
|
-
name: string;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/** Config options */
|
|
33
|
-
options?: {
|
|
34
|
-
dashboardUrl?: string;
|
|
35
|
-
supportEmail?: string;
|
|
36
|
-
customSubject?: string;
|
|
37
|
-
fromAddress?: string;
|
|
38
|
-
mailgunDomain?: string;
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Service for sending clinic welcome/confirmation emails
|
|
44
|
-
* Sent to clinic admins after successful signup
|
|
45
|
-
*/
|
|
46
|
-
export class ClinicWelcomeMailingService extends BaseMailingService {
|
|
47
|
-
private readonly DEFAULT_DASHBOARD_URL =
|
|
48
|
-
"https://app.metaesthetics.net/dashboard";
|
|
49
|
-
private readonly DEFAULT_SUPPORT_EMAIL = "support@metaesthetics.net";
|
|
50
|
-
private readonly DEFAULT_SUBJECT =
|
|
51
|
-
"Welcome to Metaesthetics - Your Clinic Registration is Complete";
|
|
52
|
-
private readonly DEFAULT_MAILGUN_DOMAIN = "mg.metaesthetics.net";
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Constructor for ClinicWelcomeMailingService
|
|
56
|
-
* @param firestore - Firestore instance provided by the caller
|
|
57
|
-
* @param mailgunClient - Mailgun client instance (mailgun.js v10+) provided by the caller
|
|
58
|
-
*/
|
|
59
|
-
constructor(
|
|
60
|
-
firestore: FirebaseFirestore.Firestore,
|
|
61
|
-
mailgunClient: NewMailgunClient
|
|
62
|
-
) {
|
|
63
|
-
super(firestore, mailgunClient);
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Sends a clinic welcome email
|
|
68
|
-
* @param data - The clinic welcome email data
|
|
69
|
-
* @returns Promise resolved when email is sent
|
|
70
|
-
*/
|
|
71
|
-
async sendWelcomeEmail(data: ClinicWelcomeEmailData): Promise<any> {
|
|
72
|
-
try {
|
|
73
|
-
Logger.info(
|
|
74
|
-
"[ClinicWelcomeMailingService] Sending welcome email to",
|
|
75
|
-
data.admin.email
|
|
76
|
-
);
|
|
77
|
-
|
|
78
|
-
// Get current date for registration date
|
|
79
|
-
const registrationDate = new Date().toLocaleDateString("en-US", {
|
|
80
|
-
weekday: "long",
|
|
81
|
-
year: "numeric",
|
|
82
|
-
month: "long",
|
|
83
|
-
day: "numeric",
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
// Dashboard URL
|
|
87
|
-
const dashboardUrl =
|
|
88
|
-
data.options?.dashboardUrl || this.DEFAULT_DASHBOARD_URL;
|
|
89
|
-
|
|
90
|
-
// Support email
|
|
91
|
-
const supportEmail =
|
|
92
|
-
data.options?.supportEmail || this.DEFAULT_SUPPORT_EMAIL;
|
|
93
|
-
|
|
94
|
-
// Subject line
|
|
95
|
-
const subject = data.options?.customSubject || this.DEFAULT_SUBJECT;
|
|
96
|
-
|
|
97
|
-
// Determine 'from' address
|
|
98
|
-
const fromAddress =
|
|
99
|
-
data.options?.fromAddress ||
|
|
100
|
-
`Metaesthetics <no-reply@${
|
|
101
|
-
data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN
|
|
102
|
-
}>`;
|
|
103
|
-
|
|
104
|
-
// Current year for copyright
|
|
105
|
-
const currentYear = new Date().getFullYear().toString();
|
|
106
|
-
|
|
107
|
-
// Prepare template variables
|
|
108
|
-
const templateVariables = {
|
|
109
|
-
adminName: data.admin.name,
|
|
110
|
-
adminEmail: data.admin.email,
|
|
111
|
-
clinicGroupName: data.clinicGroup.name,
|
|
112
|
-
registrationDate,
|
|
113
|
-
dashboardUrl,
|
|
114
|
-
supportEmail,
|
|
115
|
-
currentYear,
|
|
116
|
-
};
|
|
117
|
-
|
|
118
|
-
// Debug log for template variables
|
|
119
|
-
Logger.info("[ClinicWelcomeMailingService] Template variables:", {
|
|
120
|
-
adminName: templateVariables.adminName,
|
|
121
|
-
adminEmail: templateVariables.adminEmail,
|
|
122
|
-
clinicGroupName: templateVariables.clinicGroupName,
|
|
123
|
-
dashboardUrl: templateVariables.dashboardUrl,
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// Render HTML email
|
|
127
|
-
const html = this.renderTemplate(clinicWelcomeTemplate, templateVariables);
|
|
128
|
-
|
|
129
|
-
// Data for the sendEmail method
|
|
130
|
-
const mailgunSendData = {
|
|
131
|
-
to: data.admin.email,
|
|
132
|
-
from: fromAddress,
|
|
133
|
-
subject,
|
|
134
|
-
html,
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
// Determine the domain to use for sending
|
|
138
|
-
const domainToSendFrom =
|
|
139
|
-
data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN;
|
|
140
|
-
|
|
141
|
-
Logger.info("[ClinicWelcomeMailingService] Sending email with data:", {
|
|
142
|
-
domain: domainToSendFrom,
|
|
143
|
-
to: mailgunSendData.to,
|
|
144
|
-
from: mailgunSendData.from,
|
|
145
|
-
subject: mailgunSendData.subject,
|
|
146
|
-
hasHtml: !!mailgunSendData.html,
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
// Call the sendEmail method from BaseMailingService
|
|
150
|
-
const result = await this.sendEmail(domainToSendFrom, mailgunSendData);
|
|
151
|
-
|
|
152
|
-
// Log success
|
|
153
|
-
await this.logEmailAttempt(
|
|
154
|
-
{
|
|
155
|
-
to: data.admin.email,
|
|
156
|
-
subject,
|
|
157
|
-
templateName: "clinic_welcome",
|
|
158
|
-
},
|
|
159
|
-
true
|
|
160
|
-
);
|
|
161
|
-
|
|
162
|
-
return result;
|
|
163
|
-
} catch (error: any) {
|
|
164
|
-
Logger.error(
|
|
165
|
-
"[ClinicWelcomeMailingService] Error sending welcome email:",
|
|
166
|
-
{
|
|
167
|
-
errorMessage: error.message,
|
|
168
|
-
errorDetails: error.details,
|
|
169
|
-
errorStatus: error.status,
|
|
170
|
-
stack: error.stack,
|
|
171
|
-
}
|
|
172
|
-
);
|
|
173
|
-
|
|
174
|
-
// Log failure
|
|
175
|
-
await this.logEmailAttempt(
|
|
176
|
-
{
|
|
177
|
-
to: data.admin.email,
|
|
178
|
-
subject: data.options?.customSubject || this.DEFAULT_SUBJECT,
|
|
179
|
-
templateName: "clinic_welcome",
|
|
180
|
-
},
|
|
181
|
-
false,
|
|
182
|
-
error
|
|
183
|
-
);
|
|
184
|
-
|
|
185
|
-
throw error;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Handles the clinic group creation event from Cloud Functions.
|
|
191
|
-
* Fetches necessary data and sends the welcome email to the admin.
|
|
192
|
-
* @param clinicGroupData - The clinic group data including id
|
|
193
|
-
* @param mailgunConfig - Mailgun configuration (from, domain)
|
|
194
|
-
* @returns Promise resolved when the email is sent
|
|
195
|
-
*/
|
|
196
|
-
async handleClinicGroupCreationEvent(
|
|
197
|
-
clinicGroupData: ClinicGroup & { id: string },
|
|
198
|
-
mailgunConfig: {
|
|
199
|
-
fromAddress: string;
|
|
200
|
-
domain: string;
|
|
201
|
-
dashboardUrl?: string;
|
|
202
|
-
supportEmail?: string;
|
|
203
|
-
}
|
|
204
|
-
): Promise<void> {
|
|
205
|
-
try {
|
|
206
|
-
Logger.info(
|
|
207
|
-
"[ClinicWelcomeMailingService] Handling clinic group creation event for:",
|
|
208
|
-
clinicGroupData.id
|
|
209
|
-
);
|
|
210
|
-
|
|
211
|
-
// Validate clinic group data
|
|
212
|
-
if (!clinicGroupData || !clinicGroupData.id) {
|
|
213
|
-
throw new Error(
|
|
214
|
-
`Invalid clinic group data: Missing required properties.`
|
|
215
|
-
);
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
// Validate contact person
|
|
219
|
-
if (!clinicGroupData.contactPerson) {
|
|
220
|
-
throw new Error(
|
|
221
|
-
`Clinic group ${clinicGroupData.id} is missing contactPerson`
|
|
222
|
-
);
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
if (!clinicGroupData.contactPerson.email) {
|
|
226
|
-
throw new Error(
|
|
227
|
-
`Clinic group ${clinicGroupData.id} is missing admin email`
|
|
228
|
-
);
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
// Get admin name from contact person
|
|
232
|
-
const adminName = `${clinicGroupData.contactPerson.firstName || ""} ${
|
|
233
|
-
clinicGroupData.contactPerson.lastName || ""
|
|
234
|
-
}`.trim() || "Clinic Admin";
|
|
235
|
-
|
|
236
|
-
const adminEmail = clinicGroupData.contactPerson.email;
|
|
237
|
-
|
|
238
|
-
Logger.info(
|
|
239
|
-
`[ClinicWelcomeMailingService] Sending welcome email to admin: ${adminName} (${adminEmail})`
|
|
240
|
-
);
|
|
241
|
-
|
|
242
|
-
// Validate fromAddress
|
|
243
|
-
if (!mailgunConfig.fromAddress) {
|
|
244
|
-
Logger.warn(
|
|
245
|
-
"[ClinicWelcomeMailingService] No fromAddress provided, using default"
|
|
246
|
-
);
|
|
247
|
-
mailgunConfig.fromAddress = `Metaesthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
// Prepare email data
|
|
251
|
-
const emailData: ClinicWelcomeEmailData = {
|
|
252
|
-
admin: {
|
|
253
|
-
name: adminName,
|
|
254
|
-
email: adminEmail,
|
|
255
|
-
},
|
|
256
|
-
clinicGroup: {
|
|
257
|
-
id: clinicGroupData.id,
|
|
258
|
-
name: clinicGroupData.name || "Your Clinic",
|
|
259
|
-
},
|
|
260
|
-
options: {
|
|
261
|
-
fromAddress: mailgunConfig.fromAddress,
|
|
262
|
-
mailgunDomain: mailgunConfig.domain,
|
|
263
|
-
dashboardUrl: mailgunConfig.dashboardUrl,
|
|
264
|
-
supportEmail: mailgunConfig.supportEmail,
|
|
265
|
-
},
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
Logger.info(
|
|
269
|
-
"[ClinicWelcomeMailingService] Email data prepared, sending welcome email"
|
|
270
|
-
);
|
|
271
|
-
|
|
272
|
-
// Send the welcome email
|
|
273
|
-
await this.sendWelcomeEmail(emailData);
|
|
274
|
-
|
|
275
|
-
Logger.info(
|
|
276
|
-
"[ClinicWelcomeMailingService] Welcome email sent successfully"
|
|
277
|
-
);
|
|
278
|
-
} catch (error: any) {
|
|
279
|
-
Logger.error(
|
|
280
|
-
"[ClinicWelcomeMailingService] Error handling clinic group creation event:",
|
|
281
|
-
{
|
|
282
|
-
errorMessage: error.message,
|
|
283
|
-
errorDetails: error.details,
|
|
284
|
-
errorStatus: error.status,
|
|
285
|
-
stack: error.stack,
|
|
286
|
-
clinicGroupId: clinicGroupData?.id,
|
|
287
|
-
}
|
|
288
|
-
);
|
|
289
|
-
throw error;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
1
|
+
import { BaseMailingService } from "../base.mailing.service";
|
|
2
|
+
import { clinicWelcomeTemplate } from "./templates/welcome.template";
|
|
3
|
+
import { Logger } from "../../logger";
|
|
4
|
+
import { ClinicGroup, CLINIC_GROUPS_COLLECTION } from "../../../types/clinic";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Minimal interface for the mailgun.js client
|
|
8
|
+
*/
|
|
9
|
+
interface NewMailgunMessagesAPI {
|
|
10
|
+
create(domain: string, data: any): Promise<any>;
|
|
11
|
+
}
|
|
12
|
+
interface NewMailgunClient {
|
|
13
|
+
messages: NewMailgunMessagesAPI;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Interface for clinic welcome email data
|
|
18
|
+
*/
|
|
19
|
+
export interface ClinicWelcomeEmailData {
|
|
20
|
+
/** Admin information */
|
|
21
|
+
admin: {
|
|
22
|
+
name: string;
|
|
23
|
+
email: string;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** Clinic group information */
|
|
27
|
+
clinicGroup: {
|
|
28
|
+
id: string;
|
|
29
|
+
name: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
/** Config options */
|
|
33
|
+
options?: {
|
|
34
|
+
dashboardUrl?: string;
|
|
35
|
+
supportEmail?: string;
|
|
36
|
+
customSubject?: string;
|
|
37
|
+
fromAddress?: string;
|
|
38
|
+
mailgunDomain?: string;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Service for sending clinic welcome/confirmation emails
|
|
44
|
+
* Sent to clinic admins after successful signup
|
|
45
|
+
*/
|
|
46
|
+
export class ClinicWelcomeMailingService extends BaseMailingService {
|
|
47
|
+
private readonly DEFAULT_DASHBOARD_URL =
|
|
48
|
+
"https://app.metaesthetics.net/dashboard";
|
|
49
|
+
private readonly DEFAULT_SUPPORT_EMAIL = "support@metaesthetics.net";
|
|
50
|
+
private readonly DEFAULT_SUBJECT =
|
|
51
|
+
"Welcome to Metaesthetics - Your Clinic Registration is Complete";
|
|
52
|
+
private readonly DEFAULT_MAILGUN_DOMAIN = "mg.metaesthetics.net";
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Constructor for ClinicWelcomeMailingService
|
|
56
|
+
* @param firestore - Firestore instance provided by the caller
|
|
57
|
+
* @param mailgunClient - Mailgun client instance (mailgun.js v10+) provided by the caller
|
|
58
|
+
*/
|
|
59
|
+
constructor(
|
|
60
|
+
firestore: FirebaseFirestore.Firestore,
|
|
61
|
+
mailgunClient: NewMailgunClient
|
|
62
|
+
) {
|
|
63
|
+
super(firestore, mailgunClient);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Sends a clinic welcome email
|
|
68
|
+
* @param data - The clinic welcome email data
|
|
69
|
+
* @returns Promise resolved when email is sent
|
|
70
|
+
*/
|
|
71
|
+
async sendWelcomeEmail(data: ClinicWelcomeEmailData): Promise<any> {
|
|
72
|
+
try {
|
|
73
|
+
Logger.info(
|
|
74
|
+
"[ClinicWelcomeMailingService] Sending welcome email to",
|
|
75
|
+
data.admin.email
|
|
76
|
+
);
|
|
77
|
+
|
|
78
|
+
// Get current date for registration date
|
|
79
|
+
const registrationDate = new Date().toLocaleDateString("en-US", {
|
|
80
|
+
weekday: "long",
|
|
81
|
+
year: "numeric",
|
|
82
|
+
month: "long",
|
|
83
|
+
day: "numeric",
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
// Dashboard URL
|
|
87
|
+
const dashboardUrl =
|
|
88
|
+
data.options?.dashboardUrl || this.DEFAULT_DASHBOARD_URL;
|
|
89
|
+
|
|
90
|
+
// Support email
|
|
91
|
+
const supportEmail =
|
|
92
|
+
data.options?.supportEmail || this.DEFAULT_SUPPORT_EMAIL;
|
|
93
|
+
|
|
94
|
+
// Subject line
|
|
95
|
+
const subject = data.options?.customSubject || this.DEFAULT_SUBJECT;
|
|
96
|
+
|
|
97
|
+
// Determine 'from' address
|
|
98
|
+
const fromAddress =
|
|
99
|
+
data.options?.fromAddress ||
|
|
100
|
+
`Metaesthetics <no-reply@${
|
|
101
|
+
data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN
|
|
102
|
+
}>`;
|
|
103
|
+
|
|
104
|
+
// Current year for copyright
|
|
105
|
+
const currentYear = new Date().getFullYear().toString();
|
|
106
|
+
|
|
107
|
+
// Prepare template variables
|
|
108
|
+
const templateVariables = {
|
|
109
|
+
adminName: data.admin.name,
|
|
110
|
+
adminEmail: data.admin.email,
|
|
111
|
+
clinicGroupName: data.clinicGroup.name,
|
|
112
|
+
registrationDate,
|
|
113
|
+
dashboardUrl,
|
|
114
|
+
supportEmail,
|
|
115
|
+
currentYear,
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// Debug log for template variables
|
|
119
|
+
Logger.info("[ClinicWelcomeMailingService] Template variables:", {
|
|
120
|
+
adminName: templateVariables.adminName,
|
|
121
|
+
adminEmail: templateVariables.adminEmail,
|
|
122
|
+
clinicGroupName: templateVariables.clinicGroupName,
|
|
123
|
+
dashboardUrl: templateVariables.dashboardUrl,
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
// Render HTML email
|
|
127
|
+
const html = this.renderTemplate(clinicWelcomeTemplate, templateVariables);
|
|
128
|
+
|
|
129
|
+
// Data for the sendEmail method
|
|
130
|
+
const mailgunSendData = {
|
|
131
|
+
to: data.admin.email,
|
|
132
|
+
from: fromAddress,
|
|
133
|
+
subject,
|
|
134
|
+
html,
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Determine the domain to use for sending
|
|
138
|
+
const domainToSendFrom =
|
|
139
|
+
data.options?.mailgunDomain || this.DEFAULT_MAILGUN_DOMAIN;
|
|
140
|
+
|
|
141
|
+
Logger.info("[ClinicWelcomeMailingService] Sending email with data:", {
|
|
142
|
+
domain: domainToSendFrom,
|
|
143
|
+
to: mailgunSendData.to,
|
|
144
|
+
from: mailgunSendData.from,
|
|
145
|
+
subject: mailgunSendData.subject,
|
|
146
|
+
hasHtml: !!mailgunSendData.html,
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// Call the sendEmail method from BaseMailingService
|
|
150
|
+
const result = await this.sendEmail(domainToSendFrom, mailgunSendData);
|
|
151
|
+
|
|
152
|
+
// Log success
|
|
153
|
+
await this.logEmailAttempt(
|
|
154
|
+
{
|
|
155
|
+
to: data.admin.email,
|
|
156
|
+
subject,
|
|
157
|
+
templateName: "clinic_welcome",
|
|
158
|
+
},
|
|
159
|
+
true
|
|
160
|
+
);
|
|
161
|
+
|
|
162
|
+
return result;
|
|
163
|
+
} catch (error: any) {
|
|
164
|
+
Logger.error(
|
|
165
|
+
"[ClinicWelcomeMailingService] Error sending welcome email:",
|
|
166
|
+
{
|
|
167
|
+
errorMessage: error.message,
|
|
168
|
+
errorDetails: error.details,
|
|
169
|
+
errorStatus: error.status,
|
|
170
|
+
stack: error.stack,
|
|
171
|
+
}
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
// Log failure
|
|
175
|
+
await this.logEmailAttempt(
|
|
176
|
+
{
|
|
177
|
+
to: data.admin.email,
|
|
178
|
+
subject: data.options?.customSubject || this.DEFAULT_SUBJECT,
|
|
179
|
+
templateName: "clinic_welcome",
|
|
180
|
+
},
|
|
181
|
+
false,
|
|
182
|
+
error
|
|
183
|
+
);
|
|
184
|
+
|
|
185
|
+
throw error;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Handles the clinic group creation event from Cloud Functions.
|
|
191
|
+
* Fetches necessary data and sends the welcome email to the admin.
|
|
192
|
+
* @param clinicGroupData - The clinic group data including id
|
|
193
|
+
* @param mailgunConfig - Mailgun configuration (from, domain)
|
|
194
|
+
* @returns Promise resolved when the email is sent
|
|
195
|
+
*/
|
|
196
|
+
async handleClinicGroupCreationEvent(
|
|
197
|
+
clinicGroupData: ClinicGroup & { id: string },
|
|
198
|
+
mailgunConfig: {
|
|
199
|
+
fromAddress: string;
|
|
200
|
+
domain: string;
|
|
201
|
+
dashboardUrl?: string;
|
|
202
|
+
supportEmail?: string;
|
|
203
|
+
}
|
|
204
|
+
): Promise<void> {
|
|
205
|
+
try {
|
|
206
|
+
Logger.info(
|
|
207
|
+
"[ClinicWelcomeMailingService] Handling clinic group creation event for:",
|
|
208
|
+
clinicGroupData.id
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
// Validate clinic group data
|
|
212
|
+
if (!clinicGroupData || !clinicGroupData.id) {
|
|
213
|
+
throw new Error(
|
|
214
|
+
`Invalid clinic group data: Missing required properties.`
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Validate contact person
|
|
219
|
+
if (!clinicGroupData.contactPerson) {
|
|
220
|
+
throw new Error(
|
|
221
|
+
`Clinic group ${clinicGroupData.id} is missing contactPerson`
|
|
222
|
+
);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
if (!clinicGroupData.contactPerson.email) {
|
|
226
|
+
throw new Error(
|
|
227
|
+
`Clinic group ${clinicGroupData.id} is missing admin email`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Get admin name from contact person
|
|
232
|
+
const adminName = `${clinicGroupData.contactPerson.firstName || ""} ${
|
|
233
|
+
clinicGroupData.contactPerson.lastName || ""
|
|
234
|
+
}`.trim() || "Clinic Admin";
|
|
235
|
+
|
|
236
|
+
const adminEmail = clinicGroupData.contactPerson.email;
|
|
237
|
+
|
|
238
|
+
Logger.info(
|
|
239
|
+
`[ClinicWelcomeMailingService] Sending welcome email to admin: ${adminName} (${adminEmail})`
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
// Validate fromAddress
|
|
243
|
+
if (!mailgunConfig.fromAddress) {
|
|
244
|
+
Logger.warn(
|
|
245
|
+
"[ClinicWelcomeMailingService] No fromAddress provided, using default"
|
|
246
|
+
);
|
|
247
|
+
mailgunConfig.fromAddress = `Metaesthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Prepare email data
|
|
251
|
+
const emailData: ClinicWelcomeEmailData = {
|
|
252
|
+
admin: {
|
|
253
|
+
name: adminName,
|
|
254
|
+
email: adminEmail,
|
|
255
|
+
},
|
|
256
|
+
clinicGroup: {
|
|
257
|
+
id: clinicGroupData.id,
|
|
258
|
+
name: clinicGroupData.name || "Your Clinic",
|
|
259
|
+
},
|
|
260
|
+
options: {
|
|
261
|
+
fromAddress: mailgunConfig.fromAddress,
|
|
262
|
+
mailgunDomain: mailgunConfig.domain,
|
|
263
|
+
dashboardUrl: mailgunConfig.dashboardUrl,
|
|
264
|
+
supportEmail: mailgunConfig.supportEmail,
|
|
265
|
+
},
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
Logger.info(
|
|
269
|
+
"[ClinicWelcomeMailingService] Email data prepared, sending welcome email"
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
// Send the welcome email
|
|
273
|
+
await this.sendWelcomeEmail(emailData);
|
|
274
|
+
|
|
275
|
+
Logger.info(
|
|
276
|
+
"[ClinicWelcomeMailingService] Welcome email sent successfully"
|
|
277
|
+
);
|
|
278
|
+
} catch (error: any) {
|
|
279
|
+
Logger.error(
|
|
280
|
+
"[ClinicWelcomeMailingService] Error handling clinic group creation event:",
|
|
281
|
+
{
|
|
282
|
+
errorMessage: error.message,
|
|
283
|
+
errorDetails: error.details,
|
|
284
|
+
errorStatus: error.status,
|
|
285
|
+
stack: error.stack,
|
|
286
|
+
clinicGroupId: clinicGroupData?.id,
|
|
287
|
+
}
|
|
288
|
+
);
|
|
289
|
+
throw error;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./clinicWelcome.mailing";
|
|
1
|
+
export * from "./clinicWelcome.mailing";
|