@novha/anlia-core-lib 0.1.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 (233) hide show
  1. package/cdk/bin/infrastructure.ts +18 -0
  2. package/cdk/bin/project-names.ts +7 -0
  3. package/cdk/lib/infrastructure.ts +37 -0
  4. package/cdk.json +70 -0
  5. package/dist/cdk/bin/infrastructure.d.ts +1 -0
  6. package/dist/cdk/bin/infrastructure.js +20 -0
  7. package/dist/cdk/bin/project-names.d.ts +6 -0
  8. package/dist/cdk/bin/project-names.js +4 -0
  9. package/dist/cdk/lib/infrastructure.d.ts +6 -0
  10. package/dist/cdk/lib/infrastructure.js +32 -0
  11. package/dist/src/enums/domain/DayOfWeek.d.ts +9 -0
  12. package/dist/src/enums/domain/DayOfWeek.js +13 -0
  13. package/dist/src/enums/domain/Delivery.d.ts +19 -0
  14. package/dist/src/enums/domain/Delivery.js +24 -0
  15. package/dist/src/enums/domain/Employee.d.ts +12 -0
  16. package/dist/src/enums/domain/Employee.js +16 -0
  17. package/dist/src/enums/domain/Ingredient.d.ts +31 -0
  18. package/dist/src/enums/domain/Ingredient.js +37 -0
  19. package/dist/src/enums/domain/Inventory.d.ts +29 -0
  20. package/dist/src/enums/domain/Inventory.js +36 -0
  21. package/dist/src/enums/domain/Kitchen.d.ts +49 -0
  22. package/dist/src/enums/domain/Kitchen.js +59 -0
  23. package/dist/src/enums/domain/Menu.d.ts +13 -0
  24. package/dist/src/enums/domain/Menu.js +18 -0
  25. package/dist/src/enums/domain/Payments.d.ts +21 -0
  26. package/dist/src/enums/domain/Payments.js +26 -0
  27. package/dist/src/enums/domain/Recipe.d.ts +14 -0
  28. package/dist/src/enums/domain/Recipe.js +19 -0
  29. package/dist/src/enums/domain/Reservation.d.ts +17 -0
  30. package/dist/src/enums/domain/Reservation.js +22 -0
  31. package/dist/src/enums/domain/Restaurant.d.ts +39 -0
  32. package/dist/src/enums/domain/Restaurant.js +45 -0
  33. package/dist/src/enums/domain/Table.d.ts +23 -0
  34. package/dist/src/enums/domain/Table.js +29 -0
  35. package/dist/src/enums/domain/Vendors.d.ts +29 -0
  36. package/dist/src/enums/domain/Vendors.js +35 -0
  37. package/dist/src/enums/index.d.ts +13 -0
  38. package/dist/src/enums/index.js +29 -0
  39. package/dist/src/eventBridge/EventBridgeModule.d.ts +2 -0
  40. package/dist/src/eventBridge/EventBridgeModule.js +26 -0
  41. package/dist/src/eventBridge/domain/EventBridgeOptions.d.ts +8 -0
  42. package/dist/src/eventBridge/domain/EventBridgeOptions.js +2 -0
  43. package/dist/src/eventBridge/ioc/index.d.ts +3 -0
  44. package/dist/src/eventBridge/ioc/index.js +6 -0
  45. package/dist/src/eventBridge/ioc.d.ts +3 -0
  46. package/dist/src/eventBridge/ioc.js +6 -0
  47. package/dist/src/eventBridge/service/EventBridgeService.d.ts +5 -0
  48. package/dist/src/eventBridge/service/EventBridgeService.js +2 -0
  49. package/dist/src/eventBridge/service/EventBridgeServiceImpl.d.ts +13 -0
  50. package/dist/src/eventBridge/service/EventBridgeServiceImpl.js +63 -0
  51. package/dist/src/events/domain/CustomerEvents.d.ts +54 -0
  52. package/dist/src/events/domain/CustomerEvents.js +2 -0
  53. package/dist/src/events/domain/DeliveryEvents.d.ts +61 -0
  54. package/dist/src/events/domain/DeliveryEvents.js +2 -0
  55. package/dist/src/events/domain/DomainEvent.d.ts +12 -0
  56. package/dist/src/events/domain/DomainEvent.js +2 -0
  57. package/dist/src/events/domain/DomainEventType.d.ts +119 -0
  58. package/dist/src/events/domain/DomainEventType.js +136 -0
  59. package/dist/src/events/domain/EmployeeEvents.d.ts +51 -0
  60. package/dist/src/events/domain/EmployeeEvents.js +2 -0
  61. package/dist/src/events/domain/InventoryEvents.d.ts +141 -0
  62. package/dist/src/events/domain/InventoryEvents.js +2 -0
  63. package/dist/src/events/domain/OrderEvents.d.ts +105 -0
  64. package/dist/src/events/domain/OrderEvents.js +2 -0
  65. package/dist/src/events/domain/PaymentEvents.d.ts +73 -0
  66. package/dist/src/events/domain/PaymentEvents.js +2 -0
  67. package/dist/src/events/domain/RecipeEvents.d.ts +45 -0
  68. package/dist/src/events/domain/RecipeEvents.js +2 -0
  69. package/dist/src/events/domain/ReservationEvents.d.ts +93 -0
  70. package/dist/src/events/domain/ReservationEvents.js +2 -0
  71. package/dist/src/events/domain/RestaurantEvents.d.ts +62 -0
  72. package/dist/src/events/domain/RestaurantEvents.js +2 -0
  73. package/dist/src/events/domain/TableEvents.d.ts +71 -0
  74. package/dist/src/events/domain/TableEvents.js +2 -0
  75. package/dist/src/events/domain/VendorEvents.d.ts +28 -0
  76. package/dist/src/events/domain/VendorEvents.js +2 -0
  77. package/dist/src/events/index.d.ts +13 -0
  78. package/dist/src/events/index.js +29 -0
  79. package/dist/src/index.d.ts +4 -0
  80. package/dist/src/index.js +20 -0
  81. package/dist/src/interfaces/Address.d.ts +7 -0
  82. package/dist/src/interfaces/Address.js +2 -0
  83. package/dist/src/interfaces/Customer.d.ts +21 -0
  84. package/dist/src/interfaces/Customer.js +2 -0
  85. package/dist/src/interfaces/Delivery.d.ts +62 -0
  86. package/dist/src/interfaces/Delivery.js +2 -0
  87. package/dist/src/interfaces/Employee.d.ts +19 -0
  88. package/dist/src/interfaces/Employee.js +2 -0
  89. package/dist/src/interfaces/Ingredient.d.ts +42 -0
  90. package/dist/src/interfaces/Ingredient.js +2 -0
  91. package/dist/src/interfaces/Inventory.d.ts +26 -0
  92. package/dist/src/interfaces/Inventory.js +2 -0
  93. package/dist/src/interfaces/Kitchen.d.ts +72 -0
  94. package/dist/src/interfaces/Kitchen.js +2 -0
  95. package/dist/src/interfaces/Location.d.ts +14 -0
  96. package/dist/src/interfaces/Location.js +2 -0
  97. package/dist/src/interfaces/Menu.d.ts +72 -0
  98. package/dist/src/interfaces/Menu.js +2 -0
  99. package/dist/src/interfaces/Money.d.ts +5 -0
  100. package/dist/src/interfaces/Money.js +2 -0
  101. package/dist/src/interfaces/OpeningHours.d.ts +7 -0
  102. package/dist/src/interfaces/OpeningHours.js +2 -0
  103. package/dist/src/interfaces/Payment.d.ts +36 -0
  104. package/dist/src/interfaces/Payment.js +2 -0
  105. package/dist/src/interfaces/Recipe.d.ts +58 -0
  106. package/dist/src/interfaces/Recipe.js +2 -0
  107. package/dist/src/interfaces/Resevation.d.ts +25 -0
  108. package/dist/src/interfaces/Resevation.js +2 -0
  109. package/dist/src/interfaces/Restaurant.d.ts +24 -0
  110. package/dist/src/interfaces/Restaurant.js +2 -0
  111. package/dist/src/interfaces/Table.d.ts +54 -0
  112. package/dist/src/interfaces/Table.js +2 -0
  113. package/dist/src/interfaces/Vendor.d.ts +19 -0
  114. package/dist/src/interfaces/Vendor.js +2 -0
  115. package/dist/src/interfaces/domain/Address.d.ts +7 -0
  116. package/dist/src/interfaces/domain/Address.js +2 -0
  117. package/dist/src/interfaces/domain/Customer.d.ts +21 -0
  118. package/dist/src/interfaces/domain/Customer.js +2 -0
  119. package/dist/src/interfaces/domain/Delivery.d.ts +62 -0
  120. package/dist/src/interfaces/domain/Delivery.js +2 -0
  121. package/dist/src/interfaces/domain/Employee.d.ts +19 -0
  122. package/dist/src/interfaces/domain/Employee.js +2 -0
  123. package/dist/src/interfaces/domain/Ingredient.d.ts +42 -0
  124. package/dist/src/interfaces/domain/Ingredient.js +2 -0
  125. package/dist/src/interfaces/domain/Inventory.d.ts +26 -0
  126. package/dist/src/interfaces/domain/Inventory.js +2 -0
  127. package/dist/src/interfaces/domain/Kitchen.d.ts +72 -0
  128. package/dist/src/interfaces/domain/Kitchen.js +2 -0
  129. package/dist/src/interfaces/domain/Location.d.ts +14 -0
  130. package/dist/src/interfaces/domain/Location.js +2 -0
  131. package/dist/src/interfaces/domain/Menu.d.ts +72 -0
  132. package/dist/src/interfaces/domain/Menu.js +2 -0
  133. package/dist/src/interfaces/domain/Money.d.ts +5 -0
  134. package/dist/src/interfaces/domain/Money.js +2 -0
  135. package/dist/src/interfaces/domain/OpeningHours.d.ts +7 -0
  136. package/dist/src/interfaces/domain/OpeningHours.js +2 -0
  137. package/dist/src/interfaces/domain/Payment.d.ts +36 -0
  138. package/dist/src/interfaces/domain/Payment.js +2 -0
  139. package/dist/src/interfaces/domain/Recipe.d.ts +58 -0
  140. package/dist/src/interfaces/domain/Recipe.js +2 -0
  141. package/dist/src/interfaces/domain/Reservation.d.ts +25 -0
  142. package/dist/src/interfaces/domain/Reservation.js +2 -0
  143. package/dist/src/interfaces/domain/Restaurant.d.ts +24 -0
  144. package/dist/src/interfaces/domain/Restaurant.js +2 -0
  145. package/dist/src/interfaces/domain/Table.d.ts +54 -0
  146. package/dist/src/interfaces/domain/Table.js +2 -0
  147. package/dist/src/interfaces/domain/Vendor.d.ts +19 -0
  148. package/dist/src/interfaces/domain/Vendor.js +2 -0
  149. package/dist/src/interfaces/index.d.ts +17 -0
  150. package/dist/src/interfaces/index.js +33 -0
  151. package/dist/src/orders/OrderModule.d.ts +2 -0
  152. package/dist/src/orders/OrderModule.js +28 -0
  153. package/dist/src/orders/domain/Enums.d.ts +16 -0
  154. package/dist/src/orders/domain/Enums.js +21 -0
  155. package/dist/src/orders/domain/Order.d.ts +89 -0
  156. package/dist/src/orders/domain/Order.js +2 -0
  157. package/dist/src/orders/domain/OrderItem.d.ts +53 -0
  158. package/dist/src/orders/domain/OrderItem.js +2 -0
  159. package/dist/src/orders/domain/posDto/SquareOrder.d.ts +347 -0
  160. package/dist/src/orders/domain/posDto/SquareOrder.js +8 -0
  161. package/dist/src/orders/index.d.ts +7 -0
  162. package/dist/src/orders/index.js +25 -0
  163. package/dist/src/orders/ioc/index.d.ts +3 -0
  164. package/dist/src/orders/ioc/index.js +6 -0
  165. package/dist/src/orders/services/square/SquareOrderService.d.ts +22 -0
  166. package/dist/src/orders/services/square/SquareOrderService.js +4 -0
  167. package/dist/src/orders/services/square/SquareOrderServiceImpl.d.ts +32 -0
  168. package/dist/src/orders/services/square/SquareOrderServiceImpl.js +308 -0
  169. package/jest.config.js +8 -0
  170. package/package.json +43 -0
  171. package/src/enums/domain/DayOfWeek.ts +9 -0
  172. package/src/enums/domain/Delivery.ts +20 -0
  173. package/src/enums/domain/Employee.ts +12 -0
  174. package/src/enums/domain/Ingredient.ts +33 -0
  175. package/src/enums/domain/Inventory.ts +39 -0
  176. package/src/enums/domain/Kitchen.ts +89 -0
  177. package/src/enums/domain/Menu.ts +14 -0
  178. package/src/enums/domain/Payments.ts +41 -0
  179. package/src/enums/domain/Recipe.ts +15 -0
  180. package/src/enums/domain/Reservation.ts +18 -0
  181. package/src/enums/domain/Restaurant.ts +41 -0
  182. package/src/enums/domain/Table.ts +39 -0
  183. package/src/enums/domain/Vendors.ts +45 -0
  184. package/src/enums/index.ts +13 -0
  185. package/src/eventBridge/EventBridgeModule.ts +14 -0
  186. package/src/eventBridge/domain/EventBridgeOptions.ts +8 -0
  187. package/src/eventBridge/ioc/index.ts +3 -0
  188. package/src/eventBridge/ioc.ts +3 -0
  189. package/src/eventBridge/service/EventBridgeService.ts +8 -0
  190. package/src/eventBridge/service/EventBridgeServiceImpl.ts +67 -0
  191. package/src/events/domain/CustomerEvents.ts +79 -0
  192. package/src/events/domain/DeliveryEvents.ts +82 -0
  193. package/src/events/domain/DomainEvent.ts +17 -0
  194. package/src/events/domain/DomainEventType.ts +143 -0
  195. package/src/events/domain/EmployeeEvents.ts +74 -0
  196. package/src/events/domain/InventoryEvents.ts +184 -0
  197. package/src/events/domain/OrderEvents.ts +142 -0
  198. package/src/events/domain/PaymentEvents.ts +92 -0
  199. package/src/events/domain/RecipeEvents.ts +64 -0
  200. package/src/events/domain/ReservationEvents.ts +133 -0
  201. package/src/events/domain/RestaurantEvents.ts +89 -0
  202. package/src/events/domain/TableEvents.ts +102 -0
  203. package/src/events/domain/VendorEvents.ts +42 -0
  204. package/src/events/index.ts +13 -0
  205. package/src/index.ts +4 -0
  206. package/src/interfaces/domain/Address.ts +7 -0
  207. package/src/interfaces/domain/Customer.ts +33 -0
  208. package/src/interfaces/domain/Delivery.ts +96 -0
  209. package/src/interfaces/domain/Employee.ts +29 -0
  210. package/src/interfaces/domain/Ingredient.ts +68 -0
  211. package/src/interfaces/domain/Inventory.ts +52 -0
  212. package/src/interfaces/domain/Kitchen.ts +128 -0
  213. package/src/interfaces/domain/Location.ts +20 -0
  214. package/src/interfaces/domain/Menu.ts +121 -0
  215. package/src/interfaces/domain/Money.ts +6 -0
  216. package/src/interfaces/domain/OpeningHours.ts +11 -0
  217. package/src/interfaces/domain/Payment.ts +45 -0
  218. package/src/interfaces/domain/Recipe.ts +91 -0
  219. package/src/interfaces/domain/Reservation.ts +45 -0
  220. package/src/interfaces/domain/Restaurant.ts +45 -0
  221. package/src/interfaces/domain/Table.ts +69 -0
  222. package/src/interfaces/domain/Vendor.ts +35 -0
  223. package/src/interfaces/index.ts +17 -0
  224. package/src/orders/OrderModule.ts +17 -0
  225. package/src/orders/domain/Enums.ts +17 -0
  226. package/src/orders/domain/Order.ts +109 -0
  227. package/src/orders/domain/OrderItem.ts +68 -0
  228. package/src/orders/domain/posDto/SquareOrder.ts +346 -0
  229. package/src/orders/index.ts +7 -0
  230. package/src/orders/ioc/index.ts +3 -0
  231. package/src/orders/services/square/SquareOrderService.ts +27 -0
  232. package/src/orders/services/square/SquareOrderServiceImpl.ts +330 -0
  233. package/tsconfig.json +18 -0
