refactor(nestjs): hook up new endpoints

This commit is contained in:
Ahmed Bouhuolia
2025-05-16 01:41:11 +02:00
parent ecb80b2cf2
commit 4de1ef71ca
23 changed files with 644 additions and 38 deletions

View File

@@ -1,12 +1,25 @@
import { Controller, Param, Post } from '@nestjs/common';
import { Controller, Get, Param, Post, Query } from '@nestjs/common';
import { BankAccountsApplication } from './BankAccountsApplication.service';
import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger';
import { ICashflowAccountsFilter } from './types/BankAccounts.types';
@Controller('banking/accounts')
@ApiTags('banking-accounts')
export class BankAccountsController {
constructor(private bankAccountsApplication: BankAccountsApplication) {}
@Get()
@ApiOperation({ summary: 'Retrieve the bank accounts.' })
getBankAccounts(@Query() filterDto: ICashflowAccountsFilter) {
return this.bankAccountsApplication.getBankAccounts(filterDto);
}
@Get(':bankAccountId/summary')
@ApiOperation({ summary: 'Retrieve the bank account summary.' })
getBankAccountSummary(@Param('bankAccountId') bankAccountId: number) {
return this.bankAccountsApplication.getBankAccountSumnmary(bankAccountId);
}
@Post(':id/disconnect')
@ApiOperation({
summary: 'Disconnect the bank connection of the given bank account.',

View File

@@ -12,6 +12,9 @@ import { PlaidModule } from '../Plaid/Plaid.module';
import { BankRulesModule } from '../BankRules/BankRules.module';
import { BankingTransactionsRegonizeModule } from '../BankingTranasctionsRegonize/BankingTransactionsRegonize.module';
import { BankingTransactionsModule } from '../BankingTransactions/BankingTransactions.module';
import { GetBankAccountsService } from './queries/GetBankAccounts';
import { DynamicListModule } from '../DynamicListing/DynamicList.module';
import { GetBankAccountSummary } from './queries/GetBankAccountSummary';
@Module({
imports: [
@@ -20,6 +23,7 @@ import { BankingTransactionsModule } from '../BankingTransactions/BankingTransac
BankRulesModule,
BankingTransactionsRegonizeModule,
BankingTransactionsModule,
DynamicListModule
],
providers: [
DisconnectBankAccountService,
@@ -29,6 +33,8 @@ import { BankingTransactionsModule } from '../BankingTransactions/BankingTransac
DeleteUncategorizedTransactionsOnAccountDeleting,
DisconnectPlaidItemOnAccountDeleted,
BankAccountsApplication,
GetBankAccountsService,
GetBankAccountSummary
],
exports: [BankAccountsApplication],
controllers: [BankAccountsController],

View File

@@ -3,16 +3,39 @@ import { DisconnectBankAccountService } from './commands/DisconnectBankAccount.s
import { RefreshBankAccountService } from './commands/RefreshBankAccount.service';
import { ResumeBankAccountFeedsService } from './commands/ResumeBankAccountFeeds.service';
import { PauseBankAccountFeeds } from './commands/PauseBankAccountFeeds.service';
import { GetBankAccountsService } from './queries/GetBankAccounts';
import { ICashflowAccountsFilter } from './types/BankAccounts.types';
import { GetBankAccountSummary } from './queries/GetBankAccountSummary';
@Injectable()
export class BankAccountsApplication {
constructor(
private disconnectBankAccountService: DisconnectBankAccountService,
private readonly getBankAccountsService: GetBankAccountsService,
private readonly getBankAccountSummaryService: GetBankAccountSummary,
private readonly disconnectBankAccountService: DisconnectBankAccountService,
private readonly refreshBankAccountService: RefreshBankAccountService,
private readonly resumeBankAccountFeedsService: ResumeBankAccountFeedsService,
private readonly pauseBankAccountFeedsService: PauseBankAccountFeeds,
) {}
/**
* Retrieves the bank accounts.
* @param {ICashflowAccountsFilter} filterDto -
*/
getBankAccounts(filterDto: ICashflowAccountsFilter) {
return this.getBankAccountsService.getCashflowAccounts(filterDto);
}
/**
* Retrieves the given bank account summary.
* @param {number} bankAccountId
*/
getBankAccountSumnmary(bankAccountId: number) {
return this.getBankAccountSummaryService.getBankAccountSummary(
bankAccountId,
);
}
/**
* Disconnects the given bank account.
* @param {number} bankAccountId - Bank account identifier.

View File

@@ -0,0 +1,61 @@
import { Inject, Injectable } from '@nestjs/common';
import { ACCOUNT_TYPE } from '@/constants/accounts';
import { Account } from '@/modules/Accounts/models/Account.model';
import { CashflowAccountTransformer } from '@/modules/BankingTransactions/queries/BankAccountTransformer';
import { TenantModelProxy } from '@/modules/System/models/TenantBaseModel';
import { ICashflowAccountsFilter } from '../types/BankAccounts.types';
import { TransformerInjectable } from '@/modules/Transformer/TransformerInjectable.service';
import { DynamicListService } from '@/modules/DynamicListing/DynamicList.service';
@Injectable()
export class GetBankAccountsService {
constructor(
private readonly dynamicListService: DynamicListService,
private readonly transformer: TransformerInjectable,
@Inject(Account.name)
private readonly accountModel: TenantModelProxy<typeof Account>,
) {}
/**
* Retrieve the cash flow accounts.
* @param {ICashflowAccountsFilter} filterDTO - Filter DTO.
* @returns {ICashflowAccount[]}
*/
public async getCashflowAccounts(filterDTO: ICashflowAccountsFilter) {
const _filterDto = {
sortOrder: 'desc',
columnSortBy: 'created_at',
inactiveMode: false,
...filterDTO,
};
// Parsees accounts list filter DTO.
const filter = this.dynamicListService.parseStringifiedFilter(_filterDto);
// Dynamic list service.
const dynamicList = await this.dynamicListService.dynamicList(
this.accountModel(),
filter,
);
// Retrieve accounts model based on the given query.
const accounts = await this.accountModel()
.query()
.onBuild((builder) => {
dynamicList.buildQuery()(builder);
builder.whereIn('account_type', [
ACCOUNT_TYPE.BANK,
ACCOUNT_TYPE.CASH,
ACCOUNT_TYPE.CREDIT_CARD,
]);
builder.modify('inactiveMode', filter.inactiveMode);
});
// Retrieves the transformed accounts.
const transformed = await this.transformer.transform(
accounts,
new CashflowAccountTransformer(),
);
return transformed;
}
}

View File

@@ -1,3 +1,4 @@
import { IDynamicListFilter } from '@/modules/DynamicListing/DynamicFilter/DynamicFilter.types';
import { Knex } from 'knex';
export interface IBankAccountDisconnectingEventPayload {
@@ -15,3 +16,11 @@ export const ERRORS = {
BANK_ACCOUNT_FEEDS_ALREADY_PAUSED: 'BANK_ACCOUNT_FEEDS_ALREADY_PAUSED',
BANK_ACCOUNT_FEEDS_ALREADY_RESUMED: 'BANK_ACCOUNT_FEEDS_ALREADY_RESUMED',
};
export interface ICashflowAccountsFilter extends IDynamicListFilter{
page: number;
pageSize: number;
inactiveMode: boolean;
viewSlug?: string;
}