@zssz-soft/firebase-functions-shared 1.3.0 → 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 (34) 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 +1 -0
  5. package/lib/index.d.ts.map +1 -1
  6. package/lib/index.js +1 -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.map +1 -1
  14. package/lib/modules/events/booking-event.handlers.d.ts +44 -0
  15. package/lib/modules/events/booking-event.handlers.d.ts.map +1 -0
  16. package/lib/modules/events/booking-event.handlers.js +274 -0
  17. package/lib/modules/events/booking-event.handlers.js.map +1 -0
  18. package/lib/modules/events/booking-event.models.d.ts +109 -0
  19. package/lib/modules/events/booking-event.models.d.ts.map +1 -0
  20. package/lib/modules/events/booking-event.models.js +110 -0
  21. package/lib/modules/events/booking-event.models.js.map +1 -0
  22. package/lib/modules/events/booking-event.triggers.d.ts +46 -0
  23. package/lib/modules/events/booking-event.triggers.d.ts.map +1 -0
  24. package/lib/modules/events/booking-event.triggers.js +178 -0
  25. package/lib/modules/events/booking-event.triggers.js.map +1 -0
  26. package/lib/modules/events/event.models.d.ts +53 -0
  27. package/lib/modules/events/event.models.d.ts.map +1 -0
  28. package/lib/modules/events/event.models.js +18 -0
  29. package/lib/modules/events/event.models.js.map +1 -0
  30. package/lib/modules/events/index.d.ts +29 -0
  31. package/lib/modules/events/index.d.ts.map +1 -0
  32. package/lib/modules/events/index.js +49 -0
  33. package/lib/modules/events/index.js.map +1 -0
  34. package/package.json +1 -1
