@develit-services/bank 0.0.41 → 0.0.42

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.
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const database_schema = require('../shared/bank.C2tmTjwq.cjs');
3
+ const database_schema = require('../shared/bank.Cw5xzUgM.cjs');
4
4
  require('@develit-io/backend-sdk');
5
5
  require('drizzle-orm/sqlite-core');
6
6
  require('drizzle-orm');
@@ -1,4 +1,5 @@
1
- export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.e_XSg9KV.cjs';
1
+ export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.PvYf5Bqd.cjs';
2
2
  import 'drizzle-orm/sqlite-core';
3
3
  import 'drizzle-orm';
4
4
  import 'zod';
5
+ import '@develit-io/backend-sdk';
@@ -1,4 +1,5 @@
1
- export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.e_XSg9KV.mjs';
1
+ export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.PvYf5Bqd.mjs';
2
2
  import 'drizzle-orm/sqlite-core';
3
3
  import 'drizzle-orm';
4
4
  import 'zod';
5
+ import '@develit-io/backend-sdk';
@@ -1,4 +1,5 @@
1
- export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.e_XSg9KV.js';
1
+ export { f as account, g as accountCredentials, c as batch, o as ott, d as payment, e as paymentRelations } from '../shared/bank.PvYf5Bqd.js';
2
2
  import 'drizzle-orm/sqlite-core';
3
3
  import 'drizzle-orm';
4
4
  import 'zod';
5
+ import '@develit-io/backend-sdk';
@@ -1,4 +1,4 @@
1
- export { y as account, z as accountCredentials, r as batch, x as ott, v as payment, w as paymentRelations } from '../shared/bank.HuMp6uP6.mjs';
1
+ export { D as account, G as accountCredentials, w as batch, z as ott, x as payment, y as paymentRelations } from '../shared/bank.C4RJkRzZ.mjs';
2
2
  import '@develit-io/backend-sdk';
3
3
  import 'drizzle-orm/sqlite-core';
4
4
  import 'drizzle-orm';
@@ -5,12 +5,12 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  const backendSdk = require('@develit-io/backend-sdk');
6
6
  const cloudflare_workers = require('cloudflare:workers');
7
7
  const d1 = require('drizzle-orm/d1');
8
- const database_schema = require('../shared/bank.C2tmTjwq.cjs');
8
+ const database_schema = require('../shared/bank.Cw5xzUgM.cjs');
9
9
  require('jose');
10
10
  const generalCodes = require('@develit-io/general-codes');
11
11
  const zod = require('zod');
12
12
  const drizzleOrm = require('drizzle-orm');
13
- const mockCobs_connector = require('../shared/bank.DBgpADhg.cjs');
13
+ const mockCobs_connector = require('../shared/bank.DSXZph4D.cjs');
14
14
  require('drizzle-orm/sqlite-core');
15
15
  require('drizzle-zod');
16
16
  require('date-fns');
@@ -349,20 +349,21 @@ const seperateSupportedPayments = (mappedPayments, accounts) => {
349
349
  };
350
350
 
351
351
  const sendPaymentInputSchema = zod.z.object({
352
+ correlationId: zod.z.string().min(1),
352
353
  refId: zod.z.string(),
353
354
  amount: zod.z.number().positive(),
354
355
  paymentType: zod.z.enum(database_schema.PAYMENT_TYPES),
356
+ chargeBearer: zod.z.enum(database_schema.CHARGE_BEARERS),
357
+ executionDate: zod.z.string(),
358
+ instructionPriority: zod.z.enum(database_schema.INSTRUCTION_PRIORITIES),
355
359
  currency: zod.z.enum(generalCodes.CURRENCY_CODES),
356
- vs: zod.z.string().nullable().optional(),
357
- ss: zod.z.string().nullable().optional(),
358
- ks: zod.z.string().nullable().optional(),
359
- message: zod.z.string().nullable().optional(),
360
- creditorHolderName: zod.z.string(),
361
- creditorAccountNumberWithBankCode: zod.z.string(),
362
- creditorIban: zod.z.string(),
363
- debtorHolderName: zod.z.string(),
364
- debtorAccountNumberWithBankCode: zod.z.string(),
365
- debtorIban: zod.z.string()
360
+ vs: zod.z.string().optional(),
361
+ ss: zod.z.string().optional(),
362
+ ks: zod.z.string().optional(),
363
+ message: zod.z.string().optional(),
364
+ creditor: backendSdk.bankAccountMetadataSchema,
365
+ debtor: backendSdk.bankAccountMetadataSchema,
366
+ purpose: zod.z.string().optional()
366
367
  });
