diff --git a/packages/server/src/api/controllers/Banking/BankingController.ts b/packages/server/src/api/controllers/Banking/BankingController.ts index 679073661..ffb42b89a 100644 --- a/packages/server/src/api/controllers/Banking/BankingController.ts +++ b/packages/server/src/api/controllers/Banking/BankingController.ts @@ -4,13 +4,14 @@ import BaseController from '@/api/controllers/BaseController'; import { PlaidBankingController } from './PlaidBankingController'; import { BankingRulesController } from './BankingRulesController'; import { BankTransactionsMatchingController } from './BankTransactionsMatchingController'; +import { RecognizedTransactionsController } from './RecognizedTransactionsController'; @Service() export class BankingController extends BaseController { /** * Router constructor. */ - router() { + public router() { const router = Router(); router.use('/plaid', Container.get(PlaidBankingController).router()); @@ -19,6 +20,10 @@ export class BankingController extends BaseController { '/matches', Container.get(BankTransactionsMatchingController).router() ); + router.use( + '/recognized', + Container.get(RecognizedTransactionsController).router() + ); return router; } diff --git a/packages/server/src/api/controllers/Banking/RecognizedTransactionsController.ts b/packages/server/src/api/controllers/Banking/RecognizedTransactionsController.ts new file mode 100644 index 000000000..4ed3ee15d --- /dev/null +++ b/packages/server/src/api/controllers/Banking/RecognizedTransactionsController.ts @@ -0,0 +1,50 @@ +import { Inject, Service } from 'typedi'; +import { NextFunction, Request, Response, Router } from 'express'; +import BaseController from '@/api/controllers/BaseController'; +import { CashflowApplication } from '@/services/Cashflow/CashflowApplication'; + +@Service() +export class RecognizedTransactionsController extends BaseController { + @Inject() + private cashflowApplication: CashflowApplication; + + /** + * Router constructor. + */ + router() { + const router = Router(); + + router.get( + '/accounts/:accountId', + this.getRecognizedTransactions.bind(this) + ); + + return router; + } + k; + /** + * Retrieves the recognized bank transactions. + * @param {Request} req + * @param {Response} res + * @param {NextFunction} next + * @returns {Promise} + */ + async getRecognizedTransactions( + req: Request<{ accountId: number }>, + res: Response, + next: NextFunction + ) { + const { accountId } = req.params; + const { tenantId } = req; + + try { + const data = await this.cashflowApplication.getRecognizedTransactions( + tenantId, + accountId + ); + return res.status(200).send({ data }); + } catch (error) { + next(error); + } + } +} diff --git a/packages/server/src/models/RecognizedBankTransaction.ts b/packages/server/src/models/RecognizedBankTransaction.ts index 4ddf47c06..f5f65bb5b 100644 --- a/packages/server/src/models/RecognizedBankTransaction.ts +++ b/packages/server/src/models/RecognizedBankTransaction.ts @@ -1,4 +1,5 @@ import TenantModel from 'models/TenantModel'; +import { Model } from 'objection'; export class RecognizedBankTransaction extends TenantModel { /** @@ -21,4 +22,38 @@ export class RecognizedBankTransaction extends TenantModel { static get virtualAttributes() { return []; } + + /** + * Relationship mapping. + */ + static get relationMappings() { + const UncategorizedCashflowTransaction = require('./UncategorizedCashflowTransaction'); + const Account = require('./Account'); + + return { + /** + * Recognized bank transaction may belongs to uncategorized transactions. + */ + uncategorizedTransactions: { + relation: Model.HasManyRelation, + modelClass: UncategorizedCashflowTransaction.default, + join: { + from: 'recognized_bank_transactions.uncategorizedTransactionId', + to: 'uncategorized_cashflow_transactions.id', + }, + }, + + /** + * Recognized bank transaction may belongs to assign account. + */ + assignAccount: { + relation: Model.BelongsToOneRelation, + modelClass: Account.default, + join: { + from: 'recognized_bank_transactions.assignedAccountId', + to: 'accounts.id', + }, + }, + }; + } }