@zssz-soft/firebase-functions-shared 1.2.16 → 1.4.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/lib/config/app.config.d.ts +6 -0
- package/lib/config/app.config.d.ts.map +1 -1
- package/lib/config/app.config.js.map +1 -1
- package/lib/index.d.ts +3 -0
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +3 -0
- package/lib/index.js.map +1 -1
- package/lib/modules/booking/booking-email.templates.d.ts +52 -0
- package/lib/modules/booking/booking-email.templates.d.ts.map +1 -1
- package/lib/modules/booking/booking-email.templates.js +768 -0
- package/lib/modules/booking/booking-email.templates.js.map +1 -1
- package/lib/modules/booking/booking-email.triggers.d.ts.map +1 -1
- package/lib/modules/booking/booking-email.triggers.js +22 -5
- package/lib/modules/booking/booking-email.triggers.js.map +1 -1
- package/lib/modules/email/email.d.ts.map +1 -1
- package/lib/modules/email/email.js +11 -2
- package/lib/modules/email/email.js.map +1 -1
- package/lib/modules/error-reporting/error-reporter.d.ts +97 -0
- package/lib/modules/error-reporting/error-reporter.d.ts.map +1 -0
- package/lib/modules/error-reporting/error-reporter.js +156 -0
- package/lib/modules/error-reporting/error-reporter.js.map +1 -0
- package/lib/modules/error-reporting/index.d.ts +7 -0
- package/lib/modules/error-reporting/index.d.ts.map +1 -0
- package/lib/modules/error-reporting/index.js +23 -0
- package/lib/modules/error-reporting/index.js.map +1 -0
- package/lib/modules/events/booking-event.handlers.d.ts +44 -0
- package/lib/modules/events/booking-event.handlers.d.ts.map +1 -0
- package/lib/modules/events/booking-event.handlers.js +274 -0
- package/lib/modules/events/booking-event.handlers.js.map +1 -0
- package/lib/modules/events/booking-event.models.d.ts +109 -0
- package/lib/modules/events/booking-event.models.d.ts.map +1 -0
- package/lib/modules/events/booking-event.models.js +110 -0
- package/lib/modules/events/booking-event.models.js.map +1 -0
- package/lib/modules/events/booking-event.triggers.d.ts +46 -0
- package/lib/modules/events/booking-event.triggers.d.ts.map +1 -0
- package/lib/modules/events/booking-event.triggers.js +178 -0
- package/lib/modules/events/booking-event.triggers.js.map +1 -0
- package/lib/modules/events/event.models.d.ts +53 -0
- package/lib/modules/events/event.models.d.ts.map +1 -0
- package/lib/modules/events/event.models.js +18 -0
- package/lib/modules/events/event.models.js.map +1 -0
- package/lib/modules/events/index.d.ts +29 -0
- package/lib/modules/events/index.d.ts.map +1 -0
- package/lib/modules/events/index.js +49 -0
- package/lib/modules/events/index.js.map +1 -0
- package/lib/modules/health/health-check.d.ts +33 -0
- package/lib/modules/health/health-check.d.ts.map +1 -0
- package/lib/modules/health/health-check.js +142 -0
- package/lib/modules/health/health-check.js.map +1 -0
- package/lib/modules/health/index.d.ts +7 -0
- package/lib/modules/health/index.d.ts.map +1 -0
- package/lib/modules/health/index.js +23 -0
- package/lib/modules/health/index.js.map +1 -0
- package/lib/modules/user/user-auth.triggers.d.ts.map +1 -1
- package/lib/modules/user/user-auth.triggers.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Booking Event Handlers (Eventarc Subscribers)
|
|
4
|
+
*
|
|
5
|
+
* Subscribes to booking events published by booking-event.triggers.ts
|
|
6
|
+
* and handles email notifications based on the event type.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - Single handler subscribes to all booking events (wildcard pattern)
|
|
10
|
+
* - NotificationMatrix determines what emails to send for each event
|
|
11
|
+
* - Template generators produce bilingual email content
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.createBookingEmailHandlers = createBookingEmailHandlers;
|
|
15
|
+
const firebase_functions_1 = require("firebase-functions");
|
|
16
|
+
const eventarc_1 = require("firebase-functions/v2/eventarc");
|
|
17
|
+
const email_service_1 = require("../email/email.service");
|
|
18
|
+
const email_validator_1 = require("../email/email.validator");
|
|
19
|
+
const error_reporting_1 = require("../error-reporting");
|
|
20
|
+
const booking_email_templates_1 = require("../booking/booking-email.templates");
|
|
21
|
+
const booking_event_models_1 = require("./booking-event.models");
|
|
22
|
+
/**
|
|
23
|
+
* Notification matrix - maps event types to notification configuration
|
|
24
|
+
*/
|
|
25
|
+
const NotificationMatrix = {
|
|
26
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_SUBMITTED]: {
|
|
27
|
+
sendToGuest: true,
|
|
28
|
+
sendToAdmin: true,
|
|
29
|
+
guestTemplate: booking_email_templates_1.generateGuestConfirmationEmail,
|
|
30
|
+
adminTemplate: booking_email_templates_1.generateAdminNotificationEmail,
|
|
31
|
+
},
|
|
32
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_APPROVED]: {
|
|
33
|
+
sendToGuest: true,
|
|
34
|
+
sendToAdmin: false,
|
|
35
|
+
guestTemplate: booking_email_templates_1.generateBookingApprovedEmail,
|
|
36
|
+
},
|
|
37
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_READY]: {
|
|
38
|
+
sendToGuest: true,
|
|
39
|
+
sendToAdmin: false,
|
|
40
|
+
guestTemplate: booking_email_templates_1.generateBookingReadyEmail,
|
|
41
|
+
},
|
|
42
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_REJECTED]: {
|
|
43
|
+
sendToGuest: true,
|
|
44
|
+
sendToAdmin: false,
|
|
45
|
+
guestTemplate: booking_email_templates_1.generateBookingRejectedEmail,
|
|
46
|
+
},
|
|
47
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_COMPLETED]: {
|
|
48
|
+
sendToGuest: true,
|
|
49
|
+
sendToAdmin: false,
|
|
50
|
+
guestTemplate: booking_email_templates_1.generateBookingCompletedEmail,
|
|
51
|
+
},
|
|
52
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_CANCELLED]: {
|
|
53
|
+
sendToGuest: true,
|
|
54
|
+
sendToAdmin: true,
|
|
55
|
+
guestTemplate: booking_email_templates_1.generateBookingCancelledEmail,
|
|
56
|
+
adminTemplate: booking_email_templates_1.generateBookingCancelledEmail, // Same template, different recipient
|
|
57
|
+
},
|
|
58
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_USER_CANCELLED]: {
|
|
59
|
+
sendToGuest: true,
|
|
60
|
+
sendToAdmin: true,
|
|
61
|
+
guestTemplate: booking_email_templates_1.generateBookingCancelledEmail,
|
|
62
|
+
adminTemplate: booking_email_templates_1.generateBookingCancelledEmail,
|
|
63
|
+
},
|
|
64
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_INSTANT_CONFIRMED]: {
|
|
65
|
+
sendToGuest: true,
|
|
66
|
+
sendToAdmin: true,
|
|
67
|
+
guestTemplate: booking_email_templates_1.generateVipConfirmationEmail,
|
|
68
|
+
adminTemplate: booking_email_templates_1.generateVipStaffNotificationEmail,
|
|
69
|
+
},
|
|
70
|
+
[booking_event_models_1.BookingEventTypes.BOOKING_VIP_CANCELLED]: {
|
|
71
|
+
sendToGuest: true,
|
|
72
|
+
sendToAdmin: true,
|
|
73
|
+
guestTemplate: booking_email_templates_1.generateBookingCancelledEmail,
|
|
74
|
+
adminTemplate: booking_email_templates_1.generateBookingCancelledEmail,
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Get admin/owner email from booking data or config fallback
|
|
79
|
+
*/
|
|
80
|
+
function getAdminEmail(booking, cfg) {
|
|
81
|
+
var _a, _b;
|
|
82
|
+
// Try accommodation contact email first
|
|
83
|
+
const contactEmail = (_b = (_a = booking.accommodation) === null || _a === void 0 ? void 0 : _a.contact) === null || _b === void 0 ? void 0 : _b.email;
|
|
84
|
+
if (contactEmail && (0, email_validator_1.validateEmail)(contactEmail)) {
|
|
85
|
+
return contactEmail;
|
|
86
|
+
}
|
|
87
|
+
// Fallback to configured admin email
|
|
88
|
+
if (cfg.fallbackAdminEmail && (0, email_validator_1.validateEmail)(cfg.fallbackAdminEmail)) {
|
|
89
|
+
return cfg.fallbackAdminEmail;
|
|
90
|
+
}
|
|
91
|
+
// Try environment variable as last resort
|
|
92
|
+
const envAdminEmail = process.env.ADMIN_NOTIFICATION_EMAIL;
|
|
93
|
+
if (envAdminEmail && (0, email_validator_1.validateEmail)(envAdminEmail)) {
|
|
94
|
+
return envAdminEmail;
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Create booking email event handlers
|
|
100
|
+
*
|
|
101
|
+
* @param config - Configuration options
|
|
102
|
+
* @returns Object containing event handler functions
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const handlers = createBookingEmailHandlers({ region: 'europe-west1' });
|
|
107
|
+
* export const onBookingEmailHandler = handlers.onBookingEvent;
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
function createBookingEmailHandlers(config = {}) {
|
|
111
|
+
const cfg = Object.assign(Object.assign({}, booking_event_models_1.DEFAULT_BOOKING_EVENT_CONFIG), config);
|
|
112
|
+
const errorReporter = (0, error_reporting_1.createErrorReporter)('BookingEmailHandler');
|
|
113
|
+
/**
|
|
114
|
+
* Send email using the email service
|
|
115
|
+
*/
|
|
116
|
+
async function sendEmail(to, template, booking, context) {
|
|
117
|
+
try {
|
|
118
|
+
const email = template(booking, context);
|
|
119
|
+
const result = await email_service_1.emailService.sendEmail({
|
|
120
|
+
to,
|
|
121
|
+
subject: email.subject,
|
|
122
|
+
html: email.html,
|
|
123
|
+
text: email.text,
|
|
124
|
+
});
|
|
125
|
+
return result.success;
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
firebase_functions_1.logger.error(`[EmailHandler] Failed to send email to ${to}`, error);
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Handle a booking event and send appropriate notifications
|
|
134
|
+
*/
|
|
135
|
+
async function handleBookingEvent(eventType, payload) {
|
|
136
|
+
var _a, _b;
|
|
137
|
+
const notificationConfig = NotificationMatrix[eventType];
|
|
138
|
+
if (!notificationConfig) {
|
|
139
|
+
firebase_functions_1.logger.info(`[EmailHandler] No notification config for event: ${eventType}`);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const { booking, bookingId, context } = payload;
|
|
143
|
+
firebase_functions_1.logger.info(`[EmailHandler] Processing ${eventType} for booking ${bookingId}`, {
|
|
144
|
+
guestEmail: (_a = booking.guest) === null || _a === void 0 ? void 0 : _a.email,
|
|
145
|
+
sendToGuest: notificationConfig.sendToGuest,
|
|
146
|
+
sendToAdmin: notificationConfig.sendToAdmin,
|
|
147
|
+
});
|
|
148
|
+
// Send guest email
|
|
149
|
+
if (notificationConfig.sendToGuest && notificationConfig.guestTemplate) {
|
|
150
|
+
const guestEmail = (_b = booking.guest) === null || _b === void 0 ? void 0 : _b.email;
|
|
151
|
+
if (guestEmail && (0, email_validator_1.validateEmail)(guestEmail)) {
|
|
152
|
+
try {
|
|
153
|
+
const success = await sendEmail(guestEmail, notificationConfig.guestTemplate, booking, context);
|
|
154
|
+
if (success) {
|
|
155
|
+
firebase_functions_1.logger.info(`[EmailHandler] Guest email sent for ${eventType}: ${bookingId}`);
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
errorReporter.warn(new Error('Guest email send returned false'), {
|
|
159
|
+
requestId: bookingId,
|
|
160
|
+
metadata: { type: 'guest_email_failed', eventType, email: guestEmail },
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
errorReporter.report(error, {
|
|
166
|
+
requestId: bookingId,
|
|
167
|
+
metadata: { type: 'guest_email_error', eventType, email: guestEmail },
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
firebase_functions_1.logger.warn(`[EmailHandler] Invalid or missing guest email for booking ${bookingId}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
// Send admin email
|
|
176
|
+
if (cfg.adminNotificationEnabled &&
|
|
177
|
+
notificationConfig.sendToAdmin &&
|
|
178
|
+
notificationConfig.adminTemplate) {
|
|
179
|
+
const adminEmail = getAdminEmail(booking, cfg);
|
|
180
|
+
if (adminEmail) {
|
|
181
|
+
try {
|
|
182
|
+
const success = await sendEmail(adminEmail, notificationConfig.adminTemplate, booking, context);
|
|
183
|
+
if (success) {
|
|
184
|
+
firebase_functions_1.logger.info(`[EmailHandler] Admin email sent for ${eventType}: ${bookingId}`);
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
errorReporter.warn(new Error('Admin email send returned false'), {
|
|
188
|
+
requestId: bookingId,
|
|
189
|
+
metadata: { type: 'admin_email_failed', eventType, email: adminEmail },
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
errorReporter.report(error, {
|
|
195
|
+
requestId: bookingId,
|
|
196
|
+
metadata: { type: 'admin_email_error', eventType, email: adminEmail },
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
firebase_functions_1.logger.warn(`[EmailHandler] No admin email available for booking ${bookingId}`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
/**
|
|
207
|
+
* Universal handler for all booking events
|
|
208
|
+
*
|
|
209
|
+
* Subscribes to com.lodgeflow.booking.* events and routes to appropriate
|
|
210
|
+
* email templates based on the event type.
|
|
211
|
+
*/
|
|
212
|
+
onBookingEvent: (0, eventarc_1.onCustomEventPublished)({
|
|
213
|
+
eventType: 'com.lodgeflow.booking.*',
|
|
214
|
+
channel: cfg.eventChannel,
|
|
215
|
+
region: cfg.region,
|
|
216
|
+
maxInstances: cfg.maxInstances,
|
|
217
|
+
}, async (event) => {
|
|
218
|
+
const eventType = event.type;
|
|
219
|
+
const payload = event.data;
|
|
220
|
+
if (!payload || !payload.booking || !payload.bookingId) {
|
|
221
|
+
firebase_functions_1.logger.warn(`[EmailHandler] Invalid event payload for ${eventType}`);
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
await handleBookingEvent(eventType, payload);
|
|
225
|
+
}),
|
|
226
|
+
/**
|
|
227
|
+
* Individual handlers for specific event types (alternative approach)
|
|
228
|
+
* Use these if you need different scaling/configuration per event type
|
|
229
|
+
*/
|
|
230
|
+
onBookingSubmitted: (0, eventarc_1.onCustomEventPublished)({
|
|
231
|
+
eventType: booking_event_models_1.BookingEventTypes.BOOKING_SUBMITTED,
|
|
232
|
+
channel: cfg.eventChannel,
|
|
233
|
+
region: cfg.region,
|
|
234
|
+
}, async (event) => {
|
|
235
|
+
await handleBookingEvent(event.type, event.data);
|
|
236
|
+
}),
|
|
237
|
+
onBookingApproved: (0, eventarc_1.onCustomEventPublished)({
|
|
238
|
+
eventType: booking_event_models_1.BookingEventTypes.BOOKING_APPROVED,
|
|
239
|
+
channel: cfg.eventChannel,
|
|
240
|
+
region: cfg.region,
|
|
241
|
+
}, async (event) => {
|
|
242
|
+
await handleBookingEvent(event.type, event.data);
|
|
243
|
+
}),
|
|
244
|
+
onBookingReady: (0, eventarc_1.onCustomEventPublished)({
|
|
245
|
+
eventType: booking_event_models_1.BookingEventTypes.BOOKING_READY,
|
|
246
|
+
channel: cfg.eventChannel,
|
|
247
|
+
region: cfg.region,
|
|
248
|
+
}, async (event) => {
|
|
249
|
+
await handleBookingEvent(event.type, event.data);
|
|
250
|
+
}),
|
|
251
|
+
onBookingRejected: (0, eventarc_1.onCustomEventPublished)({
|
|
252
|
+
eventType: booking_event_models_1.BookingEventTypes.BOOKING_REJECTED,
|
|
253
|
+
channel: cfg.eventChannel,
|
|
254
|
+
region: cfg.region,
|
|
255
|
+
}, async (event) => {
|
|
256
|
+
await handleBookingEvent(event.type, event.data);
|
|
257
|
+
}),
|
|
258
|
+
onBookingCompleted: (0, eventarc_1.onCustomEventPublished)({
|
|
259
|
+
eventType: booking_event_models_1.BookingEventTypes.BOOKING_COMPLETED,
|
|
260
|
+
channel: cfg.eventChannel,
|
|
261
|
+
region: cfg.region,
|
|
262
|
+
}, async (event) => {
|
|
263
|
+
await handleBookingEvent(event.type, event.data);
|
|
264
|
+
}),
|
|
265
|
+
onBookingCancelled: (0, eventarc_1.onCustomEventPublished)({
|
|
266
|
+
eventType: booking_event_models_1.BookingEventTypes.BOOKING_CANCELLED,
|
|
267
|
+
channel: cfg.eventChannel,
|
|
268
|
+
region: cfg.region,
|
|
269
|
+
}, async (event) => {
|
|
270
|
+
await handleBookingEvent(event.type, event.data);
|
|
271
|
+
}),
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=booking-event.handlers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-event.handlers.js","sourceRoot":"","sources":["../../../src/modules/events/booking-event.handlers.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;AA6IH,gEAwNC;AAnWD,2DAA4C;AAC5C,6DAAwE;AACxE,0DAAsD;AACtD,8DAAyD;AACzD,wDAAyD;AAEzD,gFAU4C;AAC5C,iEAMgC;AAwBhC;;GAEG;AACH,MAAM,kBAAkB,GAAuC;IAC7D,CAAC,wCAAiB,CAAC,iBAAiB,CAAC,EAAE;QACrC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,wDAA8B;QAC7C,aAAa,EAAE,wDAA8B;KAC9C;IACD,CAAC,wCAAiB,CAAC,gBAAgB,CAAC,EAAE;QACpC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,sDAA4B;KAC5C;IACD,CAAC,wCAAiB,CAAC,aAAa,CAAC,EAAE;QACjC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,mDAAyB;KACzC;IACD,CAAC,wCAAiB,CAAC,gBAAgB,CAAC,EAAE;QACpC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,sDAA4B;KAC5C;IACD,CAAC,wCAAiB,CAAC,iBAAiB,CAAC,EAAE;QACrC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,KAAK;QAClB,aAAa,EAAE,uDAA6B;KAC7C;IACD,CAAC,wCAAiB,CAAC,iBAAiB,CAAC,EAAE;QACrC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,uDAA6B;QAC5C,aAAa,EAAE,uDAA6B,EAAE,qCAAqC;KACpF;IACD,CAAC,wCAAiB,CAAC,sBAAsB,CAAC,EAAE;QAC1C,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,uDAA6B;QAC5C,aAAa,EAAE,uDAA6B;KAC7C;IACD,CAAC,wCAAiB,CAAC,yBAAyB,CAAC,EAAE;QAC7C,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,sDAA4B;QAC3C,aAAa,EAAE,2DAAiC;KACjD;IACD,CAAC,wCAAiB,CAAC,qBAAqB,CAAC,EAAE;QACzC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,IAAI;QACjB,aAAa,EAAE,uDAA6B;QAC5C,aAAa,EAAE,uDAA6B;KAC7C;CACF,CAAC;AAEF;;GAEG;AACH,SAAS,aAAa,CAAC,OAAyB,EAAE,GAAuB;;IACvE,wCAAwC;IACxC,MAAM,YAAY,GAAG,MAAA,MAAA,OAAO,CAAC,aAAa,0CAAE,OAAO,0CAAE,KAAK,CAAC;IAC3D,IAAI,YAAY,IAAI,IAAA,+BAAa,EAAC,YAAY,CAAC,EAAE,CAAC;QAChD,OAAO,YAAY,CAAC;IACtB,CAAC;IAED,qCAAqC;IACrC,IAAI,GAAG,CAAC,kBAAkB,IAAI,IAAA,+BAAa,EAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpE,OAAO,GAAG,CAAC,kBAAkB,CAAC;IAChC,CAAC;IAED,0CAA0C;IAC1C,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;IAC3D,IAAI,aAAa,IAAI,IAAA,+BAAa,EAAC,aAAa,CAAC,EAAE,CAAC;QAClD,OAAO,aAAa,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,0BAA0B,CAAC,SAAsC,EAAE;IACjF,MAAM,GAAG,mCAA4B,mDAA4B,GAAK,MAAM,CAAE,CAAC;IAC/E,MAAM,aAAa,GAAG,IAAA,qCAAmB,EAAC,qBAAqB,CAAC,CAAC;IAEjE;;OAEG;IACH,KAAK,UAAU,SAAS,CACtB,EAAU,EACV,QAA2B,EAC3B,OAAyB,EACzB,OAA6B;QAE7B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,MAAM,4BAAY,CAAC,SAAS,CAAC;gBAC1C,EAAE;gBACF,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;aACjB,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2BAAM,CAAC,KAAK,CAAC,0CAA0C,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,UAAU,kBAAkB,CAC/B,SAAiB,EACjB,OAA4B;;QAE5B,MAAM,kBAAkB,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;QAEzD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACxB,2BAAM,CAAC,IAAI,CAAC,oDAAoD,SAAS,EAAE,CAAC,CAAC;YAC7E,OAAO;QACT,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAEhD,2BAAM,CAAC,IAAI,CAAC,6BAA6B,SAAS,gBAAgB,SAAS,EAAE,EAAE;YAC7E,UAAU,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,KAAK;YAChC,WAAW,EAAE,kBAAkB,CAAC,WAAW;YAC3C,WAAW,EAAE,kBAAkB,CAAC,WAAW;SAC5C,CAAC,CAAC;QAEH,mBAAmB;QACnB,IAAI,kBAAkB,CAAC,WAAW,IAAI,kBAAkB,CAAC,aAAa,EAAE,CAAC;YACvE,MAAM,UAAU,GAAG,MAAA,OAAO,CAAC,KAAK,0CAAE,KAAK,CAAC;YAExC,IAAI,UAAU,IAAI,IAAA,+BAAa,EAAC,UAAU,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAC7B,UAAU,EACV,kBAAkB,CAAC,aAAa,EAChC,OAAO,EACP,OAAO,CACR,CAAC;oBAEF,IAAI,OAAO,EAAE,CAAC;wBACZ,2BAAM,CAAC,IAAI,CAAC,uCAAuC,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC;oBAChF,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,EAAE;4BAC/D,SAAS,EAAE,SAAS;4BACpB,QAAQ,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;yBACvE,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE;wBAC1B,SAAS,EAAE,SAAS;wBACpB,QAAQ,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;qBACtE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,2BAAM,CAAC,IAAI,CAAC,6DAA6D,SAAS,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC;QAED,mBAAmB;QACnB,IACE,GAAG,CAAC,wBAAwB;YAC5B,kBAAkB,CAAC,WAAW;YAC9B,kBAAkB,CAAC,aAAa,EAChC,CAAC;YACD,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAE/C,IAAI,UAAU,EAAE,CAAC;gBACf,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,SAAS,CAC7B,UAAU,EACV,kBAAkB,CAAC,aAAa,EAChC,OAAO,EACP,OAAO,CACR,CAAC;oBAEF,IAAI,OAAO,EAAE,CAAC;wBACZ,2BAAM,CAAC,IAAI,CAAC,uCAAuC,SAAS,KAAK,SAAS,EAAE,CAAC,CAAC;oBAChF,CAAC;yBAAM,CAAC;wBACN,aAAa,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,EAAE;4BAC/D,SAAS,EAAE,SAAS;4BACpB,QAAQ,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;yBACvE,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE;wBAC1B,SAAS,EAAE,SAAS;wBACpB,QAAQ,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE;qBACtE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,2BAAM,CAAC,IAAI,CAAC,uDAAuD,SAAS,EAAE,CAAC,CAAC;YAClF,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL;;;;;WAKG;QACH,cAAc,EAAE,IAAA,iCAAsB,EACpC;YACE,SAAS,EAAE,yBAAyB;YACpC,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;YAClB,YAAY,EAAE,GAAG,CAAC,YAAY;SAC/B,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;YAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAA2B,CAAC;YAElD,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;gBACvD,2BAAM,CAAC,IAAI,CAAC,4CAA4C,SAAS,EAAE,CAAC,CAAC;gBACrE,OAAO;YACT,CAAC;YAED,MAAM,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC,CACF;QAED;;;WAGG;QACH,kBAAkB,EAAE,IAAA,iCAAsB,EACxC;YACE,SAAS,EAAE,wCAAiB,CAAC,iBAAiB;YAC9C,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAA2B,CAAC,CAAC;QAC1E,CAAC,CACF;QAED,iBAAiB,EAAE,IAAA,iCAAsB,EACvC;YACE,SAAS,EAAE,wCAAiB,CAAC,gBAAgB;YAC7C,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAA2B,CAAC,CAAC;QAC1E,CAAC,CACF;QAED,cAAc,EAAE,IAAA,iCAAsB,EACpC;YACE,SAAS,EAAE,wCAAiB,CAAC,aAAa;YAC1C,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAA2B,CAAC,CAAC;QAC1E,CAAC,CACF;QAED,iBAAiB,EAAE,IAAA,iCAAsB,EACvC;YACE,SAAS,EAAE,wCAAiB,CAAC,gBAAgB;YAC7C,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAA2B,CAAC,CAAC;QAC1E,CAAC,CACF;QAED,kBAAkB,EAAE,IAAA,iCAAsB,EACxC;YACE,SAAS,EAAE,wCAAiB,CAAC,iBAAiB;YAC9C,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAA2B,CAAC,CAAC;QAC1E,CAAC,CACF;QAED,kBAAkB,EAAE,IAAA,iCAAsB,EACxC;YACE,SAAS,EAAE,wCAAiB,CAAC,iBAAiB;YAC9C,OAAO,EAAE,GAAG,CAAC,YAAY;YACzB,MAAM,EAAE,GAAG,CAAC,MAAM;SACnB,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAA2B,CAAC,CAAC;QAC1E,CAAC,CACF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Booking Event Models
|
|
3
|
+
*
|
|
4
|
+
* Event types and payloads for booking workflow transitions.
|
|
5
|
+
* Used by Eventarc publishers and subscribers.
|
|
6
|
+
*/
|
|
7
|
+
import { BookingEmailData, BookingEmailConfig } from '../booking/booking-email.models';
|
|
8
|
+
/**
|
|
9
|
+
* All booking workflow transition event types
|
|
10
|
+
*
|
|
11
|
+
* Naming convention: com.lodgeflow.booking.{action}
|
|
12
|
+
*/
|
|
13
|
+
export declare const BookingEventTypes: {
|
|
14
|
+
/** draft → pending_approval: New booking submitted for approval */
|
|
15
|
+
readonly BOOKING_SUBMITTED: "com.lodgeflow.booking.submitted";
|
|
16
|
+
/** pending_approval → confirmed: Admin approved the booking */
|
|
17
|
+
readonly BOOKING_APPROVED: "com.lodgeflow.booking.approved";
|
|
18
|
+
/** confirmed → ready: All conditions met for check-in */
|
|
19
|
+
readonly BOOKING_READY: "com.lodgeflow.booking.ready";
|
|
20
|
+
/** pending_approval → cancelled: Admin rejected the booking */
|
|
21
|
+
readonly BOOKING_REJECTED: "com.lodgeflow.booking.rejected";
|
|
22
|
+
/** ready → completed: Guest checked out */
|
|
23
|
+
readonly BOOKING_COMPLETED: "com.lodgeflow.booking.completed";
|
|
24
|
+
/** confirmed/ready → cancelled: Admin cancelled the booking */
|
|
25
|
+
readonly BOOKING_CANCELLED: "com.lodgeflow.booking.cancelled";
|
|
26
|
+
/** pending_approval/confirmed → cancelled: User cancelled their booking */
|
|
27
|
+
readonly BOOKING_USER_CANCELLED: "com.lodgeflow.booking.user_cancelled";
|
|
28
|
+
/** draft → confirmed: Instant VIP confirmation */
|
|
29
|
+
readonly BOOKING_INSTANT_CONFIRMED: "com.lodgeflow.booking.instant_confirmed";
|
|
30
|
+
/** VIP booking cancelled */
|
|
31
|
+
readonly BOOKING_VIP_CANCELLED: "com.lodgeflow.booking.vip_cancelled";
|
|
32
|
+
};
|
|
33
|
+
export type BookingEventType = (typeof BookingEventTypes)[keyof typeof BookingEventTypes];
|
|
34
|
+
/**
|
|
35
|
+
* Transition context for workflow events
|
|
36
|
+
*/
|
|
37
|
+
export interface TransitionInfo {
|
|
38
|
+
/** Workflow transition identifier */
|
|
39
|
+
transitionId: string;
|
|
40
|
+
/** Previous workflow state */
|
|
41
|
+
from: string;
|
|
42
|
+
/** New workflow state */
|
|
43
|
+
to: string;
|
|
44
|
+
/** User ID who triggered the transition */
|
|
45
|
+
triggeredBy: string;
|
|
46
|
+
/** ISO timestamp when transition occurred */
|
|
47
|
+
triggeredAt: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Additional context for specific event types
|
|
51
|
+
*/
|
|
52
|
+
export interface BookingEventContext {
|
|
53
|
+
/** Reason for rejection or cancellation */
|
|
54
|
+
reason?: string;
|
|
55
|
+
/** Refund amount for cancellations */
|
|
56
|
+
refundAmount?: number;
|
|
57
|
+
/** Whether this is a VIP booking */
|
|
58
|
+
isVip?: boolean;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Payload for booking workflow events
|
|
62
|
+
*/
|
|
63
|
+
export interface BookingEventPayload {
|
|
64
|
+
/** Booking document ID */
|
|
65
|
+
bookingId: string;
|
|
66
|
+
/** Full booking data */
|
|
67
|
+
booking: BookingEmailData;
|
|
68
|
+
/** Workflow transition details */
|
|
69
|
+
transition: TransitionInfo;
|
|
70
|
+
/** Additional context (rejection reason, refund, etc.) */
|
|
71
|
+
context?: BookingEventContext;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Mapping from workflow transition IDs to event types
|
|
75
|
+
*
|
|
76
|
+
* Used to determine which event to publish based on the transition
|
|
77
|
+
*/
|
|
78
|
+
export declare const TransitionToEventMap: Record<string, BookingEventType>;
|
|
79
|
+
/**
|
|
80
|
+
* Reverse mapping: state transitions to transition IDs
|
|
81
|
+
* Used when we only have before/after states
|
|
82
|
+
*/
|
|
83
|
+
export declare const StateChangeToTransitionMap: Record<string, Record<string, string>>;
|
|
84
|
+
/**
|
|
85
|
+
* Configuration for booking event triggers
|
|
86
|
+
* Extends BookingEmailConfig with event-specific options
|
|
87
|
+
*/
|
|
88
|
+
export interface BookingEventConfig extends BookingEmailConfig {
|
|
89
|
+
/** Eventarc channel name (default: 'firebase') */
|
|
90
|
+
eventChannel: string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Default configuration for booking events
|
|
94
|
+
*/
|
|
95
|
+
export declare const DEFAULT_BOOKING_EVENT_CONFIG: BookingEventConfig;
|
|
96
|
+
/**
|
|
97
|
+
* Transitions that should NOT trigger email notifications
|
|
98
|
+
*/
|
|
99
|
+
export declare const SILENT_TRANSITIONS: Set<string>;
|
|
100
|
+
/**
|
|
101
|
+
* Check if a transition should trigger notifications
|
|
102
|
+
*/
|
|
103
|
+
export declare function shouldNotify(transitionId: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Infer transition ID from state change
|
|
106
|
+
* Falls back to generic transition if exact match not found
|
|
107
|
+
*/
|
|
108
|
+
export declare function inferTransitionId(fromState: string, toState: string): string | null;
|
|
109
|
+
//# sourceMappingURL=booking-event.models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-event.models.d.ts","sourceRoot":"","sources":["../../../src/modules/events/booking-event.models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAEnB,MAAM,iCAAiC,CAAC;AAEzC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB;IAE5B,mEAAmE;;IAGnE,+DAA+D;;IAG/D,yDAAyD;;IAGzD,+DAA+D;;IAG/D,2CAA2C;;IAG3C,+DAA+D;;IAG/D,2EAA2E;;IAI3E,kDAAkD;;IAGlD,4BAA4B;;CAEpB,CAAC;AAEX,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE1F;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,qCAAqC;IACrC,YAAY,EAAE,MAAM,CAAC;IAErB,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IAEb,yBAAyB;IACzB,EAAE,EAAE,MAAM,CAAC;IAEX,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IAEpB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2CAA2C;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,oCAAoC;IACpC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,SAAS,EAAE,MAAM,CAAC;IAElB,wBAAwB;IACxB,OAAO,EAAE,gBAAgB,CAAC;IAE1B,kCAAkC;IAClC,UAAU,EAAE,cAAc,CAAC;IAE3B,0DAA0D;IAC1D,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAkBjE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAkB7E,CAAC;AAEF;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC5D,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,kBAG1C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,aAA4B,CAAC;AAE5D;;GAEG;AACH,wBAAgB,YAAY,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMnF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Booking Event Models
|
|
4
|
+
*
|
|
5
|
+
* Event types and payloads for booking workflow transitions.
|
|
6
|
+
* Used by Eventarc publishers and subscribers.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.SILENT_TRANSITIONS = exports.DEFAULT_BOOKING_EVENT_CONFIG = exports.StateChangeToTransitionMap = exports.TransitionToEventMap = exports.BookingEventTypes = void 0;
|
|
10
|
+
exports.shouldNotify = shouldNotify;
|
|
11
|
+
exports.inferTransitionId = inferTransitionId;
|
|
12
|
+
const booking_email_models_1 = require("../booking/booking-email.models");
|
|
13
|
+
/**
|
|
14
|
+
* All booking workflow transition event types
|
|
15
|
+
*
|
|
16
|
+
* Naming convention: com.lodgeflow.booking.{action}
|
|
17
|
+
*/
|
|
18
|
+
exports.BookingEventTypes = {
|
|
19
|
+
// Standard Workflow Events
|
|
20
|
+
/** draft → pending_approval: New booking submitted for approval */
|
|
21
|
+
BOOKING_SUBMITTED: 'com.lodgeflow.booking.submitted',
|
|
22
|
+
/** pending_approval → confirmed: Admin approved the booking */
|
|
23
|
+
BOOKING_APPROVED: 'com.lodgeflow.booking.approved',
|
|
24
|
+
/** confirmed → ready: All conditions met for check-in */
|
|
25
|
+
BOOKING_READY: 'com.lodgeflow.booking.ready',
|
|
26
|
+
/** pending_approval → cancelled: Admin rejected the booking */
|
|
27
|
+
BOOKING_REJECTED: 'com.lodgeflow.booking.rejected',
|
|
28
|
+
/** ready → completed: Guest checked out */
|
|
29
|
+
BOOKING_COMPLETED: 'com.lodgeflow.booking.completed',
|
|
30
|
+
/** confirmed/ready → cancelled: Admin cancelled the booking */
|
|
31
|
+
BOOKING_CANCELLED: 'com.lodgeflow.booking.cancelled',
|
|
32
|
+
/** pending_approval/confirmed → cancelled: User cancelled their booking */
|
|
33
|
+
BOOKING_USER_CANCELLED: 'com.lodgeflow.booking.user_cancelled',
|
|
34
|
+
// Express Workflow Events (VIP)
|
|
35
|
+
/** draft → confirmed: Instant VIP confirmation */
|
|
36
|
+
BOOKING_INSTANT_CONFIRMED: 'com.lodgeflow.booking.instant_confirmed',
|
|
37
|
+
/** VIP booking cancelled */
|
|
38
|
+
BOOKING_VIP_CANCELLED: 'com.lodgeflow.booking.vip_cancelled',
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Mapping from workflow transition IDs to event types
|
|
42
|
+
*
|
|
43
|
+
* Used to determine which event to publish based on the transition
|
|
44
|
+
*/
|
|
45
|
+
exports.TransitionToEventMap = {
|
|
46
|
+
// Standard workflow transitions
|
|
47
|
+
submit_for_approval: exports.BookingEventTypes.BOOKING_SUBMITTED,
|
|
48
|
+
approve_booking: exports.BookingEventTypes.BOOKING_APPROVED,
|
|
49
|
+
mark_ready: exports.BookingEventTypes.BOOKING_READY,
|
|
50
|
+
reject_booking: exports.BookingEventTypes.BOOKING_REJECTED,
|
|
51
|
+
complete_booking: exports.BookingEventTypes.BOOKING_COMPLETED,
|
|
52
|
+
cancel_ready_booking: exports.BookingEventTypes.BOOKING_CANCELLED,
|
|
53
|
+
cancel_confirmed_booking: exports.BookingEventTypes.BOOKING_CANCELLED,
|
|
54
|
+
user_cancel_pending: exports.BookingEventTypes.BOOKING_USER_CANCELLED,
|
|
55
|
+
user_cancel_confirmed: exports.BookingEventTypes.BOOKING_USER_CANCELLED,
|
|
56
|
+
// Express workflow transitions
|
|
57
|
+
instant_confirm: exports.BookingEventTypes.BOOKING_INSTANT_CONFIRMED,
|
|
58
|
+
cancel_vip_booking: exports.BookingEventTypes.BOOKING_VIP_CANCELLED,
|
|
59
|
+
// Draft cancellation - no event needed
|
|
60
|
+
// cancel_draft: null,
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Reverse mapping: state transitions to transition IDs
|
|
64
|
+
* Used when we only have before/after states
|
|
65
|
+
*/
|
|
66
|
+
exports.StateChangeToTransitionMap = {
|
|
67
|
+
draft: {
|
|
68
|
+
pending_approval: 'submit_for_approval',
|
|
69
|
+
confirmed: 'instant_confirm', // Express workflow
|
|
70
|
+
cancelled: 'cancel_draft',
|
|
71
|
+
},
|
|
72
|
+
pending_approval: {
|
|
73
|
+
confirmed: 'approve_booking',
|
|
74
|
+
cancelled: 'reject_booking', // Could also be user_cancel_pending
|
|
75
|
+
},
|
|
76
|
+
confirmed: {
|
|
77
|
+
ready: 'mark_ready',
|
|
78
|
+
cancelled: 'cancel_confirmed_booking', // Could also be user_cancel_confirmed
|
|
79
|
+
},
|
|
80
|
+
ready: {
|
|
81
|
+
completed: 'complete_booking',
|
|
82
|
+
cancelled: 'cancel_ready_booking',
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
/**
|
|
86
|
+
* Default configuration for booking events
|
|
87
|
+
*/
|
|
88
|
+
exports.DEFAULT_BOOKING_EVENT_CONFIG = Object.assign(Object.assign({}, booking_email_models_1.DEFAULT_BOOKING_EMAIL_CONFIG), { eventChannel: 'firebase' });
|
|
89
|
+
/**
|
|
90
|
+
* Transitions that should NOT trigger email notifications
|
|
91
|
+
*/
|
|
92
|
+
exports.SILENT_TRANSITIONS = new Set(['cancel_draft']);
|
|
93
|
+
/**
|
|
94
|
+
* Check if a transition should trigger notifications
|
|
95
|
+
*/
|
|
96
|
+
function shouldNotify(transitionId) {
|
|
97
|
+
return !exports.SILENT_TRANSITIONS.has(transitionId);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Infer transition ID from state change
|
|
101
|
+
* Falls back to generic transition if exact match not found
|
|
102
|
+
*/
|
|
103
|
+
function inferTransitionId(fromState, toState) {
|
|
104
|
+
const transitions = exports.StateChangeToTransitionMap[fromState];
|
|
105
|
+
if (transitions && transitions[toState]) {
|
|
106
|
+
return transitions[toState];
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=booking-event.models.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-event.models.js","sourceRoot":"","sources":["../../../src/modules/events/booking-event.models.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AA2KH,oCAEC;AAMD,8CAMC;AAvLD,0EAIyC;AAEzC;;;;GAIG;AACU,QAAA,iBAAiB,GAAG;IAC/B,2BAA2B;IAC3B,mEAAmE;IACnE,iBAAiB,EAAE,iCAAiC;IAEpD,+DAA+D;IAC/D,gBAAgB,EAAE,gCAAgC;IAElD,yDAAyD;IACzD,aAAa,EAAE,6BAA6B;IAE5C,+DAA+D;IAC/D,gBAAgB,EAAE,gCAAgC;IAElD,2CAA2C;IAC3C,iBAAiB,EAAE,iCAAiC;IAEpD,+DAA+D;IAC/D,iBAAiB,EAAE,iCAAiC;IAEpD,2EAA2E;IAC3E,sBAAsB,EAAE,sCAAsC;IAE9D,gCAAgC;IAChC,kDAAkD;IAClD,yBAAyB,EAAE,yCAAyC;IAEpE,4BAA4B;IAC5B,qBAAqB,EAAE,qCAAqC;CACpD,CAAC;AAuDX;;;;GAIG;AACU,QAAA,oBAAoB,GAAqC;IACpE,gCAAgC;IAChC,mBAAmB,EAAE,yBAAiB,CAAC,iBAAiB;IACxD,eAAe,EAAE,yBAAiB,CAAC,gBAAgB;IACnD,UAAU,EAAE,yBAAiB,CAAC,aAAa;IAC3C,cAAc,EAAE,yBAAiB,CAAC,gBAAgB;IAClD,gBAAgB,EAAE,yBAAiB,CAAC,iBAAiB;IACrD,oBAAoB,EAAE,yBAAiB,CAAC,iBAAiB;IACzD,wBAAwB,EAAE,yBAAiB,CAAC,iBAAiB;IAC7D,mBAAmB,EAAE,yBAAiB,CAAC,sBAAsB;IAC7D,qBAAqB,EAAE,yBAAiB,CAAC,sBAAsB;IAE/D,+BAA+B;IAC/B,eAAe,EAAE,yBAAiB,CAAC,yBAAyB;IAC5D,kBAAkB,EAAE,yBAAiB,CAAC,qBAAqB;IAE3D,uCAAuC;IACvC,sBAAsB;CACvB,CAAC;AAEF;;;GAGG;AACU,QAAA,0BAA0B,GAA2C;IAChF,KAAK,EAAE;QACL,gBAAgB,EAAE,qBAAqB;QACvC,SAAS,EAAE,iBAAiB,EAAE,mBAAmB;QACjD,SAAS,EAAE,cAAc;KAC1B;IACD,gBAAgB,EAAE;QAChB,SAAS,EAAE,iBAAiB;QAC5B,SAAS,EAAE,gBAAgB,EAAE,oCAAoC;KAClE;IACD,SAAS,EAAE;QACT,KAAK,EAAE,YAAY;QACnB,SAAS,EAAE,0BAA0B,EAAE,sCAAsC;KAC9E;IACD,KAAK,EAAE;QACL,SAAS,EAAE,kBAAkB;QAC7B,SAAS,EAAE,sBAAsB;KAClC;CACF,CAAC;AAWF;;GAEG;AACU,QAAA,4BAA4B,mCACpC,mDAA4B,KAC/B,YAAY,EAAE,UAAU,IACxB;AAEF;;GAEG;AACU,QAAA,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;AAE5D;;GAEG;AACH,SAAgB,YAAY,CAAC,YAAoB;IAC/C,OAAO,CAAC,0BAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,SAAgB,iBAAiB,CAAC,SAAiB,EAAE,OAAe;IAClE,MAAM,WAAW,GAAG,kCAA0B,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,WAAW,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;QACxC,OAAO,WAAW,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Booking Event Publisher Triggers
|
|
3
|
+
*
|
|
4
|
+
* Publishes CloudEvents to Eventarc when booking documents are created or updated.
|
|
5
|
+
* These events are consumed by subscriber handlers (email, audit, analytics).
|
|
6
|
+
*
|
|
7
|
+
* Architecture:
|
|
8
|
+
* - onDocumentCreated: Publishes BOOKING_SUBMITTED or BOOKING_INSTANT_CONFIRMED
|
|
9
|
+
* - onDocumentUpdated: Publishes events based on workflow state transitions
|
|
10
|
+
*/
|
|
11
|
+
import { BookingEventConfig } from './booking-event.models';
|
|
12
|
+
/**
|
|
13
|
+
* Create booking event publisher triggers
|
|
14
|
+
*
|
|
15
|
+
* @param config - Configuration options
|
|
16
|
+
* @returns Object containing trigger functions
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const triggers = createBookingEventTriggers({ region: 'europe-west1' });
|
|
21
|
+
* export const onBookingCreatedEvent = triggers.onBookingCreatedEvent;
|
|
22
|
+
* export const onBookingUpdatedEvent = triggers.onBookingUpdatedEvent;
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function createBookingEventTriggers(config?: Partial<BookingEventConfig>): {
|
|
26
|
+
/**
|
|
27
|
+
* Trigger when a new booking is created
|
|
28
|
+
*
|
|
29
|
+
* Publishes:
|
|
30
|
+
* - BOOKING_SUBMITTED: When workflow state is 'pending_approval' (user booking)
|
|
31
|
+
* - BOOKING_INSTANT_CONFIRMED: When workflow state is 'confirmed' (admin/VIP booking)
|
|
32
|
+
*/
|
|
33
|
+
onBookingCreatedEvent: import("firebase-functions").CloudFunction<import("firebase-functions/v2/firestore").FirestoreEvent<import("firebase-functions/v2/firestore").QueryDocumentSnapshot | undefined, {
|
|
34
|
+
bookingId: string;
|
|
35
|
+
}>>;
|
|
36
|
+
/**
|
|
37
|
+
* Trigger when a booking is updated
|
|
38
|
+
*
|
|
39
|
+
* Publishes events based on workflow state transitions.
|
|
40
|
+
* Only triggers when workflow.currentState changes.
|
|
41
|
+
*/
|
|
42
|
+
onBookingUpdatedEvent: import("firebase-functions").CloudFunction<import("firebase-functions/v2/firestore").FirestoreEvent<import("firebase-functions").Change<import("firebase-functions/v2/firestore").QueryDocumentSnapshot> | undefined, {
|
|
43
|
+
bookingId: string;
|
|
44
|
+
}>>;
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=booking-event.triggers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"booking-event.triggers.d.ts","sourceRoot":"","sources":["../../../src/modules/events/booking-event.triggers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,EACL,kBAAkB,EAOnB,MAAM,wBAAwB,CAAC;AAEhC;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAkE/E;;;;;;OAMG;;;;IA4CH;;;;;OAKG;;;;EA0DN"}
|