@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.
- package/dist/database/schema.cjs +4 -4
- package/dist/database/schema.d.cts +1 -1
- package/dist/database/schema.d.mts +1 -1
- package/dist/database/schema.d.ts +1 -1
- package/dist/database/schema.mjs +4 -4
- package/dist/export/worker.cjs +166 -183
- package/dist/export/worker.d.cts +43 -22
- package/dist/export/worker.d.mts +43 -22
- package/dist/export/worker.d.ts +43 -22
- package/dist/export/worker.mjs +126 -143
- package/dist/export/workflows.cjs +214 -18
- package/dist/export/workflows.mjs +207 -12
- package/dist/export/wrangler.d.cts +1 -2
- package/dist/export/wrangler.d.mts +1 -2
- package/dist/export/wrangler.d.ts +1 -2
- package/dist/shared/{bank.YiArmBW2.mjs → bank.B1Gpn3ht.mjs} +12 -174
- package/dist/shared/{bank.xrXNjWCo.d.cts → bank.BEL1HIxZ.d.cts} +21 -1
- package/dist/shared/{bank.xrXNjWCo.d.mts → bank.BEL1HIxZ.d.mts} +21 -1
- package/dist/shared/{bank.xrXNjWCo.d.ts → bank.BEL1HIxZ.d.ts} +21 -1
- package/dist/shared/bank.BUEmFxS8.mjs +174 -0
- package/dist/shared/{bank.CLF9wee9.cjs → bank.CPYfE-Ei.cjs} +12 -199
- package/dist/shared/bank.CpwLFudl.cjs +198 -0
- package/dist/shared/bank.D-3fzX63.mjs +170 -0
- package/dist/shared/bank.D0a-MZon.cjs +184 -0
- package/dist/shared/{bank.BchnXQDL.d.cts → bank.Dh_H_5rC.d.cts} +0 -1
- package/dist/shared/{bank.BchnXQDL.d.mts → bank.Dh_H_5rC.d.mts} +0 -1
- package/dist/shared/{bank.BchnXQDL.d.ts → bank.Dh_H_5rC.d.ts} +0 -1
- package/dist/types.cjs +14 -14
- package/dist/types.d.cts +9 -9
- package/dist/types.d.mts +9 -9
- package/dist/types.d.ts +9 -9
- package/dist/types.mjs +5 -5
- package/package.json +1 -1
- package/dist/shared/bank.CNtiZSem.mjs +0 -9
- package/dist/shared/bank.CUU0Daxj.mjs +0 -391
- package/dist/shared/bank.ChffLgyT.cjs +0 -401
- package/dist/shared/bank.DfE0M5H3.cjs +0 -11
package/dist/database/schema.cjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const database_schema = require('../shared/bank.
|
|
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.
|
|
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.
|
|
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.
|
|
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';
|
package/dist/database/schema.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export {
|
|
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';
|
package/dist/export/worker.cjs
CHANGED
|
@@ -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
|
|
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
|
|
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('
|
|
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(
|
|
23
|
-
target:
|
|
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(
|
|
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(
|
|
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(
|
|
60
|
+
command: db.update(drizzle.tables.ott).set({
|
|
62
61
|
expiresAt: /* @__PURE__ */ new Date()
|
|
63
|
-
}).where(drizzleOrm.eq(
|
|
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
|
|
70
|
-
const command = db.insert(
|
|
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(
|
|
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(
|
|
88
|
+
const command = db.update(drizzle.tables.payment).set({
|
|
90
89
|
deletedAt: /* @__PURE__ */ new Date()
|
|
91
|
-
}).where(drizzleOrm.eq(
|
|
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(
|
|
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(
|
|
103
|
-
|
|
104
|
-
drizzleOrm.eq(
|
|
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(
|
|
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
|
-
|
|
155
|
+
drizzle.tables.payment.accountId,
|
|
157
156
|
filterPaymentAccountId
|
|
158
157
|
),
|
|
159
|
-
buildMultiFilterConditions(
|
|
160
|
-
buildMultiFilterConditions(
|
|
158
|
+
buildMultiFilterConditions(drizzle.tables.payment.amount, filterPaymentAmount),
|
|
159
|
+
buildMultiFilterConditions(drizzle.tables.payment.currency, filterPaymentCurrency),
|
|
161
160
|
buildRangeFilterConditions(
|
|
162
|
-
|
|
161
|
+
drizzle.tables.payment.createdAt,
|
|
163
162
|
filterPaymentDateFrom,
|
|
164
163
|
filterPaymentDateTo
|
|
165
164
|
),
|
|
166
|
-
buildMultiFilterConditions(
|
|
165
|
+
buildMultiFilterConditions(drizzle.tables.payment.status, filterPaymentStatus),
|
|
167
166
|
buildMultiFilterConditions(
|
|
168
|
-
|
|
167
|
+
drizzle.tables.payment.direction,
|
|
169
168
|
filterPaymentyDirection
|
|
170
169
|
),
|
|
171
|
-
buildMultiFilterConditions(
|
|
170
|
+
buildMultiFilterConditions(drizzle.tables.payment.id, ids)
|
|
172
171
|
);
|
|
173
|
-
const sortColumn = resolveColumn(
|
|
172
|
+
const sortColumn = resolveColumn(drizzle.tables.payment, sort.column);
|
|
174
173
|
const [{ totalCount }] = await db.select({
|
|
175
174
|
totalCount: drizzleOrm.sql`count(*)`
|
|
176
|
-
}).from(
|
|
177
|
-
const payments = await db.select().from(
|
|
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(
|
|
193
|
-
buildMultiFilterConditions(
|
|
191
|
+
buildMultiFilterConditions(drizzle.tables.batch.accountId, filterBatchAccountId),
|
|
192
|
+
buildMultiFilterConditions(drizzle.tables.batch.status, filterBatchStatus)
|
|
194
193
|
);
|
|
195
|
-
const sortColumn = resolveColumn(
|
|
194
|
+
const sortColumn = resolveColumn(drizzle.tables.batch, sort.column);
|
|
196
195
|
const [{ totalCount }] = await db.select({
|
|
197
196
|
totalCount: drizzleOrm.sql`count(*)`
|
|
198
|
-
}).from(
|
|
199
|
-
const batches = await db.select().from(
|
|
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(
|
|
206
|
+
return await db.select().from(drizzle.tables.batch).where(
|
|
208
207
|
drizzleOrm.and(
|
|
209
|
-
drizzleOrm.eq(
|
|
210
|
-
drizzleOrm.eq(
|
|
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(
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
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
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
}
|
|
450
|
-
}
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
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
|
|
452
|
+
connectedAccounts,
|
|
463
453
|
env: this.env
|
|
464
454
|
});
|
|
465
|
-
|
|
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
|
|
567
|
-
const
|
|
568
|
-
const
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
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
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
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:
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
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
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
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
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
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
|
-
|
|
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 } =
|
|
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({
|
|
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
|
|
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
|
|
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
|
|
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 } =
|
|
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
|
|
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",
|