367
368
 
368
369
  const getAuthUriInputSchema = zod.z.object({
@@ -393,11 +394,6 @@ const setLastSyncAtInputSchema = zod.z.object({
393
394
  lastSyncedAt: zod.z.coerce.date()
394
395
  });
395
396
 
396
- const initiateConnectorInputSchema = zod.z.object({
397
- connectorKey: zod.z.enum(database_schema.CONNECTOR_KEYS),
398
- withAuth: zod.z.boolean().default(true).optional()
399
- });
400
-
401
397
  const ALLOWED_BATCH_FILTERS = {
402
398
  ACCOUNT_ID: "filterBatchAccountId",
403
399
  STATUS: "filterBatchStatus"
@@ -447,6 +443,10 @@ const syncAccountInputSchema = zod.z.object({
447
443
  accountId: zod.z.uuid()
448
444
  });
449
445
 
446
+ const updateAccountInputSchema = zod.z.object({
447
+ account: database_schema.accountInsertSchema
448
+ });
449
+
450
450
  var __defProp = Object.defineProperty;
451
451
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
452
452
  var __decorateClass = (decorators, target, key, kind) => {
@@ -464,22 +464,123 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
464
464
  this.allowedProviders = config.allowedProviders;
465
465
  this.db = d1.drizzle(this.env.BANK_D1, { schema: database_schema.tables });
466
466
  }
467
- getAllowedProviders() {
468
- return this.allowedProviders;
469
- }
470
- async getAccounts() {
467
+ async _getAccounts() {
471
468
  return await getAllAccountsQuery(this.db);
472
469
  }
473
- async getPayments(input) {
474
- return this.handleAction(
475
- { data: input, schema: getPaymentsInputSchema },
476
- { successMessage: "Payments fetched successfully" },
477
- async (pagination) => {
478
- return await getPaymentsWithPaginationQuery(this.db, pagination);
470
+ async _saveOrUpdatePayments(accounts) {
471
+ const allFetchedPayments = [];
472
+ const connectorKeys = new Set(
473
+ accounts.map(({ connectorKey }) => connectorKey)
474
+ );
475
+ for (const connectorKey of connectorKeys) {
476
+ await this._initiateBankConnector({ connectorKey });
477
+ for (const account of accounts.filter(
478
+ (acc) => acc.connectorKey === connectorKey
479
+ )) {
480
+ const payments = await this.bankConnector.getAllAccountPayments({
481
+ db: this.db,
482
+ env: this.env.ENVIRONMENT,
483
+ account
484
+ });
485
+ if (!payments || payments.length === 0) continue;
486
+ this.log(payments);
487
+ payments.forEach((payment) => {
488
+ payment.direction = database_schema.getPaymentDirection(payment, account.iban);
489
+ });
490
+ allFetchedPayments.push(...payments);
491
+ }
492
+ }
493
+ if (allFetchedPayments.length < 1) return;
494
+ const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
495
+ const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
496
+ this.db,
497
+ {
498
+ ids: bankRefIds
479
499
  }
480
500
  );
501
+ const paymentsCommands = allFetchedPayments.map((payment) => {
502
+ const isAlreadyExisting = alreadyExistingPayments.some(
503
+ (existingPayment) => existingPayment.bankRefId === payment.bankRefId
504
+ );
505
+ if (isAlreadyExisting)
506
+ return updatePaymentCommand(this.db, { payment }).command;
507
+ return createPaymentCommand(this.db, { payment }).command;
508
+ });
509
+ await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
510
+ console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
511
+ for (const account of accounts) {
512
+ const paymentsForAccount = allFetchedPayments.filter(
513
+ (payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
514
+ );
515
+ let lastSyncPayment;
516
+ lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
517
+ (a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
518
+ )[0];
519
+ if (!lastSyncPayment) {
520
+ lastSyncPayment = paymentsForAccount.sort(
521
+ (a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
522
+ )[0];
523
+ }
524
+ if (lastSyncPayment.createdAt) {
525
+ await updateAccountLastSyncCommand(this.db, {
526
+ accountId: account.id,
527
+ lastSyncedAt: lastSyncPayment.createdAt
528
+ }).command.execute();
529
+ }
530
+ }
531
+ await this.pushToQueue(
532
+ this.env.QUEUE_BUS_QUEUE,
533
+ allFetchedPayments.map((payment) => ({
534
+ eventType: "BANK_PAYMENT",
535
+ bankPayment: payment,
536
+ metadata: {
537
+ correlationId: backendSdk.uuidv4(),
538
+ timestamp: (/* @__PURE__ */ new Date()).toDateString()
539
+ }
540
+ }))
541
+ );
542
+ }
543
+ async _initiateBankConnector({
544
+ connectorKey,
545
+ withAuth
546
+ }) {
547
+ if (!this.allowedProviders.includes(connectorKey)) {
548
+ throw backendSdk.createInternalError(null, {
549
+ message: `Invalid connector key: ${connectorKey}`
550
+ });
551
+ }
552
+ const accounts = await this._getAccounts();
553
+ const accountsForConnector = accounts.filter(
554
+ (acc) => acc.connectorKey === connectorKey
555
+ );
556
+ const accountsWithCredentials = await Promise.all(
557
+ accountsForConnector.map(async (acc) => {
558
+ const credentials = await getCredentialsByAccountId(this.db, {
559
+ accountId: acc.id
560
+ });
561
+ if (!credentials) {
562
+ throw backendSdk.createInternalError(null, {
563
+ message: `No credentials found for account ${acc.id}`
564
+ });
565
+ }
566
+ return {
567
+ currency: acc.currency,
568
+ iban: acc.iban,
569
+ token: credentials.value,
570
+ id: acc.id,
571
+ connectorKey: acc.connectorKey
572
+ };
573
+ })
574
+ );
575
+ this.bankConnector = initiateConnector({
576
+ bank: connectorKey,
577
+ connectedAccounts: accountsWithCredentials,
578
+ env: this.env
579
+ });
580
+ if (!withAuth) return;
581
+ await this.bankConnector.authenticate();
481
582
  }
482
- accountFetchInterval(connectorKey) {
583
+ _accountFetchInterval(connectorKey) {
483
584
  switch (connectorKey) {
484
585
  case "ERSTE":
485
586
  return database_schema.ErsteConnector.FETCH_INTERVAL;
@@ -491,10 +592,19 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
491
592
  return 0;
492
593
  }
493
594
  }
595
+ async getPayments(input) {
596
+ return this.handleAction(
597
+ { data: input, schema: getPaymentsInputSchema },
598
+ { successMessage: "Payments fetched successfully" },
599
+ async (pagination) => {
600
+ return await getPaymentsWithPaginationQuery(this.db, pagination);
601
+ }
602
+ );
603
+ }
494
604
  async syncAccount(input) {
495
605
  return this.handleAction(
496
606
  { data: input, schema: syncAccountInputSchema },
497
- { successMessage: "" },
607
+ { successMessage: "Account synchronized successfully" },
498
608
  async ({ accountId }) => {
499
609
  const account = await getAccountByIdQuery(this.db, {
500
610
  accountId
@@ -505,38 +615,40 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
505
615
  message: "Account not found",
506
616
  status: 404
507
617
  });
508
- await this.syncAccounts({
509
- accounts: [account]
510
- });
618
+ await this._saveOrUpdatePayments([account]);
511
619
  }
512
620
  );
513
621
  }
514
622
  async syncAccounts(options) {
515
- return this.handleAction(null, {}, async () => {
516
- const accountsToSync = [];
517
- let accounts = options?.accounts || [];
518
- if (!accounts.length) {
519
- accounts = await this.getAccounts();
520
- }
521
- for (const account of accounts.filter(
522
- (acc) => !!!acc.connectorKey.includes("MOCK")
523
- )) {
524
- const accountFetchInterval = this.accountFetchInterval(
525
- account.connectorKey
526
- );
527
- const now = Date.now();
528
- const lastSyncTime = account.lastSyncedAt.getTime();
529
- const intervalMs = accountFetchInterval * 1e3;
530
- const shouldFetch = now - lastSyncTime >= intervalMs;
531
- if (!shouldFetch) continue;
532
- accountsToSync.push({
533
- ...account
534
- });
623
+ return this.handleAction(
624
+ null,
625
+ { successMessage: "Accounts synchronized successfully" },
626
+ async () => {
627
+ const accountsToSync = [];
628
+ let accounts = options?.accounts || [];
629
+ if (!accounts.length) {
630
+ accounts = await this._getAccounts();
631
+ }
632
+ for (const account of accounts.filter(
633
+ (acc) => !!!acc.connectorKey.includes("MOCK")
634
+ )) {
635
+ const accountFetchInterval = this._accountFetchInterval(
636
+ account.connectorKey
637
+ );
638
+ const now = Date.now();
639
+ const lastSyncTime = account.lastSyncedAt.getTime();
640
+ const intervalMs = accountFetchInterval * 1e3;
641
+ const shouldFetch = now - lastSyncTime >= intervalMs;
642
+ if (!shouldFetch) continue;
643
+ accountsToSync.push({
644
+ ...account
645
+ });
646
+ }
647
+ console.log("ACCS TO SYNC", accountsToSync.length);
648
+ if (accountsToSync.length <= 0) return;
649
+ await this._saveOrUpdatePayments(accounts);
535
650
  }
536
- console.log("ACCS TO SYNC", accountsToSync.length);
537
- if (accountsToSync.length <= 0) return;
538
- await this.saveOrUpdatePayments(accountsToSync);
539
- });
651
+ );
540
652
  }
541
653
  async scheduled(controller) {
542
654
  if (controller.cron === this.env.CRON_PAYMENTS_PROCESSING) {
@@ -551,7 +663,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
551
663
  async updateBatchStatuses() {
552
664
  const pendingBatches = await getAllPendingBatchesQuery(this.db);
553
665
  const uniqueConnectors = /* @__PURE__ */ new Set();
554
- const accounts = await this.getAccounts();
666
+ const accounts = await this._getAccounts();
555
667
  for (const batch of pendingBatches) {
556
668
  const connectorKey = accounts.find(
557
669
  (acc) => acc.id === batch.accountId
@@ -592,53 +704,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
592
704
  ]);
593
705
  console.log("Batch update completed");
594
706
  }
595
- // @action('initiate-bank-connector')
596
- async initiateBankConnector(input) {
597
- return this.handleAction(
598
- { data: input, schema: initiateConnectorInputSchema },
599
- { successMessage: "Bank connector initiated successfully" },
600
- async ({ connectorKey, withAuth }) => {
601
- if (!this.allowedProviders.includes(connectorKey)) {
602
- throw backendSdk.createInternalError(null, {
603
- message: `Invalid connector key: ${connectorKey}`
604
- });
605
- }
606
- const accounts = await this.getAccounts();
607
- const accountsForConnector = accounts.filter(
608
- (acc) => acc.connectorKey === connectorKey
609
- );
610
- const accountsWithCredentials = await Promise.all(
611
- accountsForConnector.map(async (acc) => {
612
- const credentials = await getCredentialsByAccountId(this.db, {
613
- accountId: acc.id
614
- });
615
- if (!credentials) {
616
- throw backendSdk.createInternalError(null, {
617
- message: `No credentials found for account ${acc.id}`
618
- });
619
- }
620
- return {
621
- currency: acc.currency,
622
- iban: acc.iban,
623
- token: credentials.value,
624
- id: acc.id,
625
- connectorKey: acc.connectorKey
626
- };
627
- })
628
- );
629
- this.bankConnector = initiateConnector({
630
- bank: connectorKey,
631
- connectedAccounts: accountsWithCredentials,
632
- env: this.env
633
- });
634
- if (!withAuth) return;
635
- await this.bankConnector.authenticate();
636
- }
637
- );
638
- }
639
- batchLimit(connectorKey) {
640
- return 50;
641
- }
642
707
  async addPaymentsToBatch({
643
708
  paymentsToBatch
644
709
  }) {
@@ -648,9 +713,8 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
648
713
  (payment) => {
649
714
  return {
650
715
  id: backendSdk.uuidv4(),
651
- accountId: "",
716
+ correlationId: payment.correlationId,
652
717
  refId: payment.refId,
653
- connectorKey: "MOCK",
654
718
  amount: payment.amount,
655
719
  direction: "OUTGOING",
656
720
  paymentType: payment.paymentType,
@@ -662,16 +726,14 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
662
726
  ss: payment.ss || null,
663
727
  ks: payment.ks || null,
664
728
  message: payment.message || null,
665
- creditorHolderName: payment.creditorHolderName,
666
- creditorAccountNumberWithBankCode: payment.creditorAccountNumberWithBankCode,
667
- creditorIban: payment.creditorIban,
668
- debtorHolderName: payment.debtorHolderName,
669
- debtorAccountNumberWithBankCode: payment.debtorAccountNumberWithBankCode,
670
- debtorIban: payment.debtorIban
729
+ creditor: payment.creditor,
730
+ creditorIban: payment.creditor.iban || null,
731
+ debtor: payment.debtor,
732
+ debtorIban: payment.debtor.iban || null
671
733
  };
672
734
  }
673
735
  );
674
- const accounts = await this.getAccounts();
736
+ const accounts = await this._getAccounts();
675
737
  const { supportedPayments, unsupportedPayments } = seperateSupportedPayments(mappedPayments, accounts);
676
738
  if (unsupportedPayments.length > 0) {
677
739
  this.logError({ unsupportedPayments });
@@ -682,23 +744,16 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
682
744
  bankPayment: {
683
745
  ...unsupported,
684
746
  status: "FAILED",
685
- statusReason: "UNSUPPORTED_ACCOUNT",
686
- paymentType: unsupported.paymentType,
687
- creditorAccountNumberWithBankCode: unsupported.creditorAccountNumberWithBankCode,
688
- creditorIban: unsupported.creditorIban,
689
- creditorHolderName: unsupported.creditorHolderName,
690
- debtorAccountNumberWithBankCode: unsupported.debtorAccountNumberWithBankCode,
691
- debtorIban: unsupported.debtorIban,
692
- debtorHolderName: unsupported.debtorHolderName
747
+ statusReason: "UNSUPPORTED_ACCOUNT"
693
748
  },
694
749
  metadata: {
695
- correlationId: backendSdk.uuidv4(),
750
+ correlationId: unsupported.correlationId,
696
751
  timestamp: (/* @__PURE__ */ new Date()).toDateString()
697
752
  }
698
753
  }))
699
754
  );
700
755
  }
701
- for (const acc of await this.getAccounts()) {
756
+ for (const acc of accounts) {
702
757
  const newPayments = supportedPayments.filter(
703
758
  (payment) => payment.debtorIban === acc.iban && payment.currency === acc.currency
704
759
  ).map((payment) => ({
@@ -716,7 +771,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
716
771
  accountId: acc.id
717
772
  });
718
773
  const availableBatch = openBatches.find(
719
- (batch) => batch.payments.length >= this.batchLimit(acc.connectorKey)
774
+ (batch) => batch.payments.length >= acc.batchSizeLimit
720
775
  );
721
776
  this.log({
722
777
  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`
@@ -752,7 +807,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
752
807
  status: "PROCESSING"
753
808
  }
754
809
  }).command.execute();
755
- await this.initiateBankConnector({ connectorKey });
810
+ await this._initiateBankConnector({ connectorKey });
756
811
  if (!this.bankConnector) {
757
812
  await upsertBatchCommand(this.db, {
758
813
  batch: {
@@ -881,7 +936,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
881
936
  { data: input, schema: getAuthUriInputSchema },
882
937
  { successMessage: "Auth URI obtained." },
883
938
  async ({ connectorKey }) => {
884
- await this.initiateBankConnector({ connectorKey, withAuth: false });
939
+ await this._initiateBankConnector({ connectorKey, withAuth: false });
885
940
  const ott = backendSdk.uuidv4();
886
941
  const { command: createOneTimeToken } = createOneTimeTokenCommand(
887
942
  this.db,
@@ -919,14 +974,14 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
919
974
  status: 400
920
975
  });
921
976
  }
922
- await this.initiateBankConnector({
977
+ await this._initiateBankConnector({
923
978
  connectorKey: ottRow.refId
924
979
  });
925
980
  const { credentials, accounts } = await this.bankConnector.authorizeAccount({
926
981
  urlParams
927
982
  });
928
983
  console.log("Bank connector initiated");
929
- const alreadyExistingAccounts = (await this.getAccounts()).filter(
984
+ const alreadyExistingAccounts = (await this._getAccounts()).filter(
930
985
  (acc) => acc.connectorKey === ottRow.refId && accounts.map((item) => item.iban).includes(acc.iban)
931
986
  );
932
987
  const upsertAccounts = accounts.map(
@@ -953,7 +1008,7 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
953
1008
  ...deleteCredentials,
954
1009
  ...createAccountCredentials
955
1010
  ]);
956
- const fetchedAccounts = await this.getAccounts();
1011
+ const fetchedAccounts = await this._getAccounts();
957
1012
  if (!fetchedAccounts)
958
1013
  throw backendSdk.createInternalError(null, {
959
1014
  message: "Account not found",
@@ -966,79 +1021,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
966
1021
  }
967
1022
  );
968
1023
  }
969
- async saveOrUpdatePayments(accounts) {
970
- return this.handleAction(null, {}, async () => {
971
- const allFetchedPayments = [];
972
- const connectorKeys = new Set(
973
- accounts.map(({ connectorKey }) => connectorKey)
974
- );
975
- for (const connectorKey of connectorKeys) {
976
- await this.initiateBankConnector({ connectorKey });
977
- for (const account of accounts.filter(
978
- (acc) => acc.connectorKey === connectorKey
979
- )) {
980
- const payments = await this.bankConnector.getAllAccountPayments({
981
- db: this.db,
982
- env: this.env.ENVIRONMENT,
983
- account
984
- });
985
- if (!payments || payments.length === 0) continue;
986
- this.log(payments);
987
- payments.forEach((payment) => {
988
- payment.direction = database_schema.getPaymentDirection(payment, account.iban);
989
- });
990
- allFetchedPayments.push(...payments);
991
- }
992
- }
993
- if (allFetchedPayments.length < 1) return;
994
- const bankRefIds = allFetchedPayments.map((payment) => payment.bankRefId).filter(Boolean);
995
- const alreadyExistingPayments = await getPaymentsByBankRefIdsQuery(
996
- this.db,
997
- { ids: bankRefIds }
998
- );
999
- const paymentsCommands = allFetchedPayments.map((payment) => {
1000
- const isAlreadyExisting = alreadyExistingPayments.some(
1001
- (existingPayment) => existingPayment.bankRefId === payment.bankRefId
1002
- );
1003
- if (isAlreadyExisting)
1004
- return updatePaymentCommand(this.db, { payment }).command;
1005
- return createPaymentCommand(this.db, { payment }).command;
1006
- });
1007
- await this.db.batch([paymentsCommands[0], ...paymentsCommands.slice(1)]);
1008
- console.log("FETCHEDPAYMANETS TO SYNC", allFetchedPayments.length);
1009
- for (const account of accounts) {
1010
- const paymentsForAccount = allFetchedPayments.filter(
1011
- (payment) => (payment.direction === "OUTGOING" ? payment.debtorIban : payment.creditorIban) === account.iban
1012
- );
1013
- let lastSyncPayment;
1014
- lastSyncPayment = paymentsForAccount.filter(({ status }) => status !== "COMPLETED").sort(
1015
- (a, b) => (a.createdAt?.getTime() || 0) - (b.createdAt?.getTime() || 0)
1016
- )[0];
1017
- if (!lastSyncPayment) {
1018
- lastSyncPayment = paymentsForAccount.sort(
1019
- (a, b) => (b.createdAt?.getTime() || 0) - (a.createdAt?.getTime() || 0)
1020
- )[0];
1021
- }
1022
- if (lastSyncPayment.createdAt) {
1023
- await updateAccountLastSyncCommand(this.db, {
1024
- accountId: account.id,
1025
- lastSyncedAt: lastSyncPayment.createdAt
1026
- }).command.execute();
1027
- }
1028
- }
1029
- await this.pushToQueue(
1030
- this.env.QUEUE_BUS_QUEUE,
1031
- allFetchedPayments.map((payment) => ({
1032
- eventType: "BANK_PAYMENT",
1033
- bankPayment: payment,
1034
- metadata: {
1035
- correlationId: backendSdk.uuidv4(),
1036
- timestamp: (/* @__PURE__ */ new Date()).toDateString()
1037
- }
1038
- }))
1039
- );
1040
- });
1041
- }
1042
1024
  async simulateDeposit(input) {
1043
1025
  return this.handleAction(
1044
1026
  { data: input, schema: simulateDepositInputSchema },
@@ -1119,7 +1101,6 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
1119
1101
  accountId: account.id,
1120
1102
  lastSyncedAt
1121
1103
  }).command.execute();
1122
- return {};
1123
1104
  }
1124
1105
  );
1125
1106
  }
@@ -1136,9 +1117,33 @@ let BankServiceBase = class extends backendSdk.develitWorker(cloudflare_workers.
1136
1117
  );
1137
1118
  }
1138
1119
  async getBankAccounts() {
1139
- return backendSdk.RPCResponse.ok("Bank accounts retrieved successfully", {
1140
- data: await this.getAccounts()
1141
- });
1120
+ return this.handleAction(
1121
+ null,
1122
+ { successMessage: "Bank accounts retrieved successfully" },
1123
+ async () => await this._getAccounts()
1124
+ );
1125
+ }
1126
+ async updateAccount(input) {
1127
+ return this.handleAction(
1128
+ {
1129
+ data: input,
1130
+ schema: updateAccountInputSchema
1131
+ },
1132
+ { successMessage: "Account updated successfully" },
1133
+ async ({ account }) => {
1134
+ const updatedAccount = await upsertAccountCommand(this.db, {
1135
+ account
1136
+ }).command.execute().then(backendSdk.first);
1137
+ if (!updatedAccount) {
1138
+ throw backendSdk.createInternalError(null, {
1139
+ message: "Account not found",
1140
+ code: "ACCOUNT_NOT_FOUND",
1141
+ status: 404
1142
+ });
1143
+ }
1144
+ return updatedAccount;
1145
+ }
1146
+ );
1142
1147
  }
1143
1148
  async getBatches(input) {
1144
1149
  return this.handleAction(
@@ -1180,9 +1185,6 @@ __decorateClass([
1180
1185
  __decorateClass([
1181
1186
  backendSdk.action("authorize-account")
1182
1187
  ], BankServiceBase.prototype, "authorizeAccount", 1);
1183
- __decorateClass([
1184
- backendSdk.action("save-or-update-payments")
1185
- ], BankServiceBase.prototype, "saveOrUpdatePayments", 1);
1186
1188
  __decorateClass([
1187
1189
  backendSdk.action("simulate-deposit")
1188
1190
  ], BankServiceBase.prototype, "simulateDeposit", 1);
@@ -1195,6 +1197,9 @@ __decorateClass([
1195
1197
  __decorateClass([
1196
1198
  backendSdk.action("get-bank-accounts")
1197
1199
  ], BankServiceBase.prototype, "getBankAccounts", 1);
1200
+ __decorateClass([
1201
+ backendSdk.action("update-account")
1202
+ ], BankServiceBase.prototype, "updateAccount", 1);
1198
1203
  __decorateClass([
1199
1204
  backendSdk.action("getBatches")
1200
1205
  ], BankServiceBase.prototype, "getBatches", 1);