@sincpro/mobile 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 (232) hide show
  1. package/README.md +74 -0
  2. package/dist/adapters/Bluetooth.adapter.d.ts +14 -0
  3. package/dist/adapters/Bluetooth.adapter.js +100 -0
  4. package/dist/adapters/Geo.adapter.d.ts +8 -0
  5. package/dist/adapters/Geo.adapter.js +30 -0
  6. package/dist/adapters/JsonSerializer.adapter.d.ts +28 -0
  7. package/dist/adapters/JsonSerializer.adapter.js +47 -0
  8. package/dist/adapters/Network.adapter.d.ts +4 -0
  9. package/dist/adapters/Network.adapter.js +13 -0
  10. package/dist/adapters/ReceiptExporter.adapter.d.ts +19 -0
  11. package/dist/adapters/ReceiptExporter.adapter.js +142 -0
  12. package/dist/adapters/repositories/database_table.repository.d.ts +13 -0
  13. package/dist/adapters/repositories/database_table.repository.js +29 -0
  14. package/dist/adapters/repositories/domain_event.repository.d.ts +32 -0
  15. package/dist/adapters/repositories/domain_event.repository.js +147 -0
  16. package/dist/adapters/repositories/domain_event_dead_letter.repository.d.ts +23 -0
  17. package/dist/adapters/repositories/domain_event_dead_letter.repository.js +81 -0
  18. package/dist/adapters/repositories/setting.repository.d.ts +10 -0
  19. package/dist/adapters/repositories/setting.repository.js +21 -0
  20. package/dist/adapters/webview.adapter.d.ts +10 -0
  21. package/dist/adapters/webview.adapter.js +166 -0
  22. package/dist/domain/connectivity/bluetooth.d.ts +19 -0
  23. package/dist/domain/connectivity/bluetooth.js +1 -0
  24. package/dist/domain/connectivity/events.d.ts +17 -0
  25. package/dist/domain/connectivity/events.js +17 -0
  26. package/dist/domain/connectivity/geo.d.ts +4 -0
  27. package/dist/domain/connectivity/geo.js +1 -0
  28. package/dist/domain/connectivity/index.d.ts +3 -0
  29. package/dist/domain/connectivity/index.js +3 -0
  30. package/dist/domain/connectivity/network.d.ts +7 -0
  31. package/dist/domain/connectivity/network.js +1 -0
  32. package/dist/domain/database/database.d.ts +16 -0
  33. package/dist/domain/database/database.js +1 -0
  34. package/dist/domain/database/index.d.ts +2 -0
  35. package/dist/domain/database/index.js +2 -0
  36. package/dist/domain/database/repository.d.ts +19 -0
  37. package/dist/domain/database/repository.js +1 -0
  38. package/dist/domain/entity/entity.d.ts +109 -0
  39. package/dist/domain/entity/entity.js +246 -0
  40. package/dist/domain/entity/entity_collection.d.ts +396 -0
  41. package/dist/domain/entity/entity_collection.js +824 -0
  42. package/dist/domain/entity/index.d.ts +3 -0
  43. package/dist/domain/entity/index.js +3 -0
  44. package/dist/domain/entity/value_object.d.ts +12 -0
  45. package/dist/domain/entity/value_object.js +39 -0
  46. package/dist/domain/event_sourcing/domain_event.d.ts +58 -0
  47. package/dist/domain/event_sourcing/domain_event.js +164 -0
  48. package/dist/domain/event_sourcing/event.d.ts +25 -0
  49. package/dist/domain/event_sourcing/event.js +25 -0
  50. package/dist/domain/event_sourcing/event_handler.d.ts +7 -0
  51. package/dist/domain/event_sourcing/event_handler.js +13 -0
  52. package/dist/domain/event_sourcing/index.d.ts +2 -0
  53. package/dist/domain/event_sourcing/index.js +2 -0
  54. package/dist/domain/events.d.ts +33 -0
  55. package/dist/domain/events.js +32 -0
  56. package/dist/domain/icon.d.ts +1 -0
  57. package/dist/domain/icon.js +1 -0
  58. package/dist/domain/index.d.ts +9 -0
  59. package/dist/domain/index.js +9 -0
  60. package/dist/domain/print/driver_registry.d.ts +4 -0
  61. package/dist/domain/print/driver_registry.js +29 -0
  62. package/dist/domain/print/events.d.ts +13 -0
  63. package/dist/domain/print/events.js +13 -0
  64. package/dist/domain/print/index.d.ts +2 -0
  65. package/dist/domain/print/index.js +1 -0
  66. package/dist/domain/print/printer.d.ts +35 -0
  67. package/dist/domain/print/printer.js +1 -0
  68. package/dist/domain/receipt.d.ts +31 -0
  69. package/dist/domain/receipt.js +1 -0
  70. package/dist/domain/repositories.d.ts +6 -0
  71. package/dist/domain/repositories.js +7 -0
  72. package/dist/domain/settings.d.ts +7 -0
  73. package/dist/domain/settings.js +1 -0
  74. package/dist/domain/webview/events.d.ts +11 -0
  75. package/dist/domain/webview/events.js +11 -0
  76. package/dist/domain/webview/index.d.ts +1 -0
  77. package/dist/domain/webview/index.js +1 -0
  78. package/dist/domain/webview/webview.d.ts +57 -0
  79. package/dist/domain/webview/webview.js +9 -0
  80. package/dist/entrypoints/cron/Cron.d.ts +13 -0
  81. package/dist/entrypoints/cron/Cron.js +57 -0
  82. package/dist/entrypoints/cron/checkNetworkStatus.cron.d.ts +3 -0
  83. package/dist/entrypoints/cron/checkNetworkStatus.cron.js +10 -0
  84. package/dist/entrypoints/db/index.d.ts +2 -0
  85. package/dist/entrypoints/db/index.js +2 -0
  86. package/dist/entrypoints/db/migrations.d.ts +10 -0
  87. package/dist/entrypoints/db/migrations.js +115 -0
  88. package/dist/entrypoints/db/repositories.d.ts +8 -0
  89. package/dist/entrypoints/db/repositories.js +34 -0
  90. package/dist/entrypoints/queue/QueueProcessor.d.ts +12 -0
  91. package/dist/entrypoints/queue/QueueProcessor.js +75 -0
  92. package/dist/entrypoints/queue/activateDomain.subscriber.d.ts +7 -0
  93. package/dist/entrypoints/queue/activateDomain.subscriber.js +15 -0
  94. package/dist/entrypoints/queue/newAppSettings.handler.d.ts +7 -0
  95. package/dist/entrypoints/queue/newAppSettings.handler.js +17 -0
  96. package/dist/entrypoints/queue/printImage.subscriber.d.ts +7 -0
  97. package/dist/entrypoints/queue/printImage.subscriber.js +14 -0
  98. package/dist/entrypoints/queue/processWebViewMessage.subscriber.d.ts +7 -0
  99. package/dist/entrypoints/queue/processWebViewMessage.subscriber.js +23 -0
  100. package/dist/entrypoints/ui/AppShell.d.ts +15 -0
  101. package/dist/entrypoints/ui/AppShell.js +58 -0
  102. package/dist/entrypoints/ui/common_provider.d.ts +35 -0
  103. package/dist/entrypoints/ui/common_provider.js +244 -0
  104. package/dist/entrypoints/ui/domain_switcher.d.ts +19 -0
  105. package/dist/entrypoints/ui/domain_switcher.js +22 -0
  106. package/dist/entrypoints/ui/theme.d.ts +15 -0
  107. package/dist/entrypoints/ui/theme.js +16 -0
  108. package/dist/exceptions.d.ts +22 -0
  109. package/dist/exceptions.js +60 -0
  110. package/dist/framework/base_module.d.ts +14 -0
  111. package/dist/framework/base_module.js +40 -0
  112. package/dist/framework/createApp.d.ts +6 -0
  113. package/dist/framework/createApp.js +9 -0
  114. package/dist/framework/domain_module.d.ts +13 -0
  115. package/dist/framework/domain_module.js +18 -0
  116. package/dist/framework/kernel.d.ts +18 -0
  117. package/dist/framework/kernel.js +60 -0
  118. package/dist/framework/orchestrator.d.ts +29 -0
  119. package/dist/framework/orchestrator.js +118 -0
  120. package/dist/index.d.ts +16 -0
  121. package/dist/index.js +11 -0
  122. package/dist/infrastructure/database/connector.d.ts +13 -0
  123. package/dist/infrastructure/database/connector.js +165 -0
  124. package/dist/infrastructure/database/index.d.ts +2 -0
  125. package/dist/infrastructure/database/index.js +2 -0
  126. package/dist/infrastructure/database/mapped.d.ts +128 -0
  127. package/dist/infrastructure/database/mapped.js +174 -0
  128. package/dist/infrastructure/database/utils.d.ts +10 -0
  129. package/dist/infrastructure/database/utils.js +35 -0
  130. package/dist/infrastructure/logger.d.ts +45 -0
  131. package/dist/infrastructure/logger.js +125 -0
  132. package/dist/infrastructure/ui/ToastHost.d.ts +1 -0
  133. package/dist/infrastructure/ui/ToastHost.js +19 -0
  134. package/dist/infrastructure/ui/UIEventBus.d.ts +12 -0
  135. package/dist/infrastructure/ui/UIEventBus.js +65 -0
  136. package/dist/infrastructure/ui/errorHandler.d.ts +1 -0
  137. package/dist/infrastructure/ui/errorHandler.js +20 -0
  138. package/dist/infrastructure/ui/events.d.ts +1 -0
  139. package/dist/infrastructure/ui/events.js +1 -0
  140. package/dist/infrastructure/workers/CronWorker.d.ts +42 -0
  141. package/dist/infrastructure/workers/CronWorker.js +143 -0
  142. package/dist/infrastructure/workers/EventBus.d.ts +67 -0
  143. package/dist/infrastructure/workers/EventBus.js +279 -0
  144. package/dist/infrastructure/workers/index.d.ts +2 -0
  145. package/dist/infrastructure/workers/index.js +2 -0
  146. package/dist/services/bluetooth.service.d.ts +14 -0
  147. package/dist/services/bluetooth.service.js +72 -0
  148. package/dist/services/database_table.service.d.ts +8 -0
  149. package/dist/services/database_table.service.js +19 -0
  150. package/dist/services/dead_letter_queue.service.d.ts +38 -0
  151. package/dist/services/dead_letter_queue.service.js +99 -0
  152. package/dist/services/event.service.d.ts +7 -0
  153. package/dist/services/event.service.js +24 -0
  154. package/dist/services/network.service.d.ts +7 -0
  155. package/dist/services/network.service.js +43 -0
  156. package/dist/services/printer.service.d.ts +25 -0
  157. package/dist/services/printer.service.js +220 -0
  158. package/dist/services/webview.service.d.ts +17 -0
  159. package/dist/services/webview.service.js +59 -0
  160. package/dist/tools/utils/Initials.d.ts +1 -0
  161. package/dist/tools/utils/Initials.js +12 -0
  162. package/dist/tools/utils/collections.d.ts +120 -0
  163. package/dist/tools/utils/collections.js +158 -0
  164. package/dist/tools/utils/date.d.ts +70 -0
  165. package/dist/tools/utils/date.js +126 -0
  166. package/dist/tools/utils/maps.d.ts +4 -0
  167. package/dist/tools/utils/maps.js +20 -0
  168. package/dist/tools/utils/monetary.d.ts +3 -0
  169. package/dist/tools/utils/monetary.js +31 -0
  170. package/dist/tools/utils/quantity.d.ts +11 -0
  171. package/dist/tools/utils/quantity.js +44 -0
  172. package/dist/tools/utils/searchTools.d.ts +39 -0
  173. package/dist/tools/utils/searchTools.js +56 -0
  174. package/dist/tools/utils/serializer.d.ts +2 -0
  175. package/dist/tools/utils/serializer.js +44 -0
  176. package/dist/ui/components/atoms/DebugBanner.d.ts +2 -0
  177. package/dist/ui/components/atoms/DebugBanner.js +15 -0
  178. package/dist/ui/components/atoms/index.d.ts +1 -0
  179. package/dist/ui/components/atoms/index.js +1 -0
  180. package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.d.ts +8 -0
  181. package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.js +61 -0
  182. package/dist/ui/components/molecules/DeadLetterErrorBlock.d.ts +8 -0
  183. package/dist/ui/components/molecules/DeadLetterErrorBlock.js +14 -0
  184. package/dist/ui/components/molecules/EventTimelineItem.d.ts +7 -0
  185. package/dist/ui/components/molecules/EventTimelineItem.js +65 -0
  186. package/dist/ui/components/molecules/ProcessToast.d.ts +5 -0
  187. package/dist/ui/components/molecules/ProcessToast.js +51 -0
  188. package/dist/ui/components/molecules/ProcessToastProvider.d.ts +4 -0
  189. package/dist/ui/components/molecules/ProcessToastProvider.js +5 -0
  190. package/dist/ui/components/molecules/index.d.ts +5 -0
  191. package/dist/ui/components/molecules/index.js +5 -0
  192. package/dist/ui/components/organisms/BluetoothPrinterSelector.d.ts +7 -0
  193. package/dist/ui/components/organisms/BluetoothPrinterSelector.js +92 -0
  194. package/dist/ui/components/organisms/DatabaseInfoRow.d.ts +11 -0
  195. package/dist/ui/components/organisms/DatabaseInfoRow.js +8 -0
  196. package/dist/ui/components/organisms/DeadLetterQueueRow.d.ts +7 -0
  197. package/dist/ui/components/organisms/DeadLetterQueueRow.js +72 -0
  198. package/dist/ui/components/organisms/EventRow.d.ts +7 -0
  199. package/dist/ui/components/organisms/EventRow.js +90 -0
  200. package/dist/ui/components/organisms/InjectableWebView.d.ts +35 -0
  201. package/dist/ui/components/organisms/InjectableWebView.js +169 -0
  202. package/dist/ui/components/organisms/Receipt.d.ts +11 -0
  203. package/dist/ui/components/organisms/Receipt.js +207 -0
  204. package/dist/ui/components/organisms/TableInfoInfoRow.d.ts +9 -0
  205. package/dist/ui/components/organisms/TableInfoInfoRow.js +19 -0
  206. package/dist/ui/components/organisms/index.d.ts +7 -0
  207. package/dist/ui/components/organisms/index.js +7 -0
  208. package/dist/ui/index.d.ts +4 -0
  209. package/dist/ui/index.js +4 -0
  210. package/dist/ui/layouts/router_layouts.d.ts +17 -0
  211. package/dist/ui/layouts/router_layouts.js +20 -0
  212. package/dist/ui/screens/database/database.context.d.ts +32 -0
  213. package/dist/ui/screens/database/database.context.js +158 -0
  214. package/dist/ui/screens/database/database.json_detail.d.ts +2 -0
  215. package/dist/ui/screens/database/database.json_detail.js +19 -0
  216. package/dist/ui/screens/database/database.list.d.ts +1 -0
  217. package/dist/ui/screens/database/database.list.js +41 -0
  218. package/dist/ui/screens/database/database.table_rows.d.ts +2 -0
  219. package/dist/ui/screens/database/database.table_rows.js +10 -0
  220. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.context.d.ts +34 -0
  221. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.context.js +166 -0
  222. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.list.d.ts +2 -0
  223. package/dist/ui/screens/dead_letter_queue/dead_letter_queue.list.js +24 -0
  224. package/dist/ui/screens/events/events.context.d.ts +25 -0
  225. package/dist/ui/screens/events/events.context.js +113 -0
  226. package/dist/ui/screens/events/events.list.d.ts +1 -0
  227. package/dist/ui/screens/events/events.list.js +26 -0
  228. package/dist/ui/screens/events/index.d.ts +1 -0
  229. package/dist/ui/screens/events/index.js +1 -0
  230. package/dist/ui/screens/index.d.ts +3 -0
  231. package/dist/ui/screens/index.js +3 -0
  232. package/package.json +125 -0
