@develit-services/bank 0.1.7 → 0.1.9
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 +1 -1
- 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 +1 -1
- package/dist/export/worker.cjs +13 -15
- package/dist/export/worker.d.cts +16 -17
- package/dist/export/worker.d.mts +16 -17
- package/dist/export/worker.d.ts +16 -17
- package/dist/export/worker.mjs +3 -5
- package/dist/export/workflows.cjs +160 -9
- package/dist/export/workflows.d.cts +10 -2
- package/dist/export/workflows.d.mts +10 -2
- package/dist/export/workflows.d.ts +10 -2
- package/dist/export/workflows.mjs +163 -8
- package/dist/shared/bank.-FurAs09.cjs +120 -0
- package/dist/shared/{bank.D2ZeOkyc.mjs → bank.BvXwHpBp.mjs} +1 -1
- package/dist/shared/{bank.DCTBX1dp.d.ts → bank.CRVH1wUH.d.cts} +7 -7
- package/dist/shared/{bank.CrRs_x0N.d.mts → bank.Ckn_klvT.d.ts} +7 -7
- package/dist/shared/{bank.BFGDv0oC.d.cts → bank.CsvBtQib.d.cts} +8 -8
- package/dist/shared/{bank.BFGDv0oC.d.mts → bank.CsvBtQib.d.mts} +8 -8
- package/dist/shared/{bank.BFGDv0oC.d.ts → bank.CsvBtQib.d.ts} +8 -8
- package/dist/shared/bank.DTdKHhGd.mjs +113 -0
- package/dist/shared/{bank.DSVzOCrh.d.cts → bank.DouutABZ.d.mts} +7 -7
- package/dist/shared/{bank.xIMAnZ4v.mjs → bank.W4h6Dlzi.mjs} +62 -2
- package/dist/shared/{bank.PDmcU0T-.cjs → bank.tLe0jhjo.cjs} +61 -1
- package/dist/shared/{bank.BcCfzRPi.cjs → bank.z4VxSea3.cjs} +1 -1
- package/dist/types.cjs +2 -2
- package/dist/types.d.cts +69 -5
- package/dist/types.d.mts +69 -5
- package/dist/types.d.ts +69 -5
- package/dist/types.mjs +2 -2
- package/package.json +1 -1
- package/dist/shared/bank.B3isylGM.cjs +0 -284
- package/dist/shared/bank.ChAGzUFo.d.cts +0 -18
- package/dist/shared/bank.ChAGzUFo.d.mts +0 -18
- package/dist/shared/bank.ChAGzUFo.d.ts +0 -18
- package/dist/shared/bank.JtGSu6eH.mjs +0 -275
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { WorkflowEntrypoint, WorkflowEvent, WorkflowStep } from 'cloudflare:workers';
|
|
2
|
-
|
|
3
|
-
type Params = {
|
|
4
|
-
accountId: string;
|
|
5
|
-
};
|
|
6
|
-
declare class SyncAccountPaymentsWorkflow extends WorkflowEntrypoint<BankEnv, Params> {
|
|
7
|
-
run(event: WorkflowEvent<Params>, step: WorkflowStep): Promise<void>;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
type workflows_SyncAccountPaymentsWorkflow = SyncAccountPaymentsWorkflow;
|
|
11
|
-
declare const workflows_SyncAccountPaymentsWorkflow: typeof SyncAccountPaymentsWorkflow;
|
|
12
|
-
declare namespace workflows {
|
|
13
|
-
export {
|
|
14
|
-
workflows_SyncAccountPaymentsWorkflow as SyncAccountPaymentsWorkflow,
|
|
15
|
-
};
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export { SyncAccountPaymentsWorkflow as S, workflows as w };
|
|
@@ -1,275 +0,0 @@
|
|
|
1
|
-
import { WorkflowEntrypoint } from 'cloudflare:workers';
|
|
2
|
-
import { NonRetryableError } from 'cloudflare:workflows';
|
|
3
|
-
import { drizzle } from 'drizzle-orm/d1';
|
|
4
|
-
import { t as tables, F as FinbricksConnector, M as MockConnector, E as ErsteConnector, v as getPaymentDirection } from './bank.xIMAnZ4v.mjs';
|
|
5
|
-
import { asNonEmpty } from '@develit-io/backend-sdk';
|
|
6
|
-
import { eq, inArray } from 'drizzle-orm';
|
|
7
|
-
import { M as MockCobsConnector } from './bank.D2ZeOkyc.mjs';
|
|
8
|
-
import 'jose';
|
|
9
|
-
import '@develit-io/general-codes';
|
|
10
|
-
|
|
11
|
-
const createPaymentCommand = (db, { payment }) => {
|
|
12
|
-
return {
|
|
13
|
-
command: db.insert(tables.payment).values({
|
|
14
|
-
...payment,
|
|
15
|
-
creditorIban: payment.creditor.iban,
|
|
16
|
-
debtorIban: payment.debtor.iban
|
|
17
|
-
}).returning()
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
const updatePaymentCommand = (db, { payment }) => {
|
|
22
|
-
return {
|
|
23
|
-
command: db.update(tables.payment).set(payment).where(eq(tables.payment.id, payment.id)).returning()
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
const updateAccountLastSyncCommand = (db, { lastSyncedAt, accountId }) => {
|
|
28
|
-
const command = db.update(tables.account).set({
|
|
29
|
-
lastSyncedAt
|
|
30
|
-
}).where(eq(tables.account.id, accountId)).returning();
|
|
31
|
-
return {
|
|
32
|
-
command
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const getAccountByIdQuery = async (db, { accountId }) => {
|
|
37
|
-
return await db.select().from(tables.account).where(eq(tables.account.id, accountId)).get();
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
const getCredentialsByAccountId = async (db, { accountId }) => {
|
|
41
|
-
const cred = await db.select().from(tables.accountCredentials).where(eq(tables.accountCredentials.accountId, accountId)).get();
|
|
42
|
-
return cred;
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
const getPaymentsByBankRefIdsQuery = async (db, { ids }) => {
|
|
46
|
-
return await db.select().from(tables.payment).where(inArray(tables.payment.bankRefId, ids));
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
class CreditasConnector extends FinbricksConnector {
|
|
50
|
-
constructor(config) {
|
|
51
|
-
super("CREDITAS", config);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
class FioConnector extends FinbricksConnector {
|
|
56
|
-
constructor(config) {
|
|
57
|
-
super("FIO", config);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
class MonetaConnector extends FinbricksConnector {
|
|
62
|
-
constructor(config) {
|
|
63
|
-
super("MONETA", config);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const initiateConnector = ({
|
|
68
|
-
bank,
|
|
69
|
-
env,
|
|
70
|
-
connectedAccounts
|
|
71
|
-
}) => {
|
|
72
|
-
switch (bank) {
|
|
73
|
-
case "ERSTE":
|
|
74
|
-
return new ErsteConnector({
|
|
75
|
-
API_KEY: env.ERSTE_API_KEY,
|
|
76
|
-
CLIENT_ID: env.ERSTE_CLIENT_ID,
|
|
77
|
-
CLIENT_SECRET: env.ERSTE_CLIENT_SECRET,
|
|
78
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
79
|
-
AUTH_URI: env.ERSTE_AUTH_URI,
|
|
80
|
-
PAYMENTS_URI: env.ERSTE_PAYMENTS_URI,
|
|
81
|
-
ACCOUNTS_URI: env.ERSTE_ACCOUNTS_URI,
|
|
82
|
-
connectedAccounts
|
|
83
|
-
});
|
|
84
|
-
case "CREDITAS":
|
|
85
|
-
return new CreditasConnector({
|
|
86
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
87
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
88
|
-
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
89
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
90
|
-
connectedAccounts
|
|
91
|
-
});
|
|
92
|
-
case "MOCK_COBS":
|
|
93
|
-
return new MockCobsConnector({
|
|
94
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
95
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
96
|
-
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
97
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
98
|
-
connectedAccounts
|
|
99
|
-
});
|
|
100
|
-
case "FIO":
|
|
101
|
-
return new FioConnector({
|
|
102
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
103
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
104
|
-
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
105
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
106
|
-
connectedAccounts
|
|
107
|
-
});
|
|
108
|
-
case "MONETA":
|
|
109
|
-
return new MonetaConnector({
|
|
110
|
-
BASE_URI: env.FINBRICKS_BASE_URI,
|
|
111
|
-
MERCHANT_ID: env.FINBRICKS_MERCHANT_ID,
|
|
112
|
-
PRIVATE_KEY_PEM: env.FINBRICKS_PRIVATE_KEY_PEM,
|
|
113
|
-
REDIRECT_URI: env.REDIRECT_URI,
|
|
114
|
-
connectedAccounts
|
|
115
|
-
});
|
|
116
|
-
default:
|
|
117
|
-
return new MockConnector();
|
|
118
|
-
}
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
function pushToQueue(queue, message) {
|
|
122
|
-
if (!Array.isArray(message)) return queue.send(message, { contentType: "v8" });
|
|
123
|
-
return queue.sendBatch(
|
|
124
|
-
message.map((m) => ({
|
|
125
|
-
body: m,
|
|
126
|
-
contentType: "v8"
|
|
127
|
-
}))
|
|
128
|
-
);
|
|
129
|
-
}
|
|
130
|
-
class SyncAccountPaymentsWorkflow extends WorkflowEntrypoint {
|
|
131
|
-
async run(event, step) {
|
|
132
|
-
const { accountId } = event.payload;
|
|
133
|
-
const db = drizzle(this.env.BANK_D1, { schema: tables });
|
|
134
|
-
while (true) {
|
|
135
|
-
const account = await step.do("load account", async () => {
|
|
136
|
-
const account2 = await getAccountByIdQuery(db, { accountId });
|
|
137
|
-
if (!account2) {
|
|
138
|
-
throw new NonRetryableError(`Bank account not found: ${accountId}`);
|
|
139
|
-
}
|
|
140
|
-
return account2;
|
|
141
|
-
});
|
|
142
|
-
if (!account.lastSyncedAt) {
|
|
143
|
-
throw new Error(`lastSyncedAt is not set for account: ${accountId}`);
|
|
144
|
-
}
|
|
145
|
-
const credentials = await step.do(
|
|
146
|
-
"load account credentials",
|
|
147
|
-
async () => {
|
|
148
|
-
const credentials2 = await getCredentialsByAccountId(db, { accountId });
|
|
149
|
-
if (!credentials2) {
|
|
150
|
-
throw new NonRetryableError(
|
|
151
|
-
`No credentials found for account: ${accountId}`
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
return credentials2;
|
|
155
|
-
}
|
|
156
|
-
);
|
|
157
|
-
const payments = await step.do(
|
|
158
|
-
"fetch bank payments",
|
|
159
|
-
{
|
|
160
|
-
retries: { limit: 5, delay: 2e3, backoff: "constant" },
|
|
161
|
-
timeout: "30 seconds"
|
|
162
|
-
},
|
|
163
|
-
async () => {
|
|
164
|
-
const connector = initiateConnector({
|
|
165
|
-
env: this.env,
|
|
166
|
-
bank: account.connectorKey,
|
|
167
|
-
connectedAccounts: [
|
|
168
|
-
{
|
|
169
|
-
...account,
|
|
170
|
-
iban: account.iban,
|
|
171
|
-
token: credentials.value
|
|
172
|
-
}
|
|
173
|
-
]
|
|
174
|
-
});
|
|
175
|
-
const fetched = await connector.getAllAccountPayments({
|
|
176
|
-
environment: this.env.ENVIRONMENT,
|
|
177
|
-
db,
|
|
178
|
-
account,
|
|
179
|
-
filter: { dateFrom: account.lastSyncedAt }
|
|
180
|
-
});
|
|
181
|
-
return fetched.map((p) => ({
|
|
182
|
-
...p,
|
|
183
|
-
direction: getPaymentDirection(p, account.iban)
|
|
184
|
-
}));
|
|
185
|
-
}
|
|
186
|
-
);
|
|
187
|
-
if (payments.length) {
|
|
188
|
-
const bankRefIds = payments.map((payment) => payment.bankRefId).filter(Boolean);
|
|
189
|
-
const existing = await step.do("load existing payments", async () => {
|
|
190
|
-
return await getPaymentsByBankRefIdsQuery(db, {
|
|
191
|
-
ids: bankRefIds
|
|
192
|
-
});
|
|
193
|
-
});
|
|
194
|
-
const paymentsToUpdate = payments.filter(
|
|
195
|
-
(p) => existing.some((e) => e.bankRefId === p.bankRefId)
|
|
196
|
-
);
|
|
197
|
-
const paymentsToCreate = payments.filter(
|
|
198
|
-
(p) => !existing.some((e) => e.bankRefId === p.bankRefId)
|
|
199
|
-
);
|
|
200
|
-
await step.do("process payments and update lastSyncAt", async () => {
|
|
201
|
-
const eventsToEmit = [];
|
|
202
|
-
const updateCommands = paymentsToUpdate.map(
|
|
203
|
-
(p) => updatePaymentCommand(db, { payment: p }).command
|
|
204
|
-
);
|
|
205
|
-
eventsToEmit.push(
|
|
206
|
-
...paymentsToUpdate.map((p) => ({
|
|
207
|
-
eventType: "BANK_PAYMENT",
|
|
208
|
-
eventSignal: "paymentUpdated",
|
|
209
|
-
bankPayment: p,
|
|
210
|
-
metadata: {
|
|
211
|
-
correlationId: p.correlationId,
|
|
212
|
-
entityId: p.id,
|
|
213
|
-
idempotencySuffix: p.status,
|
|
214
|
-
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
215
|
-
}
|
|
216
|
-
}))
|
|
217
|
-
);
|
|
218
|
-
const createCommands = paymentsToCreate.map(
|
|
219
|
-
(p) => createPaymentCommand(db, { payment: p }).command
|
|
220
|
-
);
|
|
221
|
-
eventsToEmit.push(
|
|
222
|
-
...paymentsToCreate.map((p) => ({
|
|
223
|
-
eventType: "BANK_PAYMENT",
|
|
224
|
-
eventSignal: "paymentCreated",
|
|
225
|
-
bankPayment: p,
|
|
226
|
-
metadata: {
|
|
227
|
-
correlationId: p.correlationId,
|
|
228
|
-
entityId: p.id,
|
|
229
|
-
timestamp: (/* @__PURE__ */ new Date()).toDateString()
|
|
230
|
-
}
|
|
231
|
-
}))
|
|
232
|
-
);
|
|
233
|
-
const latest = payments.reduce((current, p) => {
|
|
234
|
-
return new Date(p.processedAt).getTime() > new Date(current.processedAt).getTime() ? p : current;
|
|
235
|
-
}, payments[0]);
|
|
236
|
-
const updateLastSyncCommand = updateAccountLastSyncCommand(db, {
|
|
237
|
-
accountId: account.id,
|
|
238
|
-
lastSyncedAt: latest.processedAt
|
|
239
|
-
}).command;
|
|
240
|
-
if (eventsToEmit.length) {
|
|
241
|
-
await db.batch(
|
|
242
|
-
asNonEmpty([
|
|
243
|
-
updateLastSyncCommand,
|
|
244
|
-
...updateCommands,
|
|
245
|
-
...createCommands
|
|
246
|
-
])
|
|
247
|
-
);
|
|
248
|
-
await pushToQueue(
|
|
249
|
-
this.env.QUEUE_BUS_QUEUE,
|
|
250
|
-
eventsToEmit
|
|
251
|
-
);
|
|
252
|
-
}
|
|
253
|
-
return {
|
|
254
|
-
payments: payments.length,
|
|
255
|
-
updated: paymentsToUpdate.length,
|
|
256
|
-
created: paymentsToCreate.length,
|
|
257
|
-
eventsEmitted: eventsToEmit.length,
|
|
258
|
-
lastSyncedAt: latest?.createdAt
|
|
259
|
-
};
|
|
260
|
-
});
|
|
261
|
-
}
|
|
262
|
-
await step.sleep(
|
|
263
|
-
"Sleep for next sync",
|
|
264
|
-
`${account.syncIntervalS} seconds`
|
|
265
|
-
);
|
|
266
|
-
}
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
const workflows = {
|
|
271
|
-
__proto__: null,
|
|
272
|
-
SyncAccountPaymentsWorkflow: SyncAccountPaymentsWorkflow
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
export { SyncAccountPaymentsWorkflow as S, updateAccountLastSyncCommand as a, getCredentialsByAccountId as b, createPaymentCommand as c, getPaymentsByBankRefIdsQuery as g, initiateConnector as i, updatePaymentCommand as u, workflows as w };
|