@@ -0,0 +1,41 @@
1
+ export enum RestaurantType {
2
+ RESTAURANT = "RESTAURANT",
3
+ CAFE = "CAFE",
4
+ BAR = "BAR",
5
+ FOOD_TRUCK = "FOOD_TRUCK",
6
+ BAKERY = "BAKERY",
7
+ FAST_FOOD = "FAST_FOOD",
8
+ FINE_DINING = "FINE_DINING",
9
+ TAKEAWAY = "TAKEAWAY",
10
+ CLOUD_KITCHEN = "CLOUD_KITCHEN",
11
+ BUFFET = "BUFFET"
12
+ }
13
+
14
+ export enum RestaurantStatus {
15
+ ACTIVE = "ACTIVE",
16
+ INACTIVE = "INACTIVE",
17
+ CLOSED = "CLOSED",
18
+ SUSPENDED = "SUSPENDED"
19
+ }
20
+
21
+ export enum CuisineType {
22
+ AFRICAN = "AFRICAN",
23
+ AMERICAN = "AMERICAN",
24
+ ASIAN = "ASIAN",
25
+ BBQ = "BBQ",
26
+ CHINESE = "CHINESE",
27
+ FRENCH = "FRENCH",
28
+ GREEK = "GREEK",
29
+ INDIAN = "INDIAN",
30
+ ITALIAN = "ITALIAN",
31
+ JAPANESE = "JAPANESE",
32
+ KOREAN = "KOREAN",
33
+ MEDITERRANEAN = "MEDITERRANEAN",
34
+ MEXICAN = "MEXICAN",
35
+ PIZZA = "PIZZA",
36
+ SEAFOOD = "SEAFOOD",
37
+ STEAKHOUSE = "STEAKHOUSE",
38
+ THAI = "THAI",
39
+ VEGAN = "VEGAN",
40
+ OTHER = "OTHER"
41
+ }
@@ -0,0 +1,39 @@
1
+ export enum TableStatus {
2
+ AVAILABLE = "AVAILABLE",
3
+
4
+ RESERVED = "RESERVED",
5
+
6
+ OCCUPIED = "OCCUPIED",
7
+
8
+ CLEANING = "CLEANING",
9
+
10
+ OUT_OF_SERVICE = "OUT_OF_SERVICE"
11
+ }
12
+
13
+ export enum TableArea {
14
+ MAIN_DINING = "MAIN_DINING",
15
+
16
+ PATIO = "PATIO",
17
+
18
+ BAR = "BAR",
19
+
20
+ PRIVATE_ROOM = "PRIVATE_ROOM",
21
+
22
+ TERRACE = "TERRACE",
23
+
24
+ OUTDOOR = "OUTDOOR"
25
+ }
26
+
27
+ export enum TableShape {
28
+ SQUARE = "SQUARE",
29
+
30
+ RECTANGLE = "RECTANGLE",
31
+
32
+ ROUND = "ROUND",
33
+
34
+ BOOTH = "BOOTH",
35
+
36
+ HIGH_TOP = "HIGH_TOP",
37
+
38
+ CUSTOM = "CUSTOM"
39
+ }
@@ -0,0 +1,45 @@
1
+ export enum Vendor {
2
+
3
+ TOAST = "TOAST",
4
+
5
+ SQUARE = "SQUARE",
6
+
7
+ CLOVER = "CLOVER",
8
+
9
+ LIGHTSPEED = "LIGHTSPEED",
10
+
11
+ ORACLE_SIMPHONY = "ORACLE_SIMPHONY",
12
+
13
+ NCR_ALOHA = "NCR_ALOHA",
14
+
15
+ PAR_BRINK = "PAR_BRINK",
16
+
17
+ TOUCHBISTRO = "TOUCHBISTRO",
18
+
19
+ UBER_EATS = "UBER_EATS",
20
+
21
+ DOORDASH = "DOORDASH",
22
+
23
+ SKIPTHEDISHES = "SKIPTHEDISHES",
24
+
25
+ CUSTOM = "CUSTOM",
26
+
27
+ GLOBAL_PAYMENTS = "GLOBAL_PAYMENTS"
28
+
29
+ }
30
+
31
+ export enum VendorStatus {
32
+ ACTIVE = "ACTIVE",
33
+ INACTIVE = "INACTIVE",
34
+ SUSPENDED = "SUSPENDED",
35
+ }
36
+
37
+ export enum VendorType {
38
+ FOOD_SUPPLIER = "FOOD_SUPPLIER",
39
+ BEVERAGE_SUPPLIER = "BEVERAGE_SUPPLIER",
40
+ EQUIPMENT_SUPPLIER = "EQUIPMENT_SUPPLIER",
41
+ PACKAGING_SUPPLIER = "PACKAGING_SUPPLIER",
42
+ CLEANING_SUPPLY = "CLEANING_SUPPLY",
43
+ TECHNOLOGY = "TECHNOLOGY",
44
+ OTHER = "OTHER",
45
+ }
@@ -0,0 +1,13 @@
1
+ export * from "./domain/DayOfWeek";
2
+ export * from "./domain/Employee";
3
+ export * from "./domain/Inventory";
4
+ export * from "./domain/Kitchen";
5
+ export * from "./domain/Menu";
6
+ export * from "./domain/Payments";
7
+ export * from "./domain/Recipe";
8
+ export * from "./domain/Restaurant";
9
+ export * from "./domain/Reservation";
10
+ export * from "./domain/Table";
11
+ export * from "./domain/Vendors";
12
+ export * from "./domain/Delivery";
13
+ export * from "./domain/Ingredient";
@@ -0,0 +1,14 @@
1
+ import { Module } from "@nestjs/common";
2
+ import { EventBridgeServiceImpl } from "./service/EventBridgeServiceImpl";
3
+ import { EventBridgeSymbols } from "./ioc";
4
+
5
+ @Module({
6
+ providers: [
7
+ {
8
+ provide: EventBridgeSymbols.EventBridgeService,
9
+ useClass: EventBridgeServiceImpl,
10
+ },
11
+ ],
12
+ exports: [EventBridgeSymbols.EventBridgeService],
13
+ })
14
+ export class EventBridgeModule {}
@@ -0,0 +1,8 @@
1
+ export interface EventBridgeOptions {
2
+ /** Name of the EventBridge event bus. */
3
+ eventBusName: string;
4
+ /** Source string used when publishing events (e.g. "com.myapp.orders"). */
5
+ source: string;
6
+ /** AWS region. Defaults to the AWS_REGION environment variable or "us-east-1". */
7
+ region?: string;
8
+ }
@@ -0,0 +1,3 @@
1
+ export const EventBridgeSymbols = {
2
+ EventBridgeService: Symbol('EventBridgeService'),
3
+ };
@@ -0,0 +1,3 @@
1
+ export const EventBridgeSymbols = {
2
+ EventBridgeService: Symbol("EventBridgeService"),
3
+ } as const;
@@ -0,0 +1,8 @@
1
+ import { DomainEvent } from "../../events/domain/DomainEvent";
2
+
3
+
4
+ export interface IEventBridgeService {
5
+
6
+ publish(event: DomainEvent): Promise<void>;
7
+ publishBatch(events: DomainEvent[]): Promise<void>;
8
+ }
@@ -0,0 +1,67 @@
1
+ import { Injectable, Logger } from "@nestjs/common";
2
+ import {
3
+ EventBridgeClient,
4
+ PutEventsCommand,
5
+ PutEventsRequestEntry,
6
+ } from "@aws-sdk/client-eventbridge";
7
+ import { DomainEvent } from "../../events/domain/DomainEvent";
8
+ import { IEventBridgeService } from "./EventBridgeService";
9
+ import { EventBridgeOptions } from "../domain/EventBridgeOptions";
10
+
11
+ /** Max entries per PutEvents call (AWS hard limit). */
12
+ const MAX_BATCH_SIZE = 10;
13
+
14
+ @Injectable()
15
+ export class EventBridgeServiceImpl implements IEventBridgeService {
16
+ private readonly logger = new Logger(EventBridgeServiceImpl.name);
17
+ private readonly client: EventBridgeClient;
18
+ private readonly eventBusName: string;
19
+ private readonly source: string;
20
+
21
+ constructor(
22
+ options: EventBridgeOptions,
23
+ ) {
24
+ this.eventBusName = options.eventBusName;
25
+ this.source = options.source;
26
+ this.client = new EventBridgeClient({ region: options.region ?? process.env.AWS_REGION ?? "us-east-1" });
27
+ }
28
+
29
+ async publish(event: DomainEvent): Promise<void> {
30
+ await this.publishBatch([event]);
31
+ }
32
+
33
+ async publishBatch(events: DomainEvent[]): Promise<void> {
34
+ if (events.length === 0) return;
35
+
36
+ // Split into chunks of MAX_BATCH_SIZE
37
+ for (let i = 0; i < events.length; i += MAX_BATCH_SIZE) {
38
+ const chunk = events.slice(i, i + MAX_BATCH_SIZE);
39
+ await this.putEvents(chunk);
40
+ }
41
+ }
42
+
43
+ private async putEvents(events: DomainEvent[]): Promise<void> {
44
+ const entries: PutEventsRequestEntry[] = events.map((event) => ({
45
+ EventBusName: this.eventBusName,
46
+ Source: this.source,
47
+ DetailType: event.eventType,
48
+ Detail: JSON.stringify(event),
49
+ Time: event.occurredAt,
50
+ }));
51
+
52
+ const command = new PutEventsCommand({ Entries: entries });
53
+ const response = await this.client.send(command);
54
+
55
+ const failed = response.FailedEntryCount ?? 0;
56
+ if (failed > 0) {
57
+ const failures = (response.Entries ?? [])
58
+ .filter((e) => e.ErrorCode)
59
+ .map((e) => `${e.ErrorCode}: ${e.ErrorMessage}`)
60
+ .join(", ");
61
+ this.logger.error(`EventBridge: ${failed} event(s) failed to publish — ${failures}`);
62
+ throw new Error(`Failed to publish ${failed} event(s) to EventBridge: ${failures}`);
63
+ }
64
+
65
+ this.logger.debug(`EventBridge: published ${events.length} event(s) to bus "${this.eventBusName}"`);
66
+ }
67
+ }
@@ -0,0 +1,79 @@
1
+ import { DomainEvent } from "./DomainEvent";
2
+ import { ICustomer } from "../../interfaces/domain/Customer";
3
+
4
+ // ─── Lifecycle Events ──────────────────────────────────────────────────────────
5
+
6
+ export interface CustomerCreated extends DomainEvent {
7
+ eventType: "CustomerCreated";
8
+ aggregateType: "Customer";
9
+ customer: ICustomer;
10
+ }
11
+
12
+ export interface CustomerUpdated extends DomainEvent {
13
+ eventType: "CustomerUpdated";
14
+ aggregateType: "Customer";
15
+ before: Partial<ICustomer>;
16
+ after: Partial<ICustomer>;
17
+ }
18
+
19
+ export interface CustomerDeleted extends DomainEvent {
20
+ eventType: "CustomerDeleted";
21
+ aggregateType: "Customer";
22
+ deletedAt: Date;
23
+ }
24
+
25
+ // ─── Account Events ────────────────────────────────────────────────────────────
26
+
27
+ export interface CustomerBlocked extends DomainEvent {
28
+ eventType: "CustomerBlocked";
29
+ aggregateType: "Customer";
30
+ reason?: string;
31
+ blockedAt: Date;
32
+ }
33
+
34
+ export interface CustomerMerged extends DomainEvent {
35
+ eventType: "CustomerMerged";
36
+ aggregateType: "Customer";
37
+ /** The customer ID that was merged into this one and is now superseded. */
38
+ sourceCustomerId: string;
39
+ mergedAt: Date;
40
+ }
41
+
42
+ // ─── Loyalty Events ────────────────────────────────────────────────────────────
43
+
44
+ export interface CustomerLoyaltyPointsAdded extends DomainEvent {
45
+ eventType: "CustomerLoyaltyPointsAdded";
46
+ aggregateType: "Customer";
47
+ pointsAdded: number;
48
+ newBalance: number;
49
+ reason?: string;
50
+ }
51
+
52
+ export interface CustomerLoyaltyPointsRedeemed extends DomainEvent {
53
+ eventType: "CustomerLoyaltyPointsRedeemed";
54
+ aggregateType: "Customer";
55
+ pointsRedeemed: number;
56
+ newBalance: number;
57
+ orderId?: string;
58
+ }
59
+
60
+ export interface CustomerMembershipCreated extends DomainEvent {
61
+ eventType: "CustomerMembershipCreated";
62
+ aggregateType: "Customer";
63
+ membershipId: string;
64
+ tier: string;
65
+ startDate: Date;
66
+ expiresAt?: Date;
67
+ }
68
+
69
+ // ─── Union Type ────────────────────────────────────────────────────────────────
70
+
71
+ export type CustomerEvent =
72
+ | CustomerCreated
73
+ | CustomerUpdated
74
+ | CustomerDeleted
75
+ | CustomerBlocked
76
+ | CustomerMerged
77
+ | CustomerLoyaltyPointsAdded
78
+ | CustomerLoyaltyPointsRedeemed
79
+ | CustomerMembershipCreated;
@@ -0,0 +1,82 @@
1
+ import { DomainEvent } from "./DomainEvent";
2
+ import { IDelivery, IDeliveryDriver } from "../../interfaces/domain/Delivery";
3
+ import { DeliveryStatus } from "../../enums/domain/Delivery";
4
+
5
+ // ─── Lifecycle Events ──────────────────────────────────────────────────────────
6
+
7
+ export interface DeliveryCreated extends DomainEvent {
8
+ eventType: "DeliveryCreated";
9
+ aggregateType: "Delivery";
10
+ delivery: IDelivery;
11
+ }
12
+
13
+ export interface DeliveryAssigned extends DomainEvent {
14
+ eventType: "DeliveryAssigned";
15
+ aggregateType: "Delivery";
16
+ driver: IDeliveryDriver;
17
+ assignedAt: Date;
18
+ estimatedPickupMinutes?: number;
19
+ }
20
+
21
+ export interface DeliveryAccepted extends DomainEvent {
22
+ eventType: "DeliveryAccepted";
23
+ aggregateType: "Delivery";
24
+ driver: IDeliveryDriver;
25
+ acceptedAt: Date;
26
+ estimatedDeliveryMinutes?: number;
27
+ }
28
+
29
+ export interface DeliveryPickedUp extends DomainEvent {
30
+ eventType: "DeliveryPickedUp";
31
+ aggregateType: "Delivery";
32
+ pickedUpAt: Date;
33
+ estimatedArrivalAt?: Date;
34
+ }
35
+
36
+ export interface DeliveryInTransit extends DomainEvent {
37
+ eventType: "DeliveryInTransit";
38
+ aggregateType: "Delivery";
39
+ latitude?: number;
40
+ longitude?: number;
41
+ estimatedArrivalAt?: Date;
42
+ updatedAt: Date;
43
+ }
44
+
45
+ export interface DeliveryDelivered extends DomainEvent {
46
+ eventType: "DeliveryDelivered";
47
+ aggregateType: "Delivery";
48
+ deliveredAt: Date;
49
+ /** Proof-of-delivery image URL, if captured. */
50
+ proofOfDeliveryUrl?: string;
51
+ recipientName?: string;
52
+ }
53
+
54
+ export interface DeliveryCancelled extends DomainEvent {
55
+ eventType: "DeliveryCancelled";
56
+ aggregateType: "Delivery";
57
+ previousStatus: DeliveryStatus;
58
+ reason?: string;
59
+ cancelledBy?: string;
60
+ cancelledAt: Date;
61
+ }
62
+
63
+ export interface DeliveryFailed extends DomainEvent {
64
+ eventType: "DeliveryFailed";
65
+ aggregateType: "Delivery";
66
+ previousStatus: DeliveryStatus;
67
+ reason?: string;
68
+ errorCode?: string;
69
+ failedAt: Date;
70
+ }
71
+
72
+ // ─── Union Type ────────────────────────────────────────────────────────────────
73
+
74
+ export type DeliveryEvent =
75
+ | DeliveryCreated
76
+ | DeliveryAssigned
77
+ | DeliveryAccepted
78
+ | DeliveryPickedUp
79
+ | DeliveryInTransit
80
+ | DeliveryDelivered
81
+ | DeliveryCancelled
82
+ | DeliveryFailed;
@@ -0,0 +1,17 @@
1
+ export interface DomainEvent {
2
+ eventId: string;
3
+ aggregateId: string;
4
+ aggregateType: string;
5
+
6
+ eventType: string;
7
+ version: number;
8
+
9
+ occurredAt: Date;
10
+
11
+ restaurantId: string;
12
+
13
+ triggeredBy?: string;
14
+
15
+ correlationId?: string;
16
+ causationId?: string;
17
+ }
@@ -0,0 +1,143 @@
1
+ export enum AggregateType {
2
+ Customer = "Customer",
3
+ Delivery = "Delivery",
4
+ Employee = "Employee",
5
+ InventoryItem = "InventoryItem",
6
+ Order = "Order",
7
+ Payment = "Payment",
8
+ Recipe = "Recipe",
9
+ Reservation = "Reservation",
10
+ Restaurant = "Restaurant",
11
+ Table = "Table",
12
+ Vendor = "Vendor",
13
+ }
14
+
15
+ export enum DomainEventType {
16
+ // ─── Customer ─────────────────────────────────────────────────────────────
17
+ CustomerCreated = "CustomerCreated",
18
+ CustomerUpdated = "CustomerUpdated",
19
+ CustomerDeleted = "CustomerDeleted",
20
+ CustomerBlocked = "CustomerBlocked",
21
+ CustomerMerged = "CustomerMerged",
22
+ CustomerLoyaltyPointsAdded = "CustomerLoyaltyPointsAdded",
23
+ CustomerLoyaltyPointsRedeemed = "CustomerLoyaltyPointsRedeemed",
24
+ CustomerMembershipCreated = "CustomerMembershipCreated",
25
+
26
+ // ─── Delivery ─────────────────────────────────────────────────────────────
27
+ DeliveryCreated = "DeliveryCreated",
28
+ DeliveryAssigned = "DeliveryAssigned",
29
+ DeliveryAccepted = "DeliveryAccepted",
30
+ DeliveryPickedUp = "DeliveryPickedUp",
31
+ DeliveryInTransit = "DeliveryInTransit",
32
+ DeliveryDelivered = "DeliveryDelivered",
33
+ DeliveryCancelled = "DeliveryCancelled",
34
+ DeliveryFailed = "DeliveryFailed",
35
+
36
+ // ─── Employee ─────────────────────────────────────────────────────────────
37
+ EmployeeCreated = "EmployeeCreated",
38
+ EmployeeUpdated = "EmployeeUpdated",
39
+ EmployeeDeleted = "EmployeeDeleted",
40
+ EmployeeClockedIn = "EmployeeClockedIn",
41
+ EmployeeClockedOut = "EmployeeClockedOut",
42
+ EmployeeRoleChanged = "EmployeeRoleChanged",
43
+ EmployeeAssignedTable = "EmployeeAssignedTable",
44
+
45
+ // ─── Inventory ────────────────────────────────────────────────────────────
46
+ InventoryItemCreated = "InventoryItemCreated",
47
+ InventoryItemUpdated = "InventoryItemUpdated",
48
+ InventoryItemDeleted = "InventoryItemDeleted",
49
+ InventoryAdjusted = "InventoryAdjusted",
50
+ InventoryConsumed = "InventoryConsumed",
51
+ InventoryReceived = "InventoryReceived",
52
+ InventoryTransferred = "InventoryTransferred",
53
+ InventoryReturned = "InventoryReturned",
54
+ InventoryExpired = "InventoryExpired",
55
+ InventorySpoiled = "InventorySpoiled",
56
+ InventoryLowStock = "InventoryLowStock",
57
+ InventoryOutOfStock = "InventoryOutOfStock",
58
+ InventoryReplenished = "InventoryReplenished",
59
+ InventoryTransactionCreated = "InventoryTransactionCreated",
60
+ InventoryTransactionReversed = "InventoryTransactionReversed",
61
+
62
+ // ─── Order ────────────────────────────────────────────────────────────────
63
+ OrderCreated = "OrderCreated",
64
+ OrderUpdated = "OrderUpdated",
65
+ OrderSubmitted = "OrderSubmitted",
66
+ OrderConfirmed = "OrderConfirmed",
67
+ OrderRejected = "OrderRejected",
68
+ OrderCancelled = "OrderCancelled",
69
+ OrderCompleted = "OrderCompleted",
70
+ OrderReopened = "OrderReopened",
71
+ OrderClosed = "OrderClosed",
72
+
73
+ // ─── Order Item ───────────────────────────────────────────────────────────
74
+ OrderItemAdded = "OrderItemAdded",
75
+ OrderItemUpdated = "OrderItemUpdated",
76
+ OrderItemRemoved = "OrderItemRemoved",
77
+ OrderItemPrepared = "OrderItemPrepared",
78
+ OrderItemServed = "OrderItemServed",
79
+ OrderItemVoided = "OrderItemVoided",
80
+
81
+ // ─── Payment ──────────────────────────────────────────────────────────────
82
+ PaymentCreated = "PaymentCreated",
83
+ PaymentAuthorized = "PaymentAuthorized",
84
+ PaymentCaptured = "PaymentCaptured",
85
+ PaymentDeclined = "PaymentDeclined",
86
+ PaymentRefunded = "PaymentRefunded",
87
+ PaymentVoided = "PaymentVoided",
88
+ PaymentFailed = "PaymentFailed",
89
+
90
+ // ─── Recipe ───────────────────────────────────────────────────────────────
91
+ RecipeCreated = "RecipeCreated",
92
+ RecipeUpdated = "RecipeUpdated",
93
+ RecipeDeleted = "RecipeDeleted",
94
+ RecipeIngredientAdded = "RecipeIngredientAdded",
95
+ RecipeIngredientUpdated = "RecipeIngredientUpdated",
96
+ RecipeIngredientRemoved = "RecipeIngredientRemoved",
97
+
98
+ // ─── Reservation ──────────────────────────────────────────────────────────
99
+ ReservationCreated = "ReservationCreated",
100
+ ReservationConfirmed = "ReservationConfirmed",
101
+ ReservationRejected = "ReservationRejected",
102
+ ReservationUpdated = "ReservationUpdated",
103
+ ReservationCancelled = "ReservationCancelled",
104
+ ReservationCheckedIn = "ReservationCheckedIn",
105
+ ReservationSeated = "ReservationSeated",
106
+ ReservationCompleted = "ReservationCompleted",
107
+ ReservationNoShow = "ReservationNoShow",
108
+ ReservationTableAssigned = "ReservationTableAssigned",
109
+ ReservationTableChanged = "ReservationTableChanged",
110
+ WaitlistJoined = "WaitlistJoined",
111
+ WaitlistPromoted = "WaitlistPromoted",
112
+ WaitlistCancelled = "WaitlistCancelled",
113
+
114
+ // ─── Restaurant ───────────────────────────────────────────────────────────
115
+ RestaurantCreated = "RestaurantCreated",
116
+ RestaurantUpdated = "RestaurantUpdated",
117
+ RestaurantActivated = "RestaurantActivated",
118
+ RestaurantSuspended = "RestaurantSuspended",
119
+ RestaurantClosed = "RestaurantClosed",
120
+ RestaurantDeleted = "RestaurantDeleted",
121
+ RestaurantHoursUpdated = "RestaurantHoursUpdated",
122
+ RestaurantLocationUpdated = "RestaurantLocationUpdated",
123
+ RestaurantCapacityChanged = "RestaurantCapacityChanged",
124
+ RestaurantSettingsUpdated = "RestaurantSettingsUpdated",
125
+
126
+ // ─── Table ────────────────────────────────────────────────────────────────
127
+ TableCreated = "TableCreated",
128
+ TableUpdated = "TableUpdated",
129
+ TableOpened = "TableOpened",
130
+ TableOccupied = "TableOccupied",
131
+ TableReserved = "TableReserved",
132
+ TableReleased = "TableReleased",
133
+ TableMerged = "TableMerged",
134
+ TableSplit = "TableSplit",
135
+ TableOutOfService = "TableOutOfService",
136
+ TableReturnedToService = "TableReturnedToService",
137
+
138
+ // ─── Vendor ───────────────────────────────────────────────────────────────
139
+ VendorCreated = "VendorCreated",
140
+ VendorUpdated = "VendorUpdated",
141
+ VendorActivated = "VendorActivated",
142
+ VendorDeactivated = "VendorDeactivated",
143
+ }
@@ -0,0 +1,74 @@
1
+ import { DomainEvent } from "./DomainEvent";
2
+ import { IEmployee } from "../../interfaces/domain/Employee";
3
+ import { EmployeeRole } from "../../enums/domain/Employee";
4
+
5
+ // ─── Lifecycle Events ──────────────────────────────────────────────────────────
6
+
7
+ export interface EmployeeCreated extends DomainEvent {
8
+ eventType: "EmployeeCreated";
9
+ aggregateType: "Employee";
10
+ employee: IEmployee;
11
+ }
12
+
13
+ export interface EmployeeUpdated extends DomainEvent {
14
+ eventType: "EmployeeUpdated";
15
+ aggregateType: "Employee";
16
+ before: Partial<IEmployee>;
17
+ after: Partial<IEmployee>;
18
+ }
19
+
20
+ export interface EmployeeDeleted extends DomainEvent {
21
+ eventType: "EmployeeDeleted";
22
+ aggregateType: "Employee";
23
+ /** Snapshot of the employee at the time of deletion. */
24
+ employee: IEmployee;
25
+ deletedAt: Date;
26
+ deletedBy?: string;
27
+ }
28
+
29
+ // ─── Shift Events ──────────────────────────────────────────────────────────────
30
+
31
+ export interface EmployeeClockedIn extends DomainEvent {
32
+ eventType: "EmployeeClockedIn";
33
+ aggregateType: "Employee";
34
+ clockedInAt: Date;
35
+ locationId?: string;
36
+ }
37
+
38
+ export interface EmployeeClockedOut extends DomainEvent {
39
+ eventType: "EmployeeClockedOut";
40
+ aggregateType: "Employee";
41
+ clockedOutAt: Date;
42
+ /** Total minutes worked in the shift. */
43
+ shiftDurationMinutes?: number;
44
+ locationId?: string;
45
+ }
46
+
47
+ // ─── Role & Assignment Events ──────────────────────────────────────────────────
48
+
49
+ export interface EmployeeRoleChanged extends DomainEvent {
50
+ eventType: "EmployeeRoleChanged";
51
+ aggregateType: "Employee";
52
+ previousRole: EmployeeRole;
53
+ newRole: EmployeeRole;
54
+ changedBy?: string;
55
+ }
56
+
57
+ export interface EmployeeAssignedTable extends DomainEvent {
58
+ eventType: "EmployeeAssignedTable";
59
+ aggregateType: "Employee";
60
+ tableId: string;
61
+ assignedBy?: string;
62
+ assignedAt: Date;
63
+ }
64
+
65
+ // ─── Union Type ────────────────────────────────────────────────────────────────
66
+
67
+ export type EmployeeEvent =
68
+ | EmployeeCreated
69
+ | EmployeeUpdated
70
+ | EmployeeDeleted
71
+ | EmployeeClockedIn
72
+ | EmployeeClockedOut
73
+ | EmployeeRoleChanged
74
+ | EmployeeAssignedTable;