@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.
Files changed (56) hide show
  1. package/lib/config/app.config.d.ts +6 -0
  2. package/lib/config/app.config.d.ts.map +1 -1
  3. package/lib/config/app.config.js.map +1 -1
  4. package/lib/index.d.ts +3 -0
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +3 -0
  7. package/lib/index.js.map +1 -1
  8. package/lib/modules/booking/booking-email.templates.d.ts +52 -0
  9. package/lib/modules/booking/booking-email.templates.d.ts.map +1 -1
  10. package/lib/modules/booking/booking-email.templates.js +768 -0
  11. package/lib/modules/booking/booking-email.templates.js.map +1 -1
  12. package/lib/modules/booking/booking-email.triggers.d.ts.map +1 -1
  13. package/lib/modules/booking/booking-email.triggers.js +22 -5
  14. package/lib/modules/booking/booking-email.triggers.js.map +1 -1
  15. package/lib/modules/email/email.d.ts.map +1 -1
  16. package/lib/modules/email/email.js +11 -2
  17. package/lib/modules/email/email.js.map +1 -1
  18. package/lib/modules/error-reporting/error-reporter.d.ts +97 -0
  19. package/lib/modules/error-reporting/error-reporter.d.ts.map +1 -0
  20. package/lib/modules/error-reporting/error-reporter.js +156 -0
  21. package/lib/modules/error-reporting/error-reporter.js.map +1 -0
  22. package/lib/modules/error-reporting/index.d.ts +7 -0
  23. package/lib/modules/error-reporting/index.d.ts.map +1 -0
  24. package/lib/modules/error-reporting/index.js +23 -0
  25. package/lib/modules/error-reporting/index.js.map +1 -0
  26. package/lib/modules/events/booking-event.handlers.d.ts +44 -0
  27. package/lib/modules/events/booking-event.handlers.d.ts.map +1 -0
  28. package/lib/modules/events/booking-event.handlers.js +274 -0
  29. package/lib/modules/events/booking-event.handlers.js.map +1 -0
  30. package/lib/modules/events/booking-event.models.d.ts +109 -0
  31. package/lib/modules/events/booking-event.models.d.ts.map +1 -0
  32. package/lib/modules/events/booking-event.models.js +110 -0
  33. package/lib/modules/events/booking-event.models.js.map +1 -0
  34. package/lib/modules/events/booking-event.triggers.d.ts +46 -0
  35. package/lib/modules/events/booking-event.triggers.d.ts.map +1 -0
  36. package/lib/modules/events/booking-event.triggers.js +178 -0
  37. package/lib/modules/events/booking-event.triggers.js.map +1 -0
  38. package/lib/modules/events/event.models.d.ts +53 -0
  39. package/lib/modules/events/event.models.d.ts.map +1 -0
  40. package/lib/modules/events/event.models.js +18 -0
  41. package/lib/modules/events/event.models.js.map +1 -0
  42. package/lib/modules/events/index.d.ts +29 -0
  43. package/lib/modules/events/index.d.ts.map +1 -0
  44. package/lib/modules/events/index.js +49 -0
  45. package/lib/modules/events/index.js.map +1 -0
  46. package/lib/modules/health/health-check.d.ts +33 -0
  47. package/lib/modules/health/health-check.d.ts.map +1 -0
  48. package/lib/modules/health/health-check.js +142 -0
  49. package/lib/modules/health/health-check.js.map +1 -0
  50. package/lib/modules/health/index.d.ts +7 -0
  51. package/lib/modules/health/index.d.ts.map +1 -0
  52. package/lib/modules/health/index.js +23 -0
  53. package/lib/modules/health/index.js.map +1 -0
  54. package/lib/modules/user/user-auth.triggers.d.ts.map +1 -1
  55. package/lib/modules/user/user-auth.triggers.js.map +1 -1
  56. 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":"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"}
@@ -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"}