@develit-services/bank 0.3.43 → 0.3.45

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 (37) hide show
  1. package/dist/database/schema.cjs +4 -4
  2. package/dist/database/schema.d.cts +1 -1
  3. package/dist/database/schema.d.mts +1 -1
  4. package/dist/database/schema.d.ts +1 -1
  5. package/dist/database/schema.mjs +4 -4
  6. package/dist/export/worker.cjs +166 -183
  7. package/dist/export/worker.d.cts +43 -22
  8. package/dist/export/worker.d.mts +43 -22
  9. package/dist/export/worker.d.ts +43 -22
  10. package/dist/export/worker.mjs +126 -143
  11. package/dist/export/workflows.cjs +214 -18
  12. package/dist/export/workflows.mjs +207 -12
  13. package/dist/export/wrangler.d.cts +1 -2
  14. package/dist/export/wrangler.d.mts +1 -2
  15. package/dist/export/wrangler.d.ts +1 -2
  16. package/dist/shared/{bank.YiArmBW2.mjs → bank.B1Gpn3ht.mjs} +12 -174
  17. package/dist/shared/{bank.xrXNjWCo.d.cts → bank.BEL1HIxZ.d.cts} +21 -1
  18. package/dist/shared/{bank.xrXNjWCo.d.mts → bank.BEL1HIxZ.d.mts} +21 -1
  19. package/dist/shared/{bank.xrXNjWCo.d.ts → bank.BEL1HIxZ.d.ts} +21 -1
  20. package/dist/shared/bank.BUEmFxS8.mjs +174 -0
  21. package/dist/shared/{bank.CLF9wee9.cjs → bank.CPYfE-Ei.cjs} +12 -199
  22. package/dist/shared/bank.CpwLFudl.cjs +198 -0
  23. package/dist/shared/bank.D-3fzX63.mjs +170 -0
  24. package/dist/shared/bank.D0a-MZon.cjs +184 -0
  25. package/dist/shared/{bank.BchnXQDL.d.cts → bank.Dh_H_5rC.d.cts} +0 -1
  26. package/dist/shared/{bank.BchnXQDL.d.mts → bank.Dh_H_5rC.d.mts} +0 -1
  27. package/dist/shared/{bank.BchnXQDL.d.ts → bank.Dh_H_5rC.d.ts} +0 -1
  28. package/dist/types.cjs +14 -14
  29. package/dist/types.d.cts +9 -9
  30. package/dist/types.d.mts +9 -9
  31. package/dist/types.d.ts +9 -9
  32. package/dist/types.mjs +5 -5
  33. package/package.json +1 -1
  34. package/dist/shared/bank.CNtiZSem.mjs +0 -9
  35. package/dist/shared/bank.CUU0Daxj.mjs +0 -391
  36. package/dist/shared/bank.ChffLgyT.cjs +0 -401
  37. package/dist/shared/bank.DfE0M5H3.cjs +0 -11
@@ -1,15 +1,15 @@
1
1
  'use strict';
2
2
 
3
- const database_schema = require('../shared/bank.CLF9wee9.cjs');
3
+ const database_schema = require('../shared/bank.CpwLFudl.cjs');
4
4
  require('@develit-io/backend-sdk');
5
5
  require('drizzle-orm/sqlite-core');
6
6
  require('date-fns');
7
+ require('drizzle-orm/relations');
8
+ require('@develit-io/general-codes');
7
9
  require('drizzle-orm');
8
10
  require('jose');
9
- require('@develit-io/general-codes');
10
- require('drizzle-zod');
11
- require('drizzle-orm/relations');
12
11
  require('node:crypto');
12
+ require('drizzle-zod');
13
13
 
14
14
 
15
15
 
@@ -1,4 +1,4 @@
1
- export { a9 as account, aa as accountCredentials, a5 as batch, a8 as ott, a6 as payment, a7 as paymentRelations } from '../shared/bank.xrXNjWCo.cjs';
1
+ export { a9 as account, aa as accountCredentials, a5 as batch, a8 as ott, a6 as payment, a7 as paymentRelations } from '../shared/bank.BEL1HIxZ.cjs';
2
2
  import 'zod';
3
3
  import 'drizzle-zod';
4
4
  import 'drizzle-orm/sqlite-core';