@@ -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"}
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ /**
3
+ * Booking Event Publisher Triggers
4
+ *
5
+ * Publishes CloudEvents to Eventarc when booking documents are created or updated.
6
+ * These events are consumed by subscriber handlers (email, audit, analytics).
7
+ *
8
+ * Architecture:
9
+ * - onDocumentCreated: Publishes BOOKING_SUBMITTED or BOOKING_INSTANT_CONFIRMED
10
+ * - onDocumentUpdated: Publishes events based on workflow state transitions
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.createBookingEventTriggers = createBookingEventTriggers;
14
+ const firebase_functions_1 = require("firebase-functions");
15
+ const firestore_1 = require("firebase-functions/v2/firestore");
16
+ const eventarc_1 = require("firebase-admin/eventarc");
17
+ const error_reporting_1 = require("../error-reporting");
18
+ const booking_event_models_1 = require("./booking-event.models");
19
+ /**
20
+ * Create booking event publisher triggers
21
+ *
22
+ * @param config - Configuration options
23
+ * @returns Object containing trigger functions
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const triggers = createBookingEventTriggers({ region: 'europe-west1' });
28
+ * export const onBookingCreatedEvent = triggers.onBookingCreatedEvent;
29
+ * export const onBookingUpdatedEvent = triggers.onBookingUpdatedEvent;
30
+ * ```
31
+ */
32
+ function createBookingEventTriggers(config = {}) {
33
+ const cfg = Object.assign(Object.assign({}, booking_event_models_1.DEFAULT_BOOKING_EVENT_CONFIG), config);
34
+ const errorReporter = (0, error_reporting_1.createErrorReporter)('BookingEventPublisher');
35
+ /**
36
+ * Publish a booking event to Eventarc
37
+ */
38
+ async function publishBookingEvent(eventType, payload) {
39
+ try {
40
+ const channel = (0, eventarc_1.getEventarc)().channel(cfg.eventChannel);
41
+ await channel.publish({
42
+ type: eventType,
43
+ subject: `booking/${payload.bookingId}`,
44
+ data: payload,
45
+ });
46
+ firebase_functions_1.logger.info(`[BookingEvent] Published ${eventType} for booking ${payload.bookingId}`, {
47
+ transitionId: payload.transition.transitionId,
48
+ from: payload.transition.from,
49
+ to: payload.transition.to,
50
+ });
51
+ }
52
+ catch (error) {
53
+ // Log but don't throw - we don't want to fail the Firestore operation
54
+ errorReporter.report(error, {
55
+ requestId: payload.bookingId,
56
+ metadata: {
57
+ type: 'event_publish_error',
58
+ eventType,
59
+ transitionId: payload.transition.transitionId,
60
+ },
61
+ });
62
+ throw error; // Re-throw to trigger retry
63
+ }
64
+ }
65
+ /**
66
+ * Create event payload from booking data
67
+ */
68
+ function createPayload(bookingId, booking, transitionId, from, to) {
69
+ var _a, _b, _c;
70
+ return {
71
+ bookingId,
72
+ booking: Object.assign(Object.assign({}, booking), { uid: bookingId }),
73
+ transition: {
74
+ transitionId,
75
+ from,
76
+ to,
77
+ triggeredBy: ((_a = booking.workflow) === null || _a === void 0 ? void 0 : _a.lastTransitionBy) ||
78
+ ((_b = booking.meta) === null || _b === void 0 ? void 0 : _b.createdBy) ||
79
+ 'system',
80
+ triggeredAt: ((_c = booking.workflow) === null || _c === void 0 ? void 0 : _c.lastTransitionAt) || new Date().toISOString(),
81
+ },
82
+ };
83
+ }
84
+ return {
85
+ /**
86
+ * Trigger when a new booking is created
87
+ *
88
+ * Publishes:
89
+ * - BOOKING_SUBMITTED: When workflow state is 'pending_approval' (user booking)
90
+ * - BOOKING_INSTANT_CONFIRMED: When workflow state is 'confirmed' (admin/VIP booking)
91
+ */
92
+ onBookingCreatedEvent: (0, firestore_1.onDocumentCreated)({
93
+ document: `${cfg.bookingCollection}/{bookingId}`,
94
+ region: cfg.region,
95
+ maxInstances: cfg.maxInstances,
96
+ }, async (event) => {
97
+ var _a, _b;
98
+ const bookingId = event.params.bookingId;
99
+ const bookingData = (_a = event.data) === null || _a === void 0 ? void 0 : _a.data();
100
+ if (!bookingData) {
101
+ firebase_functions_1.logger.warn(`[BookingEvent] No data for new booking ${bookingId}`);
102
+ return;
103
+ }
104
+ const workflowState = (_b = bookingData.workflow) === null || _b === void 0 ? void 0 : _b.currentState;
105
+ // Determine event type based on initial workflow state
106
+ let eventType = null;
107
+ let transitionId;
108
+ if (workflowState === 'pending_approval') {
109
+ eventType = booking_event_models_1.BookingEventTypes.BOOKING_SUBMITTED;
110
+ transitionId = 'submit_for_approval';
111
+ }
112
+ else if (workflowState === 'confirmed') {
113
+ // Express workflow or admin-created booking
114
+ eventType = booking_event_models_1.BookingEventTypes.BOOKING_INSTANT_CONFIRMED;
115
+ transitionId = 'instant_confirm';
116
+ }
117
+ else if (workflowState === 'draft') {
118
+ // Draft state - no event needed until submitted
119
+ firebase_functions_1.logger.info(`[BookingEvent] Skipping draft booking ${bookingId}`);
120
+ return;
121
+ }
122
+ else {
123
+ firebase_functions_1.logger.info(`[BookingEvent] Skipping booking ${bookingId} with state: ${workflowState}`);
124
+ return;
125
+ }
126
+ const payload = createPayload(bookingId, bookingData, transitionId, 'draft', workflowState);
127
+ await publishBookingEvent(eventType, payload);
128
+ }),
129
+ /**
130
+ * Trigger when a booking is updated
131
+ *
132
+ * Publishes events based on workflow state transitions.
133
+ * Only triggers when workflow.currentState changes.
134
+ */
135
+ onBookingUpdatedEvent: (0, firestore_1.onDocumentUpdated)({
136
+ document: `${cfg.bookingCollection}/{bookingId}`,
137
+ region: cfg.region,
138
+ maxInstances: cfg.maxInstances,
139
+ }, async (event) => {
140
+ var _a, _b, _c, _d;
141
+ const bookingId = event.params.bookingId;
142
+ const before = (_a = event.data) === null || _a === void 0 ? void 0 : _a.before.data();
143
+ const after = (_b = event.data) === null || _b === void 0 ? void 0 : _b.after.data();
144
+ if (!before || !after) {
145
+ firebase_functions_1.logger.warn(`[BookingEvent] Missing before/after data for booking ${bookingId}`);
146
+ return;
147
+ }
148
+ // Check for workflow state change
149
+ const stateBefore = (_c = before.workflow) === null || _c === void 0 ? void 0 : _c.currentState;
150
+ const stateAfter = (_d = after.workflow) === null || _d === void 0 ? void 0 : _d.currentState;
151
+ if (!stateBefore || !stateAfter || stateBefore === stateAfter) {
152
+ // No workflow state change - skip
153
+ return;
154
+ }
155
+ firebase_functions_1.logger.info(`[BookingEvent] State change detected for ${bookingId}: ${stateBefore} → ${stateAfter}`);
156
+ // Infer transition ID from state change
157
+ const transitionId = (0, booking_event_models_1.inferTransitionId)(stateBefore, stateAfter);
158
+ if (!transitionId) {
159
+ firebase_functions_1.logger.warn(`[BookingEvent] Unknown transition: ${stateBefore} → ${stateAfter}`);
160
+ return;
161
+ }
162
+ // Check if this transition should send notifications
163
+ if (!(0, booking_event_models_1.shouldNotify)(transitionId)) {
164
+ firebase_functions_1.logger.info(`[BookingEvent] Silent transition ${transitionId}, skipping event`);
165
+ return;
166
+ }
167
+ // Get event type for this transition
168
+ const eventType = booking_event_models_1.TransitionToEventMap[transitionId];
169
+ if (!eventType) {
170
+ firebase_functions_1.logger.warn(`[BookingEvent] No event mapping for transition: ${transitionId}`);
171
+ return;
172
+ }
173
+ const payload = createPayload(bookingId, after, transitionId, stateBefore, stateAfter);
174
+ await publishBookingEvent(eventType, payload);
175
+ }),
176
+ };
177
+ }
178
+ //# sourceMappingURL=booking-event.triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"booking-event.triggers.js","sourceRoot":"","sources":["../../../src/modules/events/booking-event.triggers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Base Event Models for LodgeFlow Eventarc Integration
3
+ *
4
+ * CloudEvents specification v1.0 compliant event types for
5
+ * the event-driven notification architecture.
6
+ */
7
+ /**
8
+ * Base CloudEvent structure for LodgeFlow events
9
+ * Follows CloudEvents specification v1.0
10
+ * @see https://cloudevents.io/
11
+ */
12
+ export interface LodgeFlowCloudEvent<T = unknown> {
13
+ /** CloudEvents specification version */
14
+ specversion: '1.0';
15
+ /** Event type identifier (e.g., 'com.lodgeflow.booking.approved') */
16
+ type: string;
17
+ /** Event source identifier */
18
+ source: string;
19
+ /** Unique event ID */
20
+ id: string;
21
+ /** Event timestamp in ISO 8601 format */
22
+ time?: string;
23
+ /** Subject of the event (e.g., 'booking/abc123') */
24
+ subject?: string;
25
+ /** Content type of the data field */
26
+ datacontenttype?: 'application/json';
27
+ /** Event payload */
28
+ data: T;
29
+ }
30
+ /**
31
+ * Event categories for routing and filtering
32
+ */
33
+ export type EventCategory = 'booking' | 'user' | 'payment' | 'system';
34
+ /**
35
+ * Event severity levels for alerting
36
+ */
37
+ export type EventSeverity = 'info' | 'warning' | 'critical';
38
+ /**
39
+ * Base configuration for event triggers
40
+ */
41
+ export interface EventTriggerConfig {
42
+ /** Cloud Functions deployment region */
43
+ region: string;
44
+ /** Eventarc channel name (default: 'firebase') */
45
+ eventChannel: string;
46
+ /** Maximum number of concurrent function instances */
47
+ maxInstances?: number;
48
+ }
49
+ /**
50
+ * Default event trigger configuration
51
+ */
52
+ export declare const DEFAULT_EVENT_TRIGGER_CONFIG: EventTriggerConfig;
53
+ //# sourceMappingURL=event.models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.models.d.ts","sourceRoot":"","sources":["../../../src/modules/events/event.models.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,GAAG,OAAO;IAC9C,wCAAwC;IACxC,WAAW,EAAE,KAAK,CAAC;IAEnB,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IAEb,8BAA8B;IAC9B,MAAM,EAAE,MAAM,CAAC;IAEf,sBAAsB;IACtB,EAAE,EAAE,MAAM,CAAC;IAEX,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,qCAAqC;IACrC,eAAe,CAAC,EAAE,kBAAkB,CAAC;IAErC,oBAAoB;IACpB,IAAI,EAAE,CAAC,CAAC;CACT;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEtE;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,UAAU,CAAC;AAE5D;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IAErB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,eAAO,MAAM,4BAA4B,EAAE,kBAI1C,CAAC"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ /**
3
+ * Base Event Models for LodgeFlow Eventarc Integration
4
+ *
5
+ * CloudEvents specification v1.0 compliant event types for
6
+ * the event-driven notification architecture.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.DEFAULT_EVENT_TRIGGER_CONFIG = void 0;
10
+ /**
11
+ * Default event trigger configuration
12
+ */
13
+ exports.DEFAULT_EVENT_TRIGGER_CONFIG = {
14
+ region: 'europe-west1',
15
+ eventChannel: 'firebase',
16
+ maxInstances: 10,
17
+ };
18
+ //# sourceMappingURL=event.models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.models.js","sourceRoot":"","sources":["../../../src/modules/events/event.models.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAyDH;;GAEG;AACU,QAAA,4BAA4B,GAAuB;IAC9D,MAAM,EAAE,cAAc;IACtB,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,EAAE;CACjB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Events Module
3
+ *
4
+ * Provides Eventarc-based event-driven architecture for the booking system.
5
+ *
6
+ * Architecture:
7
+ * - Publishers: Firestore triggers that emit CloudEvents to Eventarc
8
+ * - Subscribers: Event handlers that process events (email, audit, etc.)
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * import {
13
+ * createBookingEventTriggers,
14
+ * createBookingEmailHandlers,
15
+ * } from '@zssz-soft/firebase-functions-shared';
16
+ *
17
+ * const triggers = createBookingEventTriggers({ region: 'europe-west1' });
18
+ * const handlers = createBookingEmailHandlers({ region: 'europe-west1' });
19
+ *
20
+ * export const onBookingCreatedEvent = triggers.onBookingCreatedEvent;
21
+ * export const onBookingUpdatedEvent = triggers.onBookingUpdatedEvent;
22
+ * export const onBookingEmailHandler = handlers.onBookingEvent;
23
+ * ```
24
+ */
25
+ export * from './event.models';
26
+ export * from './booking-event.models';
27
+ export * from './booking-event.triggers';
28
+ export * from './booking-event.handlers';
29
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/modules/events/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,cAAc,gBAAgB,CAAC;AAG/B,cAAc,wBAAwB,CAAC;AAGvC,cAAc,0BAA0B,CAAC;AAGzC,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ /**
3
+ * Events Module
4
+ *
5
+ * Provides Eventarc-based event-driven architecture for the booking system.
6
+ *
7
+ * Architecture:
8
+ * - Publishers: Firestore triggers that emit CloudEvents to Eventarc
9
+ * - Subscribers: Event handlers that process events (email, audit, etc.)
10
+ *
11
+ * Usage:
12
+ * ```typescript
13
+ * import {
14
+ * createBookingEventTriggers,
15
+ * createBookingEmailHandlers,
16
+ * } from '@zssz-soft/firebase-functions-shared';
17
+ *
18
+ * const triggers = createBookingEventTriggers({ region: 'europe-west1' });
19
+ * const handlers = createBookingEmailHandlers({ region: 'europe-west1' });
20
+ *
21
+ * export const onBookingCreatedEvent = triggers.onBookingCreatedEvent;
22
+ * export const onBookingUpdatedEvent = triggers.onBookingUpdatedEvent;
23
+ * export const onBookingEmailHandler = handlers.onBookingEvent;
24
+ * ```
25
+ */
26
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ var desc = Object.getOwnPropertyDescriptor(m, k);
29
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
30
+ desc = { enumerable: true, get: function() { return m[k]; } };
31
+ }
32
+ Object.defineProperty(o, k2, desc);
33
+ }) : (function(o, m, k, k2) {
34
+ if (k2 === undefined) k2 = k;
35
+ o[k2] = m[k];
36
+ }));
37
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
38
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
39
+ };
40
+ Object.defineProperty(exports, "__esModule", { value: true });
41
+ // Base event models
42
+ __exportStar(require("./event.models"), exports);
43
+ // Booking event models and types
44
+ __exportStar(require("./booking-event.models"), exports);
45
+ // Booking event publishers (Firestore → Eventarc)
46
+ __exportStar(require("./booking-event.triggers"), exports);
47
+ // Booking event handlers (Eventarc → Email)
48
+ __exportStar(require("./booking-event.handlers"), exports);
49
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/modules/events/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;;;;;;;;;;;;;;;;AAEH,oBAAoB;AACpB,iDAA+B;AAE/B,iCAAiC;AACjC,yDAAuC;AAEvC,kDAAkD;AAClD,2DAAyC;AAEzC,4CAA4C;AAC5C,2DAAyC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zssz-soft/firebase-functions-shared",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Shared Firebase Cloud Functions modules for LodgeFlow applications",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",