@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.
- package/README.md +74 -0
- package/dist/adapters/Bluetooth.adapter.d.ts +14 -0
- package/dist/adapters/Bluetooth.adapter.js +100 -0
- package/dist/adapters/Geo.adapter.d.ts +8 -0
- package/dist/adapters/Geo.adapter.js +30 -0
- package/dist/adapters/JsonSerializer.adapter.d.ts +28 -0
- package/dist/adapters/JsonSerializer.adapter.js +47 -0
- package/dist/adapters/Network.adapter.d.ts +4 -0
- package/dist/adapters/Network.adapter.js +13 -0
- package/dist/adapters/ReceiptExporter.adapter.d.ts +19 -0
- package/dist/adapters/ReceiptExporter.adapter.js +142 -0
- package/dist/adapters/repositories/database_table.repository.d.ts +13 -0
- package/dist/adapters/repositories/database_table.repository.js +29 -0
- package/dist/adapters/repositories/domain_event.repository.d.ts +32 -0
- package/dist/adapters/repositories/domain_event.repository.js +147 -0
- package/dist/adapters/repositories/domain_event_dead_letter.repository.d.ts +23 -0
- package/dist/adapters/repositories/domain_event_dead_letter.repository.js +81 -0
- package/dist/adapters/repositories/setting.repository.d.ts +10 -0
- package/dist/adapters/repositories/setting.repository.js +21 -0
- package/dist/adapters/webview.adapter.d.ts +10 -0
- package/dist/adapters/webview.adapter.js +166 -0
- package/dist/domain/connectivity/bluetooth.d.ts +19 -0
- package/dist/domain/connectivity/bluetooth.js +1 -0
- package/dist/domain/connectivity/events.d.ts +17 -0
- package/dist/domain/connectivity/events.js +17 -0
- package/dist/domain/connectivity/geo.d.ts +4 -0
- package/dist/domain/connectivity/geo.js +1 -0
- package/dist/domain/connectivity/index.d.ts +3 -0
- package/dist/domain/connectivity/index.js +3 -0
- package/dist/domain/connectivity/network.d.ts +7 -0
- package/dist/domain/connectivity/network.js +1 -0
- package/dist/domain/database/database.d.ts +16 -0
- package/dist/domain/database/database.js +1 -0
- package/dist/domain/database/index.d.ts +2 -0
- package/dist/domain/database/index.js +2 -0
- package/dist/domain/database/repository.d.ts +19 -0
- package/dist/domain/database/repository.js +1 -0
- package/dist/domain/entity/entity.d.ts +109 -0
- package/dist/domain/entity/entity.js +246 -0
- package/dist/domain/entity/entity_collection.d.ts +396 -0
- package/dist/domain/entity/entity_collection.js +824 -0
- package/dist/domain/entity/index.d.ts +3 -0
- package/dist/domain/entity/index.js +3 -0
- package/dist/domain/entity/value_object.d.ts +12 -0
- package/dist/domain/entity/value_object.js +39 -0
- package/dist/domain/event_sourcing/domain_event.d.ts +58 -0
- package/dist/domain/event_sourcing/domain_event.js +164 -0
- package/dist/domain/event_sourcing/event.d.ts +25 -0
- package/dist/domain/event_sourcing/event.js +25 -0
- package/dist/domain/event_sourcing/event_handler.d.ts +7 -0
- package/dist/domain/event_sourcing/event_handler.js +13 -0
- package/dist/domain/event_sourcing/index.d.ts +2 -0
- package/dist/domain/event_sourcing/index.js +2 -0
- package/dist/domain/events.d.ts +33 -0
- package/dist/domain/events.js +32 -0
- package/dist/domain/icon.d.ts +1 -0
- package/dist/domain/icon.js +1 -0
- package/dist/domain/index.d.ts +9 -0
- package/dist/domain/index.js +9 -0
- package/dist/domain/print/driver_registry.d.ts +4 -0
- package/dist/domain/print/driver_registry.js +29 -0
- package/dist/domain/print/events.d.ts +13 -0
- package/dist/domain/print/events.js +13 -0
- package/dist/domain/print/index.d.ts +2 -0
- package/dist/domain/print/index.js +1 -0
- package/dist/domain/print/printer.d.ts +35 -0
- package/dist/domain/print/printer.js +1 -0
- package/dist/domain/receipt.d.ts +31 -0
- package/dist/domain/receipt.js +1 -0
- package/dist/domain/repositories.d.ts +6 -0
- package/dist/domain/repositories.js +7 -0
- package/dist/domain/settings.d.ts +7 -0
- package/dist/domain/settings.js +1 -0
- package/dist/domain/webview/events.d.ts +11 -0
- package/dist/domain/webview/events.js +11 -0
- package/dist/domain/webview/index.d.ts +1 -0
- package/dist/domain/webview/index.js +1 -0
- package/dist/domain/webview/webview.d.ts +57 -0
- package/dist/domain/webview/webview.js +9 -0
- package/dist/entrypoints/cron/Cron.d.ts +13 -0
- package/dist/entrypoints/cron/Cron.js +57 -0
- package/dist/entrypoints/cron/checkNetworkStatus.cron.d.ts +3 -0
- package/dist/entrypoints/cron/checkNetworkStatus.cron.js +10 -0
- package/dist/entrypoints/db/index.d.ts +2 -0
- package/dist/entrypoints/db/index.js +2 -0
- package/dist/entrypoints/db/migrations.d.ts +10 -0
- package/dist/entrypoints/db/migrations.js +115 -0
- package/dist/entrypoints/db/repositories.d.ts +8 -0
- package/dist/entrypoints/db/repositories.js +34 -0
- package/dist/entrypoints/queue/QueueProcessor.d.ts +12 -0
- package/dist/entrypoints/queue/QueueProcessor.js +75 -0
- package/dist/entrypoints/queue/activateDomain.subscriber.d.ts +7 -0
- package/dist/entrypoints/queue/activateDomain.subscriber.js +15 -0
- package/dist/entrypoints/queue/newAppSettings.handler.d.ts +7 -0
- package/dist/entrypoints/queue/newAppSettings.handler.js +17 -0
- package/dist/entrypoints/queue/printImage.subscriber.d.ts +7 -0
- package/dist/entrypoints/queue/printImage.subscriber.js +14 -0
- package/dist/entrypoints/queue/processWebViewMessage.subscriber.d.ts +7 -0
- package/dist/entrypoints/queue/processWebViewMessage.subscriber.js +23 -0
- package/dist/entrypoints/ui/AppShell.d.ts +15 -0
- package/dist/entrypoints/ui/AppShell.js +58 -0
- package/dist/entrypoints/ui/common_provider.d.ts +35 -0
- package/dist/entrypoints/ui/common_provider.js +244 -0
- package/dist/entrypoints/ui/domain_switcher.d.ts +19 -0
- package/dist/entrypoints/ui/domain_switcher.js +22 -0
- package/dist/entrypoints/ui/theme.d.ts +15 -0
- package/dist/entrypoints/ui/theme.js +16 -0
- package/dist/exceptions.d.ts +22 -0
- package/dist/exceptions.js +60 -0
- package/dist/framework/base_module.d.ts +14 -0
- package/dist/framework/base_module.js +40 -0
- package/dist/framework/createApp.d.ts +6 -0
- package/dist/framework/createApp.js +9 -0
- package/dist/framework/domain_module.d.ts +13 -0
- package/dist/framework/domain_module.js +18 -0
- package/dist/framework/kernel.d.ts +18 -0
- package/dist/framework/kernel.js +60 -0
- package/dist/framework/orchestrator.d.ts +29 -0
- package/dist/framework/orchestrator.js +118 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +11 -0
- package/dist/infrastructure/database/connector.d.ts +13 -0
- package/dist/infrastructure/database/connector.js +165 -0
- package/dist/infrastructure/database/index.d.ts +2 -0
- package/dist/infrastructure/database/index.js +2 -0
- package/dist/infrastructure/database/mapped.d.ts +128 -0
- package/dist/infrastructure/database/mapped.js +174 -0
- package/dist/infrastructure/database/utils.d.ts +10 -0
- package/dist/infrastructure/database/utils.js +35 -0
- package/dist/infrastructure/logger.d.ts +45 -0
- package/dist/infrastructure/logger.js +125 -0
- package/dist/infrastructure/ui/ToastHost.d.ts +1 -0
- package/dist/infrastructure/ui/ToastHost.js +19 -0
- package/dist/infrastructure/ui/UIEventBus.d.ts +12 -0
- package/dist/infrastructure/ui/UIEventBus.js +65 -0
- package/dist/infrastructure/ui/errorHandler.d.ts +1 -0
- package/dist/infrastructure/ui/errorHandler.js +20 -0
- package/dist/infrastructure/ui/events.d.ts +1 -0
- package/dist/infrastructure/ui/events.js +1 -0
- package/dist/infrastructure/workers/CronWorker.d.ts +42 -0
- package/dist/infrastructure/workers/CronWorker.js +143 -0
- package/dist/infrastructure/workers/EventBus.d.ts +67 -0
- package/dist/infrastructure/workers/EventBus.js +279 -0
- package/dist/infrastructure/workers/index.d.ts +2 -0
- package/dist/infrastructure/workers/index.js +2 -0
- package/dist/services/bluetooth.service.d.ts +14 -0
- package/dist/services/bluetooth.service.js +72 -0
- package/dist/services/database_table.service.d.ts +8 -0
- package/dist/services/database_table.service.js +19 -0
- package/dist/services/dead_letter_queue.service.d.ts +38 -0
- package/dist/services/dead_letter_queue.service.js +99 -0
- package/dist/services/event.service.d.ts +7 -0
- package/dist/services/event.service.js +24 -0
- package/dist/services/network.service.d.ts +7 -0
- package/dist/services/network.service.js +43 -0
- package/dist/services/printer.service.d.ts +25 -0
- package/dist/services/printer.service.js +220 -0
- package/dist/services/webview.service.d.ts +17 -0
- package/dist/services/webview.service.js +59 -0
- package/dist/tools/utils/Initials.d.ts +1 -0
- package/dist/tools/utils/Initials.js +12 -0
- package/dist/tools/utils/collections.d.ts +120 -0
- package/dist/tools/utils/collections.js +158 -0
- package/dist/tools/utils/date.d.ts +70 -0
- package/dist/tools/utils/date.js +126 -0
- package/dist/tools/utils/maps.d.ts +4 -0
- package/dist/tools/utils/maps.js +20 -0
- package/dist/tools/utils/monetary.d.ts +3 -0
- package/dist/tools/utils/monetary.js +31 -0
- package/dist/tools/utils/quantity.d.ts +11 -0
- package/dist/tools/utils/quantity.js +44 -0
- package/dist/tools/utils/searchTools.d.ts +39 -0
- package/dist/tools/utils/searchTools.js +56 -0
- package/dist/tools/utils/serializer.d.ts +2 -0
- package/dist/tools/utils/serializer.js +44 -0
- package/dist/ui/components/atoms/DebugBanner.d.ts +2 -0
- package/dist/ui/components/atoms/DebugBanner.js +15 -0
- package/dist/ui/components/atoms/index.d.ts +1 -0
- package/dist/ui/components/atoms/index.js +1 -0
- package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.d.ts +8 -0
- package/dist/ui/components/molecules/BluetoothDeviceSelectorModal.js +61 -0
- package/dist/ui/components/molecules/DeadLetterErrorBlock.d.ts +8 -0
- package/dist/ui/components/molecules/DeadLetterErrorBlock.js +14 -0
- package/dist/ui/components/molecules/EventTimelineItem.d.ts +7 -0
- package/dist/ui/components/molecules/EventTimelineItem.js +65 -0
- package/dist/ui/components/molecules/ProcessToast.d.ts +5 -0
- package/dist/ui/components/molecules/ProcessToast.js +51 -0
- package/dist/ui/components/molecules/ProcessToastProvider.d.ts +4 -0
- package/dist/ui/components/molecules/ProcessToastProvider.js +5 -0
- package/dist/ui/components/molecules/index.d.ts +5 -0
- package/dist/ui/components/molecules/index.js +5 -0
- package/dist/ui/components/organisms/BluetoothPrinterSelector.d.ts +7 -0
- package/dist/ui/components/organisms/BluetoothPrinterSelector.js +92 -0
- package/dist/ui/components/organisms/DatabaseInfoRow.d.ts +11 -0
- package/dist/ui/components/organisms/DatabaseInfoRow.js +8 -0
- package/dist/ui/components/organisms/DeadLetterQueueRow.d.ts +7 -0
- package/dist/ui/components/organisms/DeadLetterQueueRow.js +72 -0
- package/dist/ui/components/organisms/EventRow.d.ts +7 -0
- package/dist/ui/components/organisms/EventRow.js +90 -0
- package/dist/ui/components/organisms/InjectableWebView.d.ts +35 -0
- package/dist/ui/components/organisms/InjectableWebView.js +169 -0
- package/dist/ui/components/organisms/Receipt.d.ts +11 -0
- package/dist/ui/components/organisms/Receipt.js +207 -0
- package/dist/ui/components/organisms/TableInfoInfoRow.d.ts +9 -0
- package/dist/ui/components/organisms/TableInfoInfoRow.js +19 -0
- package/dist/ui/components/organisms/index.d.ts +7 -0
- package/dist/ui/components/organisms/index.js +7 -0
- package/dist/ui/index.d.ts +4 -0
- package/dist/ui/index.js +4 -0
- package/dist/ui/layouts/router_layouts.d.ts +17 -0
- package/dist/ui/layouts/router_layouts.js +20 -0
- package/dist/ui/screens/database/database.context.d.ts +32 -0
- package/dist/ui/screens/database/database.context.js +158 -0
- package/dist/ui/screens/database/database.json_detail.d.ts +2 -0
- package/dist/ui/screens/database/database.json_detail.js +19 -0
- package/dist/ui/screens/database/database.list.d.ts +1 -0
- package/dist/ui/screens/database/database.list.js +41 -0
- package/dist/ui/screens/database/database.table_rows.d.ts +2 -0
- package/dist/ui/screens/database/database.table_rows.js +10 -0
- package/dist/ui/screens/dead_letter_queue/dead_letter_queue.context.d.ts +34 -0
- package/dist/ui/screens/dead_letter_queue/dead_letter_queue.context.js +166 -0
- package/dist/ui/screens/dead_letter_queue/dead_letter_queue.list.d.ts +2 -0
- package/dist/ui/screens/dead_letter_queue/dead_letter_queue.list.js +24 -0
- package/dist/ui/screens/events/events.context.d.ts +25 -0
- package/dist/ui/screens/events/events.context.js +113 -0
- package/dist/ui/screens/events/events.list.d.ts +1 -0
- package/dist/ui/screens/events/events.list.js +26 -0
- package/dist/ui/screens/events/index.d.ts +1 -0
- package/dist/ui/screens/events/index.js +1 -0
- package/dist/ui/screens/index.d.ts +3 -0
- package/dist/ui/screens/index.js +3 -0
- package/package.json +125 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { DomainEvent, EEventStatus } from "../../domain/event_sourcing";
|
|
2
|
+
import { ECommonRepository } from "../../domain/repositories";
|
|
3
|
+
import { DBCursor } from "../../infrastructure/database";
|
|
4
|
+
import { loggerRepositories } from "../../infrastructure/logger";
|
|
5
|
+
class DomainEventRepositoryImpl {
|
|
6
|
+
name = ECommonRepository.DOMAIN_EVENT;
|
|
7
|
+
table = "domain_events" /* DATABASE_TABLES.DOMAIN_EVENTS */;
|
|
8
|
+
async hasPendingDuplicate(event) {
|
|
9
|
+
if (event.correlationId) {
|
|
10
|
+
const existing = await DBCursor.getFirstAsync(`SELECT uuid FROM ${this.table}
|
|
11
|
+
WHERE name = ? AND correlation_id = ? AND status = ?
|
|
12
|
+
LIMIT 1`, event.name, event.correlationId, EEventStatus.PENDING);
|
|
13
|
+
return existing !== null;
|
|
14
|
+
}
|
|
15
|
+
const existing = await DBCursor.getFirstAsync(`SELECT uuid FROM ${this.table}
|
|
16
|
+
WHERE name = ? AND status = ? AND correlation_id IS NULL
|
|
17
|
+
LIMIT 1`, event.name, EEventStatus.PENDING);
|
|
18
|
+
return existing !== null;
|
|
19
|
+
}
|
|
20
|
+
async save(event) {
|
|
21
|
+
if (event.isPending) {
|
|
22
|
+
const isDuplicate = await this.hasPendingDuplicate(event);
|
|
23
|
+
if (isDuplicate) {
|
|
24
|
+
loggerRepositories.warn(`DomainEvent duplicated, skipping: ${event.name}`);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
await DBCursor.mutateDatabase(`INSERT OR REPLACE INTO ${this.table}
|
|
29
|
+
(uuid, name, label, data, requires_network, created_at, status, attempts, error_message, acknowledged_at, failed_at, aggregate_id, source_id, correlation_id, sequence)
|
|
30
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, event.uuid, event.name, event.label, event.asJSON(), event.requiresNetwork ? 1 : 0, event.createdAt, event.status, event.attempts, event.errorMessage, event.acknowledgedAt, event.failedAt, event.aggregateId, event.sourceId, event.correlationId, event.sequence);
|
|
31
|
+
loggerRepositories.debug(`DomainEvent saved: ${event.name} [${event.uuid}]`);
|
|
32
|
+
}
|
|
33
|
+
async saveMany(events) {
|
|
34
|
+
for (const event of events) {
|
|
35
|
+
await this.save(event);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async findById(uuid) {
|
|
39
|
+
const row = await DBCursor.getFirstAsync(`SELECT data FROM ${this.table} WHERE uuid = ?`, uuid);
|
|
40
|
+
return row ? DomainEvent.fromJSON(row.data) : null;
|
|
41
|
+
}
|
|
42
|
+
async findByIds(uuids) {
|
|
43
|
+
if (uuids.length === 0)
|
|
44
|
+
return [];
|
|
45
|
+
const placeholders = uuids.map(() => "?").join(",");
|
|
46
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table} WHERE uuid IN (${placeholders}) ORDER BY sequence ASC`, ...uuids);
|
|
47
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
48
|
+
}
|
|
49
|
+
async findNextPending(internetConnected) {
|
|
50
|
+
let row;
|
|
51
|
+
if (internetConnected) {
|
|
52
|
+
row = await DBCursor.getFirstAsync(`SELECT uuid, data FROM ${this.table}
|
|
53
|
+
WHERE status = ?
|
|
54
|
+
ORDER BY created_at ASC
|
|
55
|
+
LIMIT 1`, EEventStatus.PENDING);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
row = await DBCursor.getFirstAsync(`SELECT uuid, data FROM ${this.table}
|
|
59
|
+
WHERE status = ? AND requires_network = 0
|
|
60
|
+
ORDER BY created_at ASC
|
|
61
|
+
LIMIT 1`, EEventStatus.PENDING);
|
|
62
|
+
}
|
|
63
|
+
if (!row)
|
|
64
|
+
return null;
|
|
65
|
+
return DomainEvent.fromJSON(row.data);
|
|
66
|
+
}
|
|
67
|
+
async findByStatus(status) {
|
|
68
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
69
|
+
WHERE status = ?
|
|
70
|
+
ORDER BY created_at ASC`, status);
|
|
71
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
72
|
+
}
|
|
73
|
+
async findByStatuses(statuses) {
|
|
74
|
+
const placeholders = statuses.map(() => "?").join(",");
|
|
75
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
76
|
+
WHERE status IN (${placeholders})
|
|
77
|
+
ORDER BY created_at DESC`, ...statuses);
|
|
78
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
79
|
+
}
|
|
80
|
+
async findByCorrelationId(correlationId) {
|
|
81
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
82
|
+
WHERE correlation_id = ?
|
|
83
|
+
ORDER BY sequence ASC`, correlationId);
|
|
84
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
85
|
+
}
|
|
86
|
+
async findByAggregateId(aggregateId) {
|
|
87
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
88
|
+
WHERE aggregate_id = ?
|
|
89
|
+
ORDER BY created_at ASC`, aggregateId);
|
|
90
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
91
|
+
}
|
|
92
|
+
async findByName(name) {
|
|
93
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
94
|
+
WHERE name = ?
|
|
95
|
+
ORDER BY created_at ASC`, name);
|
|
96
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
97
|
+
}
|
|
98
|
+
async findPending() {
|
|
99
|
+
return this.findByStatus(EEventStatus.PENDING);
|
|
100
|
+
}
|
|
101
|
+
async findFailed() {
|
|
102
|
+
return this.findByStatus(EEventStatus.FAILED);
|
|
103
|
+
}
|
|
104
|
+
async remove(uuid) {
|
|
105
|
+
await DBCursor.mutateDatabase(`DELETE FROM ${this.table} WHERE uuid = ?`, uuid);
|
|
106
|
+
}
|
|
107
|
+
async removeByCorrelationId(correlationId) {
|
|
108
|
+
await DBCursor.mutateDatabase(`DELETE FROM ${this.table} WHERE correlation_id = ?`, correlationId);
|
|
109
|
+
}
|
|
110
|
+
async removeAcknowledged() {
|
|
111
|
+
await DBCursor.mutateDatabase(`DELETE FROM ${this.table} WHERE status = ?`, EEventStatus.ACKNOWLEDGED);
|
|
112
|
+
}
|
|
113
|
+
async clearAll() {
|
|
114
|
+
await DBCursor.mutateDatabase(`DELETE FROM ${this.table}`);
|
|
115
|
+
loggerRepositories.info("DomainEvent table cleared");
|
|
116
|
+
}
|
|
117
|
+
async count() {
|
|
118
|
+
const result = await DBCursor.getFirstAsync(`SELECT COUNT(*) as count FROM ${this.table}`);
|
|
119
|
+
return result?.count || 0;
|
|
120
|
+
}
|
|
121
|
+
async countByStatus(status) {
|
|
122
|
+
const result = await DBCursor.getFirstAsync(`SELECT COUNT(*) as count FROM ${this.table} WHERE status = ?`, status);
|
|
123
|
+
return result?.count || 0;
|
|
124
|
+
}
|
|
125
|
+
findByIdSync(uuid) {
|
|
126
|
+
const row = DBCursor.getFirstSync(`SELECT data FROM ${this.table} WHERE uuid = ?`, uuid);
|
|
127
|
+
return row ? DomainEvent.fromJSON(row.data) : null;
|
|
128
|
+
}
|
|
129
|
+
findByIdsSync(uuids) {
|
|
130
|
+
if (uuids.length === 0)
|
|
131
|
+
return [];
|
|
132
|
+
const placeholder = uuids.map(() => "?").join(",");
|
|
133
|
+
const rows = DBCursor.getAllSync(`SELECT data FROM ${this.table} WHERE uuid IN (${placeholder}) ORDER BY created_at ASC`, ...uuids);
|
|
134
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
135
|
+
}
|
|
136
|
+
findByRemoteIdSync(remoteId) {
|
|
137
|
+
// DomainEvents don't have remote IDs, return null
|
|
138
|
+
loggerRepositories.warn(`findByRemoteIdSync called on DomainEventRepository: ${remoteId} - DomainEvents don't have remote IDs`);
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
findByRemoteIdsSync(remoteIds) {
|
|
142
|
+
// DomainEvents don't have remote IDs, return empty array
|
|
143
|
+
loggerRepositories.warn(`findByRemoteIdsSync called on DomainEventRepository with ${remoteIds.length} ids - DomainEvents don't have remote IDs`);
|
|
144
|
+
return [];
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
export const DomainEventRepository = new DomainEventRepositoryImpl();
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { DomainEvent } from "../../domain/event_sourcing";
|
|
2
|
+
import { ECommonRepository } from "../../domain/repositories";
|
|
3
|
+
import { DATABASE_TABLES } from "../../entrypoints/db/migrations";
|
|
4
|
+
declare class DomainEventDeadLetterRepositoryImpl {
|
|
5
|
+
readonly name = ECommonRepository.DOMAIN_EVENT_DEAD_LETTER;
|
|
6
|
+
readonly table = DATABASE_TABLES.DOMAIN_EVENTS_DEAD_LETTER;
|
|
7
|
+
save(event: DomainEvent, errorMessage?: string): Promise<void>;
|
|
8
|
+
findById(uuid: string): Promise<DomainEvent | null>;
|
|
9
|
+
findAll(): Promise<DomainEvent[]>;
|
|
10
|
+
findByName(name: string): Promise<DomainEvent[]>;
|
|
11
|
+
findByCorrelationId(correlationId: string): Promise<DomainEvent[]>;
|
|
12
|
+
findByAggregateId(aggregateId: string): Promise<DomainEvent[]>;
|
|
13
|
+
findRecent(limit?: number): Promise<DomainEvent[]>;
|
|
14
|
+
remove(uuid: string): Promise<void>;
|
|
15
|
+
removeByCorrelationId(correlationId: string): Promise<void>;
|
|
16
|
+
clearAll(): Promise<void>;
|
|
17
|
+
retry(uuid: string): Promise<DomainEvent | null>;
|
|
18
|
+
retryByCorrelationId(correlationId: string): Promise<DomainEvent[]>;
|
|
19
|
+
count(): Promise<number>;
|
|
20
|
+
countByName(name: string): Promise<number>;
|
|
21
|
+
}
|
|
22
|
+
export declare const DomainEventDeadLetterRepository: DomainEventDeadLetterRepositoryImpl;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { DomainEvent } from "../../domain/event_sourcing";
|
|
2
|
+
import { ECommonRepository } from "../../domain/repositories";
|
|
3
|
+
import { DBCursor } from "../../infrastructure/database";
|
|
4
|
+
import { loggerRepositories } from "../../infrastructure/logger";
|
|
5
|
+
class DomainEventDeadLetterRepositoryImpl {
|
|
6
|
+
name = ECommonRepository.DOMAIN_EVENT_DEAD_LETTER;
|
|
7
|
+
table = "domain_events_dead_letter" /* DATABASE_TABLES.DOMAIN_EVENTS_DEAD_LETTER */;
|
|
8
|
+
async save(event, errorMessage) {
|
|
9
|
+
await DBCursor.mutateDatabase(`INSERT INTO ${this.table}
|
|
10
|
+
(uuid, name, label, data, requires_network, created_at, attempts, error_message, failed_at, aggregate_id, source_id, correlation_id, sequence)
|
|
11
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, event.uuid, event.name, event.label, event.asJSON(), event.requiresNetwork ? 1 : 0, event.createdAt, event.attempts, errorMessage || event.errorMessage, new Date().toISOString(), event.aggregateId, event.sourceId, event.correlationId, event.sequence);
|
|
12
|
+
loggerRepositories.debug(`DomainEvent moved to dead letter: ${event.name} [${event.uuid}]`);
|
|
13
|
+
}
|
|
14
|
+
async findById(uuid) {
|
|
15
|
+
const row = await DBCursor.getFirstAsync(`SELECT data FROM ${this.table} WHERE uuid = ?`, uuid);
|
|
16
|
+
return row ? DomainEvent.fromJSON(row.data) : null;
|
|
17
|
+
}
|
|
18
|
+
async findAll() {
|
|
19
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table} ORDER BY failed_at DESC`);
|
|
20
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
21
|
+
}
|
|
22
|
+
async findByName(name) {
|
|
23
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
24
|
+
WHERE name = ?
|
|
25
|
+
ORDER BY failed_at DESC`, name);
|
|
26
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
27
|
+
}
|
|
28
|
+
async findByCorrelationId(correlationId) {
|
|
29
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
30
|
+
WHERE correlation_id = ?
|
|
31
|
+
ORDER BY sequence ASC`, correlationId);
|
|
32
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
33
|
+
}
|
|
34
|
+
async findByAggregateId(aggregateId) {
|
|
35
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
36
|
+
WHERE aggregate_id = ?
|
|
37
|
+
ORDER BY failed_at DESC`, aggregateId);
|
|
38
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
39
|
+
}
|
|
40
|
+
async findRecent(limit = 50) {
|
|
41
|
+
const rows = await DBCursor.getAllAsync(`SELECT data FROM ${this.table}
|
|
42
|
+
ORDER BY failed_at DESC
|
|
43
|
+
LIMIT ?`, limit);
|
|
44
|
+
return rows.map((row) => DomainEvent.fromJSON(row.data));
|
|
45
|
+
}
|
|
46
|
+
async remove(uuid) {
|
|
47
|
+
await DBCursor.mutateDatabase(`DELETE FROM ${this.table} WHERE uuid = ?`, uuid);
|
|
48
|
+
loggerRepositories.debug(`Dead letter removed: ${uuid}`);
|
|
49
|
+
}
|
|
50
|
+
async removeByCorrelationId(correlationId) {
|
|
51
|
+
await DBCursor.mutateDatabase(`DELETE FROM ${this.table} WHERE correlation_id = ?`, correlationId);
|
|
52
|
+
}
|
|
53
|
+
async clearAll() {
|
|
54
|
+
await DBCursor.mutateDatabase(`DELETE FROM ${this.table}`);
|
|
55
|
+
loggerRepositories.info("Dead letter table cleared");
|
|
56
|
+
}
|
|
57
|
+
async retry(uuid) {
|
|
58
|
+
const event = await this.findById(uuid);
|
|
59
|
+
if (!event)
|
|
60
|
+
return null;
|
|
61
|
+
await this.remove(uuid);
|
|
62
|
+
event.retry();
|
|
63
|
+
return event;
|
|
64
|
+
}
|
|
65
|
+
async retryByCorrelationId(correlationId) {
|
|
66
|
+
const events = await this.findByCorrelationId(correlationId);
|
|
67
|
+
if (events.length === 0)
|
|
68
|
+
return [];
|
|
69
|
+
await this.removeByCorrelationId(correlationId);
|
|
70
|
+
return events.map((event) => event.retry());
|
|
71
|
+
}
|
|
72
|
+
async count() {
|
|
73
|
+
const result = await DBCursor.getFirstAsync(`SELECT COUNT(*) as count FROM ${this.table}`);
|
|
74
|
+
return result?.count || 0;
|
|
75
|
+
}
|
|
76
|
+
async countByName(name) {
|
|
77
|
+
const result = await DBCursor.getFirstAsync(`SELECT COUNT(*) as count FROM ${this.table} WHERE name = ?`, name);
|
|
78
|
+
return result?.count || 0;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
export const DomainEventDeadLetterRepository = new DomainEventDeadLetterRepositoryImpl();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ECommonRepository } from "../../domain/repositories";
|
|
2
|
+
import { DATABASE_TABLES } from "../../entrypoints/db/migrations";
|
|
3
|
+
declare class SettingsRepositoryImpl {
|
|
4
|
+
readonly name = ECommonRepository.SETTINGS;
|
|
5
|
+
readonly table = DATABASE_TABLES.SETTINGS;
|
|
6
|
+
saveOneSetting(name: string, value: any): Promise<void>;
|
|
7
|
+
getSettingByName(name: string): Promise<any | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare const SettingsRepository: SettingsRepositoryImpl;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ECommonRepository } from "../../domain/repositories";
|
|
2
|
+
import { DBCursor } from "../../infrastructure/database";
|
|
3
|
+
class SettingsRepositoryImpl {
|
|
4
|
+
name = ECommonRepository.SETTINGS;
|
|
5
|
+
table = "settings" /* DATABASE_TABLES.SETTINGS */;
|
|
6
|
+
async saveOneSetting(name, value) {
|
|
7
|
+
const type = typeof value;
|
|
8
|
+
await DBCursor.mutateDatabase(`INSERT OR REPLACE INTO ${"settings" /* DATABASE_TABLES.SETTINGS */} (name, value, type)
|
|
9
|
+
VALUES (?, ?, ?)`, name, JSON.stringify(value), type);
|
|
10
|
+
}
|
|
11
|
+
async getSettingByName(name) {
|
|
12
|
+
const row = await DBCursor.getFirstAsync(`SELECT value, type
|
|
13
|
+
FROM ${"settings" /* DATABASE_TABLES.SETTINGS */}
|
|
14
|
+
WHERE name = ?`, name);
|
|
15
|
+
if (!row) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
return JSON.parse(row.value);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
export const SettingsRepository = new SettingsRepositoryImpl();
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type IInjectedScript } from "../domain/webview";
|
|
2
|
+
declare class WebViewAdapterImpl {
|
|
3
|
+
readonly printInterceptor: IInjectedScript;
|
|
4
|
+
readonly contentHeightReporter: IInjectedScript;
|
|
5
|
+
readonly ajaxInterceptor: IInjectedScript;
|
|
6
|
+
getDefaultInterceptors(): IInjectedScript[];
|
|
7
|
+
getAllInterceptors(): IInjectedScript[];
|
|
8
|
+
}
|
|
9
|
+
export declare const WebViewAdapter: WebViewAdapterImpl;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { EWebViewMessageType } from "../domain/webview";
|
|
2
|
+
const HTML2CANVAS_CDN = "https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js";
|
|
3
|
+
const CANVAS_SCALE = 2.0;
|
|
4
|
+
function createPrintInterceptor() {
|
|
5
|
+
return {
|
|
6
|
+
name: "print_interceptor",
|
|
7
|
+
script: `
|
|
8
|
+
(function() {
|
|
9
|
+
if (window.__printInterceptorLoaded) return;
|
|
10
|
+
window.__printInterceptorLoaded = true;
|
|
11
|
+
|
|
12
|
+
try {
|
|
13
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
14
|
+
type: 'DEBUG_PRINT',
|
|
15
|
+
debug: { message: 'Script started', ts: Date.now() }
|
|
16
|
+
}));
|
|
17
|
+
} catch(e) {}
|
|
18
|
+
|
|
19
|
+
var CANVAS_SCALE = ${CANVAS_SCALE};
|
|
20
|
+
|
|
21
|
+
function loadHtml2Canvas() {
|
|
22
|
+
return new Promise(function(resolve, reject) {
|
|
23
|
+
if (window.html2canvas) {
|
|
24
|
+
resolve(window.html2canvas);
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
var script = document.createElement('script');
|
|
28
|
+
script.src = '${HTML2CANVAS_CDN}';
|
|
29
|
+
script.onload = function() { resolve(window.html2canvas); };
|
|
30
|
+
script.onerror = function() { reject(new Error('Failed to load html2canvas')); };
|
|
31
|
+
document.head.appendChild(script);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function captureElement(element) {
|
|
36
|
+
return loadHtml2Canvas().then(function(html2canvas) {
|
|
37
|
+
return html2canvas(element, {
|
|
38
|
+
backgroundColor: '#ffffff',
|
|
39
|
+
scale: CANVAS_SCALE,
|
|
40
|
+
useCORS: true,
|
|
41
|
+
allowTaint: true,
|
|
42
|
+
logging: false
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function findPrintableElement() {
|
|
48
|
+
var selectors = ['.sp-printable-roll', '.pos-receipt', '.o_report_layout_standard', '.page', '.sheet'];
|
|
49
|
+
for (var i = 0; i < selectors.length; i++) {
|
|
50
|
+
var el = document.querySelector(selectors[i]);
|
|
51
|
+
if (el) return el;
|
|
52
|
+
}
|
|
53
|
+
return document.body;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
var originalPrint = window.print;
|
|
57
|
+
window.print = function() {
|
|
58
|
+
try {
|
|
59
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
60
|
+
type: 'DEBUG_PRINT',
|
|
61
|
+
debug: { message: 'print() called', ts: Date.now() }
|
|
62
|
+
}));
|
|
63
|
+
} catch(e) {}
|
|
64
|
+
|
|
65
|
+
var element = findPrintableElement();
|
|
66
|
+
|
|
67
|
+
try {
|
|
68
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
69
|
+
type: 'DEBUG_PRINT',
|
|
70
|
+
debug: {
|
|
71
|
+
message: 'Element: ' + element.tagName + '.' + (element.className || 'no-class'),
|
|
72
|
+
w: element.offsetWidth,
|
|
73
|
+
h: element.offsetHeight
|
|
74
|
+
}
|
|
75
|
+
}));
|
|
76
|
+
} catch(e) {}
|
|
77
|
+
|
|
78
|
+
captureElement(element).then(function(canvas) {
|
|
79
|
+
var base64 = canvas.toDataURL('image/png').replace('data:image/png;base64,', '');
|
|
80
|
+
|
|
81
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
82
|
+
type: '${EWebViewMessageType.PRINT_IMAGE}',
|
|
83
|
+
image: base64,
|
|
84
|
+
width: canvas.width,
|
|
85
|
+
height: canvas.height,
|
|
86
|
+
metadata: {
|
|
87
|
+
url: window.location.href,
|
|
88
|
+
title: document.title,
|
|
89
|
+
capturedAt: new Date().toISOString()
|
|
90
|
+
}
|
|
91
|
+
}));
|
|
92
|
+
}).catch(function(error) {
|
|
93
|
+
try {
|
|
94
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
95
|
+
type: 'DEBUG_PRINT',
|
|
96
|
+
debug: { message: 'ERROR: ' + error.message }
|
|
97
|
+
}));
|
|
98
|
+
} catch(e) {}
|
|
99
|
+
originalPrint.call(window);
|
|
100
|
+
});
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
try {
|
|
104
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
105
|
+
type: '${EWebViewMessageType.INJECTION_READY}',
|
|
106
|
+
injector: 'PrintInterceptor'
|
|
107
|
+
}));
|
|
108
|
+
} catch(e) {}
|
|
109
|
+
|
|
110
|
+
true;
|
|
111
|
+
})();
|
|
112
|
+
`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
function createContentHeightReporter() {
|
|
116
|
+
return {
|
|
117
|
+
name: "content_height_reporter",
|
|
118
|
+
script: `
|
|
119
|
+
(function() {
|
|
120
|
+
function reportHeight() {
|
|
121
|
+
var height = document.body.scrollHeight || document.documentElement.scrollHeight;
|
|
122
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
123
|
+
type: '${EWebViewMessageType.CONTENT_READY}',
|
|
124
|
+
height: height
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
setTimeout(reportHeight, 200);
|
|
129
|
+
true;
|
|
130
|
+
})();
|
|
131
|
+
`,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function createAjaxInterceptor() {
|
|
135
|
+
return {
|
|
136
|
+
name: "ajax_interceptor",
|
|
137
|
+
script: `
|
|
138
|
+
(function() {
|
|
139
|
+
var originalFetch = window.fetch;
|
|
140
|
+
window.fetch = function(url, options) {
|
|
141
|
+
return originalFetch.apply(this, arguments).then(function(response) {
|
|
142
|
+
window.ReactNativeWebView.postMessage(JSON.stringify({
|
|
143
|
+
type: '${EWebViewMessageType.AJAX_INTERCEPTED}',
|
|
144
|
+
url: typeof url === 'string' ? url : url.url,
|
|
145
|
+
method: options?.method || 'GET'
|
|
146
|
+
}));
|
|
147
|
+
return response;
|
|
148
|
+
});
|
|
149
|
+
};
|
|
150
|
+
true;
|
|
151
|
+
})();
|
|
152
|
+
`,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
class WebViewAdapterImpl {
|
|
156
|
+
printInterceptor = createPrintInterceptor();
|
|
157
|
+
contentHeightReporter = createContentHeightReporter();
|
|
158
|
+
ajaxInterceptor = createAjaxInterceptor();
|
|
159
|
+
getDefaultInterceptors() {
|
|
160
|
+
return [this.printInterceptor];
|
|
161
|
+
}
|
|
162
|
+
getAllInterceptors() {
|
|
163
|
+
return [this.printInterceptor, this.ajaxInterceptor];
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
export const WebViewAdapter = new WebViewAdapterImpl();
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type BluetoothState = "Unknown" | "Resetting" | "Unsupported" | "Unauthorized" | "PoweredOff" | "PoweredOn";
|
|
2
|
+
export interface BluetoothDevice {
|
|
3
|
+
id: string;
|
|
4
|
+
name: string | null;
|
|
5
|
+
address: string;
|
|
6
|
+
rssi?: number;
|
|
7
|
+
isConnected: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface BluetoothPermissionStatus {
|
|
10
|
+
scan: boolean;
|
|
11
|
+
connect: boolean;
|
|
12
|
+
advertise: boolean;
|
|
13
|
+
isGranted: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface BluetoothStatus {
|
|
16
|
+
isEnabled: boolean;
|
|
17
|
+
state: BluetoothState;
|
|
18
|
+
permissions: BluetoothPermissionStatus;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DomainEvent } from "../../domain/event_sourcing/domain_event";
|
|
2
|
+
export declare class InternetIsDownEvent extends DomainEvent {
|
|
3
|
+
static readonly name = "common.network.v2.internet_is_down";
|
|
4
|
+
static readonly label = "Internet desconectado";
|
|
5
|
+
static readonly requiresNetwork = false;
|
|
6
|
+
readonly name = "common.network.v2.internet_is_down";
|
|
7
|
+
readonly label = "Internet desconectado";
|
|
8
|
+
readonly requiresNetwork = false;
|
|
9
|
+
}
|
|
10
|
+
export declare class InternetIsUpEvent extends DomainEvent {
|
|
11
|
+
static readonly name = "common.network.v2.internet_is_up";
|
|
12
|
+
static readonly label = "Internet conectado";
|
|
13
|
+
static readonly requiresNetwork = true;
|
|
14
|
+
readonly name = "common.network.v2.internet_is_up";
|
|
15
|
+
readonly label = "Internet conectado";
|
|
16
|
+
readonly requiresNetwork = true;
|
|
17
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { DomainEvent } from "../../domain/event_sourcing/domain_event";
|
|
2
|
+
export class InternetIsDownEvent extends DomainEvent {
|
|
3
|
+
static name = "common.network.v2.internet_is_down";
|
|
4
|
+
static label = "Internet desconectado";
|
|
5
|
+
static requiresNetwork = false;
|
|
6
|
+
name = InternetIsDownEvent.name;
|
|
7
|
+
label = InternetIsDownEvent.label;
|
|
8
|
+
requiresNetwork = InternetIsDownEvent.requiresNetwork;
|
|
9
|
+
}
|
|
10
|
+
export class InternetIsUpEvent extends DomainEvent {
|
|
11
|
+
static name = "common.network.v2.internet_is_up";
|
|
12
|
+
static label = "Internet conectado";
|
|
13
|
+
static requiresNetwork = true;
|
|
14
|
+
name = InternetIsUpEvent.name;
|
|
15
|
+
label = InternetIsUpEvent.label;
|
|
16
|
+
requiresNetwork = InternetIsUpEvent.requiresNetwork;
|
|
17
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type NetworkType = "UNKNOWN" | "NONE" | "WIFI" | "CELLULAR" | "ETHERNET" | "WIMAX" | "BLUETOOTH" | "VPN" | "OTHER";
|
|
2
|
+
export interface NetworkStatus {
|
|
3
|
+
isConnected: boolean;
|
|
4
|
+
isInternetReachable: boolean | null;
|
|
5
|
+
type: NetworkType;
|
|
6
|
+
ipAddress: string | null;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface IDatabase {
|
|
2
|
+
name: string;
|
|
3
|
+
description: string;
|
|
4
|
+
tableName: string;
|
|
5
|
+
}
|
|
6
|
+
export interface IDatabaseTable {
|
|
7
|
+
name: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ITable {
|
|
10
|
+
id: number;
|
|
11
|
+
data: string;
|
|
12
|
+
}
|
|
13
|
+
export interface IMigration {
|
|
14
|
+
name: string;
|
|
15
|
+
migrationFn: () => Promise<void>;
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Entity, ERemoteState, RemoteEntity } from "../../domain/entity/entity";
|
|
2
|
+
import { EntityCollection, ICriteria, RemoteEntityCollection } from "../../domain/entity/entity_collection";
|
|
3
|
+
export interface IRepository<T extends Entity, C extends EntityCollection<T>> {
|
|
4
|
+
save(entity: T | T[] | C): Promise<void>;
|
|
5
|
+
remove(entity: T | T[]): Promise<void>;
|
|
6
|
+
findById(id: string): Promise<T | null>;
|
|
7
|
+
findByIds(ids: string[]): Promise<C>;
|
|
8
|
+
findAll(): Promise<C>;
|
|
9
|
+
findByCriteria(criteria: ICriteria<T>[]): Promise<C>;
|
|
10
|
+
findByIdSync?(id: string): T | null;
|
|
11
|
+
findByIdsSync?(ids: string[]): C;
|
|
12
|
+
}
|
|
13
|
+
export interface IRemoteRepository<T extends RemoteEntity> extends IRepository<T, RemoteEntityCollection<T>> {
|
|
14
|
+
findByRemoteState(state: ERemoteState | ERemoteState[]): Promise<RemoteEntityCollection<T>>;
|
|
15
|
+
findByRemoteId(remoteId: number): Promise<T | null>;
|
|
16
|
+
findByRemoteIds(remoteIds: number[]): Promise<RemoteEntityCollection<T>>;
|
|
17
|
+
findByRemoteIdSync?(remoteId: number): T | null;
|
|
18
|
+
findByRemoteIdsSync?(remoteIds: number[]): RemoteEntityCollection<T>;
|
|
19
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|