@@ -1,4 +1,4 @@
1
- export { a9 as account, aa as accountCredentials, a5 as batch, a8 as ott, a6 as payment, a7 as paymentRelations } from '../shared/bank.xrXNjWCo.mjs';
1
+ export { a9 as account, aa as accountCredentials, a5 as batch, a8 as ott, a6 as payment, a7 as paymentRelations } from '../shared/bank.BEL1HIxZ.mjs';
2
2
  import 'zod';
3
3
  import 'drizzle-zod';
4
4
  import 'drizzle-orm/sqlite-core';
@@ -1,4 +1,4 @@
1
- export { a9 as account, aa as accountCredentials, a5 as batch, a8 as ott, a6 as payment, a7 as paymentRelations } from '../shared/bank.xrXNjWCo.js';
1
+ export { a9 as account, aa as accountCredentials, a5 as batch, a8 as ott, a6 as payment, a7 as paymentRelations } from '../shared/bank.BEL1HIxZ.js';
2
2
  import 'zod';
3
3
  import 'drizzle-zod';
4
4
  import 'drizzle-orm/sqlite-core';
@@ -1,10 +1,10 @@
1
- export { y as account, z as accountCredentials, r as batch, x as ott, v as payment, w as paymentRelations } from '../shared/bank.YiArmBW2.mjs';
1
+ export { t as account, u as accountCredentials, n as batch, r as ott, p as payment, q as paymentRelations } from '../shared/bank.D-3fzX63.mjs';
2
2
  import '@develit-io/backend-sdk';
3
3
  import 'drizzle-orm/sqlite-core';
4
4
  import 'date-fns';
5
+ import 'drizzle-orm/relations';
6
+ import '@develit-io/general-codes';
5
7
  import 'drizzle-orm';
6
8
  import 'jose';
7
- import '@develit-io/general-codes';
8
- import 'drizzle-zod';
9
- import 'drizzle-orm/relations';
10
9
  import 'node:crypto';
10
+ import 'drizzle-zod';
@@ -3,24 +3,23 @@
3
3
  const backendSdk = require('@develit-io/backend-sdk');
4
4
  const cloudflare_workers = require('cloudflare:workers');
5
5
  const d1 = require('drizzle-orm/d1');
6
- const database_schema = require('../shared/bank.CLF9wee9.cjs');
7
- require('jose');
8
- const generalCodes = require('@develit-io/general-codes');
6
+ const drizzle = require('../shared/bank.CPYfE-Ei.cjs');
9
7
  const zod = require('zod');
10
- const processBatch_workflow = require('../shared/bank.ChffLgyT.cjs');
8
+ const database_schema = require('../shared/bank.CpwLFudl.cjs');
9
+ const generalCodes = require('@develit-io/general-codes');
10
+ require('date-fns');
11
11
  const drizzleOrm = require('drizzle-orm');
12
+ require('jose');
13
+ require('node:crypto');
14
+ const encryption = require('../shared/bank.D0a-MZon.cjs');
12
15
  require('drizzle-orm/sqlite-core');
13
- require('date-fns');
14
- require('drizzle-zod');
15
16
  require('drizzle-orm/relations');
16
- require('node:crypto');
17
- require('cloudflare:workflows');
18
- require('../shared/bank.DfE0M5H3.cjs');
17
+ require('drizzle-zod');
19
18
 