@@ -0,0 +1,109 @@
1
+ import { type DomainEvent, type DomainEventClass, type EventData } from "../../domain/event_sourcing/domain_event";
2
+ import { IValueObject, ValueObject } from "./value_object";
3
+ export declare enum ERemoteState {
4
+ SYNCED = "SYNCED",
5
+ PENDING = "PENDING",
6
+ FAILED = "FAILED"
7
+ }
8
+ export interface IRemote {
9
+ remoteId?: number;
10
+ remoteRef?: string;
11
+ remoteState: ERemoteState;
12
+ fromRemoteDTO: (data: any) => this;
13
+ mergeWithRemote: (data: this) => void;
14
+ remotePayload(): any;
15
+ }
16
+ export interface IEventSourced {
17
+ addDomainEvent<T extends DomainEvent>(EventClass: DomainEventClass<T>, payload?: EventData<T>): string;
18
+ addDomainEventWithEntity<T extends DomainEvent>(EventClass: DomainEventClass<T>): string;
19
+ getDomainEvents(): readonly DomainEvent[];
20
+ clearDomainEvents(): void;
21
+ publishAllDomainEvents(): Promise<void>;
22
+ publishAllDomainEventsSync(): Promise<void>;
23
+ publishDomainEvent<T extends DomainEvent>(EventClass: DomainEventClass<T>, payload: Partial<T>): Promise<void>;
24
+ publishDomainEventSync<T extends DomainEvent>(EventClass: DomainEventClass<T>, payload: Partial<T>): Promise<void>;
25
+ publishDomainEventWithEntity<T extends DomainEvent>(EventClass: DomainEventClass<T>): Promise<void>;
26
+ publishDomainEventWithEntitySync<T extends DomainEvent>(EventClass: DomainEventClass<T>): Promise<void>;
27
+ publishEventWith<T extends DomainEvent>(EventClass: DomainEventClass<T>, selector: (entity: this) => Partial<T>): Promise<void>;
28
+ publishEventWithSync<T extends DomainEvent>(EventClass: DomainEventClass<T>, selector: (entity: this) => Partial<T>): Promise<void>;
29
+ copyDomainEventsFrom(source: Entity): void;
30
+ }
31
+ export interface IEntity extends IEventSourced, IValueObject {
32
+ uuid: string;
33
+ name?: string;
34
+ eventIds: string[];
35
+ equals(other: IEntity): boolean;
36
+ clone(): this;
37
+ }
38
+ export interface IEntityRemote extends IEntity, IRemote {
39
+ }
40
+ export declare class Entity extends ValueObject implements IEntity {
41
+ uuid: string;
42
+ name?: string;
43
+ eventIds: string[];
44
+ protected _domainEventsV2: DomainEvent[];
45
+ protected _correlationIdV2: string | null;
46
+ protected readonly REPOSITORY: string | null;
47
+ protected constructor();
48
+ static obj<T>(data?: Partial<T>): T;
49
+ /**
50
+ * Resolves domain events collection in runtime from repository.
51
+ * Uses @mapped decorator to automatically query events by eventIds.
52
+ * Returns fresh data on every access (no cache).
53
+ */
54
+ get events(): DomainEvent[];
55
+ /**
56
+ * Reloads this entity from database using its uuid.
57
+ * Returns a fresh copy with latest data from persistence layer.
58
+ *
59
+ * @returns Fresh entity instance from database
60
+ * @throws DomainValidationError if REPOSITORY is not defined in subclass
61
+ *
62
+ * @example
63
+ * const customer = await customerRepo.findById(uuid);
64
+ * // ... some time passes ...
65
+ * const refreshed = await customer.reload();
66
+ */
67
+ reload(): Promise<this>;
68
+ equals(other: any): boolean;
69
+ addDomainEvent<T extends DomainEvent>(EventClass: DomainEventClass<T>, payload?: EventData<T>): string;
70
+ addDomainEventWithEntity<T extends DomainEvent>(EventClass: DomainEventClass<T>): string;
71
+ getDomainEvents(): readonly DomainEvent[];
72
+ copyDomainEventsFrom(source: Entity): void;
73
+ clearDomainEvents(): void;
74
+ publishAllDomainEvents(): Promise<void>;
75
+ publishAllDomainEventsSync(): Promise<void>;
76
+ publishDomainEvent<T extends DomainEvent>(EventClass: DomainEventClass<T>, payload: Partial<T>): Promise<void>;
77
+ publishDomainEventSync<T extends DomainEvent>(EventClass: DomainEventClass<T>, payload: Partial<T>): Promise<void>;
78
+ publishDomainEventWithEntity<T extends DomainEvent>(EventClass: DomainEventClass<T>): Promise<void>;
79
+ publishDomainEventWithEntitySync<T extends DomainEvent>(EventClass: DomainEventClass<T>): Promise<void>;
80
+ publishEventWith<T extends DomainEvent>(EventClass: DomainEventClass<T>, selector: (entity: this) => Partial<T>): Promise<void>;
81
+ publishEventWithSync<T extends DomainEvent>(EventClass: DomainEventClass<T>, selector: (entity: this) => Partial<T>): Promise<void>;
82
+ }
83
+ export declare class RemoteEntity extends Entity implements IRemote {
84
+ remoteId?: number;
85
+ remoteRef?: string;
86
+ remoteState: ERemoteState;
87
+ protected constructor();
88
+ static fromRemoteDTO(data: any): RemoteEntity;
89
+ fromRemoteDTO(data: any): this;
90
+ /**
91
+ * Reloads this entity from database using its remoteId.
92
+ * Returns a fresh copy with latest data from persistence layer.
93
+ * Uses remote lookup (findByRemoteIdSync) instead of uuid.
94
+ *
95
+ * @returns Fresh entity instance from database
96
+ * @throws DomainValidationError if REPOSITORY is not defined in subclass
97
+ *
98
+ * @example
99
+ * const product = await productRepo.findByRemoteId(123);
100
+ * // ... some time passes ...
101
+ * const refreshed = await product.reloadByRemoteId();
102
+ */
103
+ reloadByRemoteId(): Promise<this>;
104
+ mergeWithRemote(data: this): void;
105
+ remotePayload(): any;
106
+ markAsSynced(): void;
107
+ markAsPending(): void;
108
+ markAsFailed(): void;
109
+ }
@@ -0,0 +1,246 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { ECommonRepository } from "../../domain/repositories";
11
+ import { DomainValidationError } from "../../exceptions";
12
+ import { mapped, resolveEntity } from "../../infrastructure/database";
13
+ import { generateUUID } from "../../infrastructure/database/utils";
14
+ import { loggerQueueProcessor } from "../../infrastructure/logger";
15
+ import { EventBus } from "../../infrastructure/workers";
16
+ import { ValueObject } from "./value_object";
17
+ export var ERemoteState;
18
+ (function (ERemoteState) {
19
+ ERemoteState["SYNCED"] = "SYNCED";
20
+ ERemoteState["PENDING"] = "PENDING";
21
+ ERemoteState["FAILED"] = "FAILED";
22
+ })(ERemoteState || (ERemoteState = {}));
23
+ export class Entity extends ValueObject {
24
+ uuid;
25
+ name;
26
+ eventIds = [];
27
+ _domainEventsV2 = [];
28
+ _correlationIdV2 = null;
29
+ REPOSITORY = null;
30
+ constructor() {
31
+ super();
32
+ }
33
+ static obj(data) {
34
+ const instance = new this();
35
+ if (data) {
36
+ Object.assign(instance, data);
37
+ }
38
+ if (!instance.uuid) {
39
+ instance.uuid = generateUUID();
40
+ }
41
+ return instance;
42
+ }
43
+ /**
44
+ * Resolves domain events collection in runtime from repository.
45
+ * Uses @mapped decorator to automatically query events by eventIds.
46
+ * Returns fresh data on every access (no cache).
47
+ */
48
+ get events() {
49
+ return [];
50
+ }
51
+ /**
52
+ * Reloads this entity from database using its uuid.
53
+ * Returns a fresh copy with latest data from persistence layer.
54
+ *
55
+ * @returns Fresh entity instance from database
56
+ * @throws DomainValidationError if REPOSITORY is not defined in subclass
57
+ *
58
+ * @example
59
+ * const customer = await customerRepo.findById(uuid);
60
+ * // ... some time passes ...
61
+ * const refreshed = await customer.reload();
62
+ */
63
+ async reload() {
64
+ if (!this.REPOSITORY) {
65
+ throw new DomainValidationError(`Entity ${this.constructor.name} does not have a repository defined for refreshing`);
66
+ }
67
+ return (await resolveEntity(this.REPOSITORY, this.uuid));
68
+ }
69
+ equals(other) {
70
+ if (!other)
71
+ return false;
72
+ if (!this.uuid || !other.uuid)
73
+ return false;
74
+ return this.uuid === other.uuid;
75
+ }
76
+ addDomainEvent(EventClass, payload) {
77
+ const event = EventClass.create(payload);
78
+ const existingEvent = this._domainEventsV2.find((e) => e.hasSameBusinessPayload(event));
79
+ if (existingEvent) {
80
+ loggerQueueProcessor.warn(`class ${this.constructor.name} - V2 Event: '${event.name}' with identical payload already exists for entity '${this.uuid}'. Skipping duplicate.`);
81
+ return existingEvent.uuid;
82
+ }
83
+ if (!this._correlationIdV2) {
84
+ this._correlationIdV2 = generateUUID();
85
+ }
86
+ event
87
+ .withAggregateId(this.uuid)
88
+ .withCorrelationId(this._correlationIdV2)
89
+ .withSequence(this._domainEventsV2.length + 1);
90
+ this._domainEventsV2.push(event);
91
+ this.eventIds.push(event.uuid);
92
+ return event.uuid;
93
+ }
94
+ addDomainEventWithEntity(EventClass) {
95
+ const event = EventClass.create({ record: this });
96
+ const existingEvent = this._domainEventsV2.find((e) => e.hasSameBusinessPayload(event));
97
+ if (existingEvent) {
98
+ loggerQueueProcessor.warn(`class ${this.constructor.name} - V2 Event: '${event.name}' with identical payload already exists for entity '${this.uuid}'. Skipping duplicate.`);
99
+ return existingEvent.uuid;
100
+ }
101
+ if (!this._correlationIdV2) {
102
+ this._correlationIdV2 = generateUUID();
103
+ }
104
+ event
105
+ .withAggregateId(this.uuid)
106
+ .withCorrelationId(this._correlationIdV2)
107
+ .withSequence(this._domainEventsV2.length + 1);
108
+ this._domainEventsV2.push(event);
109
+ this.eventIds.push(event.uuid);
110
+ return event.uuid;
111
+ }
112
+ getDomainEvents() {
113
+ return this._domainEventsV2.map((e) => e.clone());
114
+ }
115
+ copyDomainEventsFrom(source) {
116
+ for (const event of source.getDomainEvents()) {
117
+ const clonedEvent = event
118
+ .clone()
119
+ .withAggregateId(this.uuid)
120
+ .withCorrelationId(this._correlationIdV2 || generateUUID())
121
+ .withSequence(this._domainEventsV2.length + 1);
122
+ this._domainEventsV2.push(clonedEvent);
123
+ this.eventIds.push(clonedEvent.uuid);
124
+ }
125
+ }
126
+ clearDomainEvents() {
127
+ this._domainEventsV2 = [];
128
+ this._correlationIdV2 = null;
129
+ }
130
+ async publishAllDomainEvents() {
131
+ const events = this._domainEventsV2;
132
+ if (events.length > 1) {
133
+ loggerQueueProcessor.info(`class ${this.constructor.name} - Publishing total [${events.length}] V2 domain events for entity '${this.uuid}'`);
134
+ }
135
+ for (const event of events) {
136
+ await EventBus.publish(event);
137
+ }
138
+ this.clearDomainEvents();
139
+ }
140
+ async publishAllDomainEventsSync() {
141
+ const events = this._domainEventsV2;
142
+ if (events.length > 1) {
143
+ loggerQueueProcessor.info(`class ${this.constructor.name} - Publishing total [${events.length}] V2 domain events for entity '${this.uuid}'`);
144
+ }
145
+ const errors = [];
146
+ for (const event of events) {
147
+ try {
148
+ await EventBus.publishSync(event);
149
+ }
150
+ catch (error) {
151
+ loggerQueueProcessor.warn(`class ${this.constructor.name} - Error publishing V2 domain event '${event.name}' for entity '${this.uuid}': ${error.message}`);
152
+ errors.push(error);
153
+ }
154
+ }
155
+ this.clearDomainEvents();
156
+ if (errors.length > 0) {
157
+ const errorList = errors.map((e) => ` - ${e.message}`).join("\n");
158
+ throw new Error(`Errors occurred while publishing V2 domain events synchronously:\n${errorList}`);
159
+ }
160
+ }
161
+ async publishDomainEvent(EventClass, payload) {
162
+ this.addDomainEvent(EventClass, payload);
163
+ await this.publishAllDomainEvents();
164
+ }
165
+ async publishDomainEventSync(EventClass, payload) {
166
+ this.addDomainEvent(EventClass, payload);
167
+ await this.publishAllDomainEventsSync();
168
+ }
169
+ async publishDomainEventWithEntity(EventClass) {
170
+ this.addDomainEventWithEntity(EventClass);
171
+ await this.publishAllDomainEvents();
172
+ }
173
+ async publishDomainEventWithEntitySync(EventClass) {
174
+ this.addDomainEventWithEntity(EventClass);
175
+ await this.publishAllDomainEventsSync();
176
+ }
177
+ async publishEventWith(EventClass, selector) {
178
+ const event = EventClass.create(selector(this));
179
+ event.withAggregateId(this.uuid);
180
+ this._domainEventsV2.push(event);
181
+ await this.publishAllDomainEvents();
182
+ }
183
+ async publishEventWithSync(EventClass, selector) {
184
+ const event = EventClass.create(selector(this));
185
+ event.withAggregateId(this.uuid);
186
+ this._domainEventsV2.push(event);
187
+ await this.publishAllDomainEventsSync();
188
+ }
189
+ }
190
+ __decorate([
191
+ mapped(ECommonRepository.DOMAIN_EVENT, "eventIds"),
192
+ __metadata("design:type", Array),
193
+ __metadata("design:paramtypes", [])
194
+ ], Entity.prototype, "events", null);
195
+ export class RemoteEntity extends Entity {
196
+ remoteId;
197
+ remoteRef;
198
+ remoteState = ERemoteState.PENDING;
199
+ constructor() {
200
+ super();
201
+ }
202
+ static fromRemoteDTO(data) {
203
+ throw new Error(`${this.name}.fromRemoteDTO debe ser implementado`);
204
+ }
205
+ fromRemoteDTO(data) {
206
+ return this.constructor.fromRemoteDTO(data);
207
+ }
208
+ /**
209
+ * Reloads this entity from database using its remoteId.
210
+ * Returns a fresh copy with latest data from persistence layer.
211
+ * Uses remote lookup (findByRemoteIdSync) instead of uuid.
212
+ *
213
+ * @returns Fresh entity instance from database
214
+ * @throws DomainValidationError if REPOSITORY is not defined in subclass
215
+ *
216
+ * @example
217
+ * const product = await productRepo.findByRemoteId(123);
218
+ * // ... some time passes ...
219
+ * const refreshed = await product.reloadByRemoteId();
220
+ */
221
+ async reloadByRemoteId() {
222
+ if (!this.REPOSITORY) {
223
+ throw new DomainValidationError(`Entity ${this.constructor.name} does not have a repository defined for refreshing`);
224
+ }
225
+ return (await resolveEntity(this.REPOSITORY, this.remoteId, true));
226
+ }
227
+ mergeWithRemote(data) {
228
+ const preservedUuid = this.uuid;
229
+ const preservedEventIds = this.eventIds;
230
+ Object.assign(this, data);
231
+ this.uuid = preservedUuid;
232
+ this.eventIds = preservedEventIds;
233
+ }
234
+ remotePayload() {
235
+ throw new Error(`${this.name}.remotePayload debe ser implementado`);
236
+ }
237
+ markAsSynced() {
238
+ this.remoteState = ERemoteState.SYNCED;
239
+ }
240
+ markAsPending() {
241
+ this.remoteState = ERemoteState.PENDING;
242
+ }
243
+ markAsFailed() {
244
+ this.remoteState = ERemoteState.FAILED;
245
+ }
246
+ }