20
19
  const upsertAccountCommand = (db, { account }) => {
21
20
  const id = account.id || backendSdk.uuidv4();
22
- const command = db.insert(database_schema.tables.account).values({ ...account, id }).onConflictDoUpdate({
23
- target: database_schema.tables.account.iban,
21
+ const command = db.insert(drizzle.tables.account).values({ ...account, id }).onConflictDoUpdate({
22
+ target: drizzle.tables.account.iban,
24
23
  set: {
25
24
  ...account
26
25
  }
@@ -38,7 +37,7 @@ const createOneTimeTokenCommand = (db, {
38
37
  }) => {
39
38
  const id = backendSdk.uuidv4();
40
39
  const expiresAt = new Date(Date.now() + 1e3 * 60 * 60) ;
41
- const command = db.insert(database_schema.tables.ott).values({
40
+ const command = db.insert(drizzle.tables.ott).values({
42
41
  id,
43
42
  oneTimeToken: ott,
44
43
  tokenType,
@@ -50,7 +49,7 @@ const createOneTimeTokenCommand = (db, {
50
49
 
51
50
  const updateAccountCommand = (db, { account }) => {
52
51
  return {
53
- command: db.update(database_schema.tables.account).set({ ...account }).where(drizzleOrm.eq(database_schema.tables.account.id, account.id)).returning()
52
+ command: db.update(drizzle.tables.account).set({ ...account }).where(drizzleOrm.eq(drizzle.tables.account.id, account.id)).returning()
54
53
  };
55
54
  };
56
55
 
@@ -58,16 +57,16 @@ const expireOneTimeTokenCommand = (db, {
58
57
  ott
59
58
  }) => {
60
59
  return {
61
- command: db.update(database_schema.tables.ott).set({
60
+ command: db.update(drizzle.tables.ott).set({
62
61
  expiresAt: /* @__PURE__ */ new Date()
63
- }).where(drizzleOrm.eq(database_schema.tables.ott.oneTimeToken, ott))
62
+ }).where(drizzleOrm.eq(drizzle.tables.ott.oneTimeToken, ott))
64
63
  };
65
64
  };
66
65
 
67
66
  const createAccountCredentialsCommand = async (db, encryptionKey, { credentials }) => {
68
67
  const id = credentials.id || backendSdk.uuidv4();
69
- const encryptedValue = await processBatch_workflow.encrypt(credentials.value, encryptionKey);
70
- const command = db.insert(database_schema.tables.accountCredentials).values({
68
+ const encryptedValue = await encryption.encrypt(credentials.value, encryptionKey);
69
+ const command = db.insert(drizzle.tables.accountCredentials).values({
71
70
  ...credentials,
72
71
  id,
73
72
  value: encryptedValue
@@ -79,29 +78,29 @@ const createAccountCredentialsCommand = async (db, encryptionKey, { credentials
79
78
  };
80
79
 
81
80
  const deleteAccountCredentialsCommand = (db, { accountId }) => {
82
- const command = db.delete(database_schema.tables.accountCredentials).where(drizzleOrm.eq(database_schema.tables.accountCredentials.accountId, accountId));
81
+ const command = db.delete(drizzle.tables.accountCredentials).where(drizzleOrm.eq(drizzle.tables.accountCredentials.accountId, accountId));
83
82
  return {
84
83
  command
85
84
  };
86
85
  };
87
86
 
88
87
  const deletePaymentsByAccountCommand = (db, { accountId }) => {
89
- const command = db.update(database_schema.tables.payment).set({
88
+ const command = db.update(drizzle.tables.payment).set({
90
89
  deletedAt: /* @__PURE__ */ new Date()
91
- }).where(drizzleOrm.eq(database_schema.tables.payment.accountId, accountId));
90
+ }).where(drizzleOrm.eq(drizzle.tables.payment.accountId, accountId));
92
91
  return {
93
92
  command
94
93
  };
95
94
  };
96
95
 
97
96
  const getAccountByIbanQuery = async (db, { iban }) => {
98
- return await db.select().from(database_schema.tables.account).where(drizzleOrm.eq(database_schema.tables.account.iban, iban)).get();
97
+ return await db.select().from(drizzle.tables.account).where(drizzleOrm.eq(drizzle.tables.account.iban, iban)).get();
99
98
  };
100
99
 
101
100
  const getAllAccountsQuery = async (db) => {
102
- const accountsWithExpiration = await db.select().from(database_schema.tables.account).leftJoin(
103
- database_schema.tables.accountCredentials,
104
- drizzleOrm.eq(database_schema.tables.accountCredentials.accountId, database_schema.tables.account.id)
101
+ const accountsWithExpiration = await db.select().from(drizzle.tables.account).leftJoin(
102
+ drizzle.tables.accountCredentials,
103
+ drizzleOrm.eq(drizzle.tables.accountCredentials.accountId, drizzle.tables.account.id)
105
104
  );
106
105
  return accountsWithExpiration.map(({ account, account_credentials }) => {
107
106
  return {
@@ -112,7 +111,7 @@ const getAllAccountsQuery = async (db) => {
112
111
  };
113
112
 
114
113
  const getAllPendingBatchesQuery = (db) => {
115
- return db.select().from(database_schema.tables.batch).where(drizzleOrm.inArray(database_schema.tables.batch.status, ["READY_TO_SIGN"]));
114
+ return db.select().from(drizzle.tables.batch).where(drizzleOrm.inArray(drizzle.tables.batch.status, ["READY_TO_SIGN"]));
116
115
  };
117
116
 
118
117
  const buildMultiFilterConditions = (column, value) => {
@@ -153,28 +152,28 @@ const getPaymentsWithPaginationQuery = async (db, {
153
152
  }) => {
154
153
  const whereConditions = drizzleOrm.and(
155
154
  buildMultiFilterConditions(
156
- database_schema.tables.payment.accountId,
155
+ drizzle.tables.payment.accountId,
157
156
  filterPaymentAccountId
158
157
  ),
159
- buildMultiFilterConditions(database_schema.tables.payment.amount, filterPaymentAmount),
160
- buildMultiFilterConditions(database_schema.tables.payment.currency, filterPaymentCurrency),
158
+ buildMultiFilterConditions(drizzle.tables.payment.amount, filterPaymentAmount),
159
+ buildMultiFilterConditions(drizzle.tables.payment.currency, filterPaymentCurrency),
161
160
  buildRangeFilterConditions(
162
- database_schema.tables.payment.createdAt,
161
+ drizzle.tables.payment.createdAt,
163
162
  filterPaymentDateFrom,
164
163
  filterPaymentDateTo
165
164
  ),
166
- buildMultiFilterConditions(database_schema.tables.payment.status, filterPaymentStatus),
165
+ buildMultiFilterConditions(drizzle.tables.payment.status, filterPaymentStatus),
167
166
  buildMultiFilterConditions(
168
- database_schema.tables.payment.direction,
167
+ drizzle.tables.payment.direction,
169
168
  filterPaymentyDirection
170
169
  ),
171
- buildMultiFilterConditions(database_schema.tables.payment.id, ids)
170
+ buildMultiFilterConditions(drizzle.tables.payment.id, ids)
172
171
  );
173
- const sortColumn = resolveColumn(database_schema.tables.payment, sort.column);
172
+ const sortColumn = resolveColumn(drizzle.tables.payment, sort.column);
174
173
  const [{ totalCount }] = await db.select({
175
174
  totalCount: drizzleOrm.sql`count(*)`
176
- }).from(database_schema.tables.payment).where(whereConditions);
177
- const payments = await db.select().from(database_schema.tables.payment).where(whereConditions).limit(limit).offset((page - 1) * limit).orderBy(sort.direction === "asc" ? drizzleOrm.asc(sortColumn) : drizzleOrm.desc(sortColumn));
175
+ }).from(drizzle.tables.payment).where(whereConditions);
176
+ const payments = await db.select().from(drizzle.tables.payment).where(whereConditions).limit(limit).offset((page - 1) * limit).orderBy(sort.direction === "asc" ? drizzleOrm.asc(sortColumn) : drizzleOrm.desc(sortColumn));
178
177
  return {
179
178
  payments,
180
179
  totalCount
@@ -189,14 +188,14 @@ const getBatchesQuery = async (db, {
189
188
  filterBatchStatus
190
189
  }) => {
191
190
  const whereConditions = drizzleOrm.and(
192
- buildMultiFilterConditions(database_schema.tables.batch.accountId, filterBatchAccountId),
193
- buildMultiFilterConditions(database_schema.tables.batch.status, filterBatchStatus)
191
+ buildMultiFilterConditions(drizzle.tables.batch.accountId, filterBatchAccountId),
192
+ buildMultiFilterConditions(drizzle.tables.batch.status, filterBatchStatus)
194
193
  );
195
- const sortColumn = resolveColumn(database_schema.tables.batch, sort.column);
194
+ const sortColumn = resolveColumn(drizzle.tables.batch, sort.column);
196
195
  const [{ totalCount }] = await db.select({
197
196
  totalCount: drizzleOrm.sql`count(*)`
198
- }).from(database_schema.tables.batch).where(whereConditions);
199
- const batches = await db.select().from(database_schema.tables.batch).where(whereConditions).limit(limit).offset((page - 1) * limit).orderBy(sort.direction === "asc" ? drizzleOrm.asc(sortColumn) : drizzleOrm.desc(sortColumn));
197
+ }).from(drizzle.tables.batch).where(whereConditions);
198
+ const batches = await db.select().from(drizzle.tables.batch).where(whereConditions).limit(limit).offset((page - 1) * limit).orderBy(sort.direction === "asc" ? drizzleOrm.asc(sortColumn) : drizzleOrm.desc(sortColumn));
200
199
  return {
201
200
  batches,
202
201
  totalCount
@@ -204,16 +203,16 @@ const getBatchesQuery = async (db, {
204
203
  };
205
204
 
206
205
  const getAccountOpenBatchesQuery = async (db, { accountId }) => {
207
- return await db.select().from(database_schema.tables.batch).where(
206
+ return await db.select().from(drizzle.tables.batch).where(
208
207
  drizzleOrm.and(
209
- drizzleOrm.eq(database_schema.tables.batch.accountId, accountId),
210
- drizzleOrm.eq(database_schema.tables.batch.status, "OPEN")
208
+ drizzleOrm.eq(drizzle.tables.batch.accountId, accountId),
209
+ drizzleOrm.eq(drizzle.tables.batch.status, "OPEN")
211
210
  )
212
211
  );
213
212
  };
214
213
 
215
214
  const getOttQuery = async (db, { ott }) => {
216
- return await db.select().from(database_schema.tables.ott).where(drizzleOrm.eq(database_schema.tables.ott.oneTimeToken, ott)).get();
215
+ return await db.select().from(drizzle.tables.ott).where(drizzleOrm.eq(drizzle.tables.ott.oneTimeToken, ott)).get();
217
216
  };
218
217
 
219
218
  const seperateSupportedPayments = (mappedPayments, accounts) => {
@@ -315,22 +314,6 @@ zod.z.object({
315
314
  details: backendSdk.workflowInstanceStatusSchema
316
315
  });
317
316
 
318
- const batchAuthorizedEventPayloadSchema = zod.z.object({
319
- authorized: zod.z.boolean()
320
- });
321
- const processBatchEventInputSchema = zod.z.discriminatedUnion("eventType", [
322
- zod.z.object({
323
- batchId: zod.z.uuid(),
324
- eventType: zod.z.literal(processBatch_workflow.PROCESS_BATCH_WORKFLOW_EVENTS.batchAuthorized),
325
- payload: batchAuthorizedEventPayloadSchema
326
- })
327
- // Future event types can be added here as new objects in the array
328
- ]);
329
- zod.z.object({
330
- success: zod.z.boolean(),
331
- message: zod.z.string()
332
- });
333
-
334
317
  const ALLOWED_PAYMENT_FILTERS = {
335
318
  ACCOUNT_ID: "filterPaymentAccountId",
336
319
  AMOUNT: "filterPaymentAmount",
@@ -411,14 +394,18 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
411
394
  super(ctx, env);
412
395
  this.allowedProviders = [];
413
396
  this.allowedProviders = config.allowedProviders;
414
- this.db = d1.drizzle(this.env.BANK_D1, { schema: database_schema.tables });
397
+ this.db = d1.drizzle(this.env.BANK_D1, { schema: drizzle.tables });
415
398
  }
416
399
  async _getAccounts() {
417
400
  return await getAllAccountsQuery(this.db);
418
401
  }
402
+ async _getConnectedAccounts() {
403
+ const accounts = await this._getAccounts();
404
+ return accounts.filter((acc) => acc.status !== "DISABLED");
405
+ }
419
406
  async _initiateBankConnector({
420
407
  connectorKey,
421
- withAuth
408
+ skipAccounts
422
409
  }) {
423
410
  if (!this.allowedProviders.includes(connectorKey)) {
424
411
  throw backendSdk.createInternalError(null, {
@@ -427,55 +414,45 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
427
414
  status: 400
428
415
  });
429
416
  }
430
- const accounts = await this._getAccounts();
431
- const accountsForConnector = accounts.filter(
432
- (acc) => acc.connectorKey === connectorKey && acc.status !== "DISABLED"
433
- );
434
- const encryptionKey = await processBatch_workflow.importAesKey(this.env.ENCRYPTION_KEY);
435
- const accountsWithCredentials = await Promise.all(
436
- accountsForConnector.map(async (acc) => {
437
- const credentials = await processBatch_workflow.getCredentialsByAccountId(
438
- this.db,
439
- encryptionKey,
440
- {
441
- accountId: acc.id
417
+ let connectedAccounts = [];
418
+ if (!skipAccounts) {
419
+ const encryptionKey = await encryption.importAesKey(this.env.ENCRYPTION_KEY);
420
+ const accounts = await this._getConnectedAccounts();
421
+ const accountsForConnector = accounts.filter(
422
+ (acc) => acc.connectorKey === connectorKey
423
+ );
424
+ connectedAccounts = await Promise.all(
425
+ accountsForConnector.map(async (acc) => {
426
+ const credentials = await encryption.getCredentialsByAccountId(
427
+ this.db,
428
+ encryptionKey,
429
+ {
430
+ accountId: acc.id
431
+ }
432
+ );
433
+ if (!credentials) {
434
+ throw backendSdk.createInternalError(null, {
435
+ message: `No credentials found for account ${acc.id}`,
436
+ code: "DB-B-001",
437
+ status: 404
438
+ });
442
439
  }
443
- );
444
- if (!credentials) {
445
- throw backendSdk.createInternalError(null, {
446
- message: `No credentials found for account ${acc.id}`,
447
- code: "DB-B-001",
448
- status: 404
449
- });
450
- }
451
- return {
452
- currency: acc.currency,
453
- iban: acc.iban,
454
- token: credentials.value,
455
- id: acc.id,
456
- connectorKey: acc.connectorKey
457
- };
458
- })
459
- );
460
- this.bankConnector = processBatch_workflow.initiateConnector({
440
+ return {
441
+ currency: acc.currency,
442
+ iban: acc.iban,
443
+ token: credentials.value,
444
+ id: acc.id,
445
+ connectorKey: acc.connectorKey
446
+ };
447
+ })
448
+ );
449
+ }
450
+ const connector = encryption.initiateConnector({
461
451
  bank: connectorKey,
462
- connectedAccounts: accountsWithCredentials,
452
+ connectedAccounts,
463
453
  env: this.env
464
454
  });
465
- if (!withAuth) return;
466
- await this.bankConnector.authenticate();
467
- }
468
- _accountFetchInterval(connectorKey) {
469
- switch (connectorKey) {
470
- case "ERSTE":
471
- return database_schema.ErsteConnector.FETCH_INTERVAL;
472
- case "FINBRICKS":
473
- return database_schema.FinbricksConnector.FETCH_INTERVAL;
474
- case "MOCK":
475
- return database_schema.MockConnector.FETCH_INTERVAL;
476
- default:
477
- return 0;
478
- }
455
+ return connector;
479
456
  }
480
457
  async getPayments(input) {
481
458
  return this.handleAction(
@@ -563,65 +540,85 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
563
540
  await this.updateBatchStatuses();
564
541
  }
565
542
  }
566
- async updateBatchStatuses() {
567
- const pendingBatches = await getAllPendingBatchesQuery(this.db);
568
- const uniqueConnectors = /* @__PURE__ */ new Set();
569
- const accounts = await this._getAccounts();
570
- for (const batch of pendingBatches) {
571
- const connectorKey = accounts.find(
572
- (acc) => acc.id === batch.accountId
573
- ).connectorKey;
574
- if (!uniqueConnectors.has(connectorKey)) {
575
- uniqueConnectors.add(connectorKey);
543
+ async _resolveSingleBatch(batch, connector) {
544
+ const previousStatus = batch.status;
545
+ const currentStatus = await connector.getBatchStatus({
546
+ batchId: batch.id
547
+ });
548
+ let statusChanged = false;
549
+ if (previousStatus !== currentStatus) {
550
+ await encryption.upsertBatchCommand(this.db, {
551
+ batch: {
552
+ ...batch,
553
+ status: currentStatus
554
+ }
555
+ }).command.execute();
556
+ statusChanged = true;
557
+ }
558
+ return {
559
+ batchId: batch.id,
560
+ previousStatus,
561
+ currentStatus,
562
+ statusChanged
563
+ // eventSent,
564
+ };
565
+ }
566
+ async updateBatchStatuses(input) {
567
+ let pendingBatches;
568
+ if (input?.batchId) {
569
+ const batch = await encryption.getBatchByIdQuery(this.db, { batchId: input.batchId });
570
+ if (!batch) {
571
+ throw backendSdk.createInternalError(null, {
572
+ message: `Batch not found: ${input.batchId}`,
573
+ code: "DB-B-007",
574
+ status: 404
575
+ });
576
576
  }
577
+ pendingBatches = [batch];
578
+ } else {
579
+ pendingBatches = await getAllPendingBatchesQuery(this.db);
577
580
  }
578
- const finalBatches = [];
579
- for (const connectorKey of uniqueConnectors) {
580
- const accs = accounts.filter((acc) => acc.connectorKey === connectorKey);
581
- const updatedBatches = await Promise.all(
582
- accs.map(async (account) => {
583
- const batch = pendingBatches.find((acc) => acc.id === account.id);
584
- const newStatus = await this.bankConnector.getBatchStatus({
585
- batchId: batch.id
586
- });
587
- return {
581
+ const accounts = await this._getConnectedAccounts();
582
+ console.log(`Processing ${pendingBatches.length} pending batche(s)`);
583
+ const batchesByConnector = /* @__PURE__ */ new Map();
584
+ for (const batch of pendingBatches) {
585
+ const account = accounts.find((acc) => acc.id === batch.accountId);
586
+ if (!account) {
587
+ this.logError({
588
+ message: `Account not found for batch ${batch.id}, skipping`
589
+ });
590
+ await encryption.upsertBatchCommand(this.db, {
591
+ batch: {
588
592
  ...batch,
589
- status: newStatus
590
- };
591
- })
592
- );
593
- finalBatches.push(...updatedBatches);
593
+ status: "FAILED",
594
+ statusReason: "ACCOUNT_NOT_FOUND"
595
+ }
596
+ }).command.execute();
597
+ continue;
598
+ }
599
+ const batches = batchesByConnector.get(account.connectorKey) || [];
600
+ batches.push(batch);
601
+ batchesByConnector.set(account.connectorKey, batches);
594
602
  }
595
- const updateBatchesCommands = finalBatches.map((batch) => {
596
- const { command } = processBatch_workflow.upsertBatchCommand(this.db, {
597
- batch: {
598
- ...batch
599
- }
603
+ const allResults = [];
604
+ for (const [connectorKey, batches] of batchesByConnector) {
605
+ console.log(
606
+ `Initializing ${connectorKey} connector for ${batches.length} batches`
607
+ );
608
+ const connector = await this._initiateBankConnector({
609
+ connectorKey
600
610
  });
601
- return command;
602
- });
603
- await this.db.batch([
604
- updateBatchesCommands[0],
605
- ...updateBatchesCommands.slice(1)
606
- ]);
607
- for (const batch of finalBatches) {
608
- try {
609
- const instance = await this.env.PROCESS_BATCH_WORKFLOW.get(batch.id);
610
- if (batch.status === "SIGNED" || batch.status === "SIGNATURE_FAILED") {
611
- instance.sendEvent({
612
- type: processBatch_workflow.PROCESS_BATCH_WORKFLOW_EVENTS.batchAuthorized,
613
- payload: {
614
- authorized: batch.status === "SIGNED"
615
- }
616
- });
611
+ for (const batch of batches) {
612
+ const result = await this._resolveSingleBatch(batch, connector);
613
+ if (result) {
614
+ allResults.push(result);
617
615
  }
618
- } catch (_) {
619
- console.log(
620
- `No workflow instance found for batch ${batch.id}, skipping.`
621
- );
622
616
  }
623
617
  }
624
- console.log("Batch update completed");
618
+ const changedCount = allResults.filter((r) => r.statusChanged).length;
619
+ console.log(
620
+ `Batch update completed: ${changedCount} status change(s) detected.`
621
+ );
625
622
  }
626
623
  async addPaymentsToBatch({
627
624
  paymentsToBatch
@@ -699,7 +696,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
699
696
  this.log({
700
697
  message: availableBatch ? `\u{1F504} Found existing OPEN batches for account ${acc.id}, merging ${availableBatch.payments.length} existing + ${newPayments.length} new payments` : `\u2728 Creating new batch for account ${acc.id} with ${newPayments.length} payments`
701
698
  });
702
- const { command } = processBatch_workflow.upsertBatchCommand(this.db, {
699
+ const { command } = encryption.upsertBatchCommand(this.db, {
703
700
  batch: availableBatch ? {
704
701
  ...availableBatch,
705
702
  payments: [...availableBatch.payments, ...newPayments]
@@ -764,23 +761,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
764
761
  }
765
762
  );
766
763
  }
767
- async processBatchEvent(input) {
768
- return this.handleAction(
769
- { data: input, schema: processBatchEventInputSchema },
770
- { successMessage: "Event sent to batch processing workflow" },
771
- async ({ batchId, eventType, payload }) => {
772
- const instance = await this.env.PROCESS_BATCH_WORKFLOW.get(batchId);
773
- await instance.sendEvent({
774
- type: eventType,
775
- payload
776
- });
777
- return {
778
- success: true,
779
- message: `Event '${eventType}' sent to workflow instance ${batchId}`
780
- };
781
- }
782
- );
783
- }
784
764
  async queue(b) {
785
765
  await this.handleAction(
786
766
  null,
@@ -799,7 +779,10 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
799
779
  { data: input, schema: getAuthUriInputSchema },
800
780
  { successMessage: "Auth URI obtained." },
801
781
  async ({ connectorKey }) => {
802
- await this._initiateBankConnector({ connectorKey, withAuth: false });
782
+ const connector = await this._initiateBankConnector({
783
+ connectorKey,
784
+ skipAccounts: true
785
+ });
803
786
  const ott = backendSdk.uuidv4();
804
787
  const { command: createOneTimeToken } = createOneTimeTokenCommand(
805
788
  this.db,
@@ -810,7 +793,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
810
793
  }
811
794
  );
812
795
  await createOneTimeToken.execute();
813
- const uri = await this.bankConnector.getAuthUri({ ott });
796
+ const uri = await connector.getAuthUri({ ott });
814
797
  return { uri };
815
798
  }
816
799
  );
@@ -837,10 +820,10 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
837
820
  status: 400
838
821
  });
839
822
  }
840
- await this._initiateBankConnector({
823
+ const connector = await this._initiateBankConnector({
841
824
  connectorKey: ottRow.refId
842
825
  });
843
- const { credentials, accounts } = await this.bankConnector.authorizeAccount({
826
+ const { credentials, accounts } = await connector.authorizeAccount({
844
827
  urlParams
845
828
  });
846
829
  console.log("Bank connector initiated");
@@ -857,7 +840,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
857
840
  accountId: acc.id
858
841
  }).command
859
842
  );
860
- const encryptionKey = await processBatch_workflow.importAesKey(this.env.ENCRYPTION_KEY);
843
+ const encryptionKey = await encryption.importAesKey(this.env.ENCRYPTION_KEY);
861
844
  const createAccountCredentials = (await Promise.all(
862
845
  credentials.map(
863
846
  async (cr) => createAccountCredentialsCommand(this.db, encryptionKey, {
@@ -934,7 +917,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
934
917
  debtor,
935
918
  debtorIban: debtor.iban
936
919
  };
937
- const { command } = processBatch_workflow.createPaymentCommand(this.db, { payment });
920
+ const { command } = encryption.createPaymentCommand(this.db, { payment });
938
921
  const createdPayment = await command.execute().then(backendSdk.first);
939
922
  this.logQueuePush({ payment, isPaymentExecuted: true });
940
923
  await this.pushToQueue(this.env.QUEUE_BUS_QUEUE, {
@@ -1021,7 +1004,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
1021
1004
  { data: input, schema: disconnectAccountInputSchema },
1022
1005
  { successMessage: "Account disconnected successfully" },
1023
1006
  async ({ accountId }) => {
1024
- const account = await processBatch_workflow.getAccountByIdQuery(this.db, { accountId });
1007
+ const account = await encryption.getAccountByIdQuery(this.db, { accountId });
1025
1008
  if (!account) {
1026
1009
  throw backendSdk.createInternalError(null, {
1027
1010
  message: "Account not found",