From b6670425874b801099b47ecd600976f0d8275863 Mon Sep 17 00:00:00 2001 From: Sven Mokveld Date: Wed, 18 Dec 2024 15:52:55 +0100 Subject: [PATCH] feat: exclude-own-transactions --- src/controller/transaction-controller.ts | 1 + src/service/transaction-service.ts | 3 ++ .../unit/controller/transaction-controller.ts | 31 ++++++++++++++++++- test/unit/service/transaction-service.ts | 9 ++++++ 4 files changed, 43 insertions(+), 1 deletion(-) diff --git a/src/controller/transaction-controller.ts b/src/controller/transaction-controller.ts index c2e26840e..fc4ec7da7 100644 --- a/src/controller/transaction-controller.ts +++ b/src/controller/transaction-controller.ts @@ -103,6 +103,7 @@ export default class TransactionController extends BaseController { * @param {integer} createdById.query - User that created selected transaction * @param {integer} toId.query - To-user for selected transactions * transactions. Requires ContainerId + * @param {integer} excludeById.query - Your own ID to not include in transactions * @param {integer} pointOfSaleId.query - Point of sale ID for selected transactions * @param {integer} productId.query - Product ID for selected transactions * @param {integer} productRevision.query - Product Revision for selected diff --git a/src/service/transaction-service.ts b/src/service/transaction-service.ts index 84adee19f..4b31fd43f 100644 --- a/src/service/transaction-service.ts +++ b/src/service/transaction-service.ts @@ -96,6 +96,7 @@ export interface TransactionFilterParameters { fromDate?: Date, tillDate?: Date, invoiceId?: number, + excludeById?: number, } export function parseGetTransactionsFilters(req: RequestWithToken): TransactionFilterParameters { @@ -121,6 +122,7 @@ export function parseGetTransactionsFilters(req: RequestWithToken): TransactionF fromDate: asDate(req.query.fromDate), tillDate: asDate(req.query.tillDate), invoiceId: asNumber(req.query.invoiceId), + excludeById: asNumber(req.query.excludeById), }; return filters; @@ -571,6 +573,7 @@ export default class TransactionService extends WithManager { query.orderBy({ 'transaction.createdAt': 'DESC' }); + if (p.excludeById) query.andWhere('createdById != :excludeById', { excludeById: p.excludeById }); if (fromDate) query.andWhere('transaction.createdAt >= :fromDate', { fromDate: toMySQLString(fromDate) }); if (tillDate) query.andWhere('transaction.createdAt < :tillDate', { tillDate: toMySQLString(tillDate) }); diff --git a/test/unit/controller/transaction-controller.ts b/test/unit/controller/transaction-controller.ts index 1f9474e06..985638276 100644 --- a/test/unit/controller/transaction-controller.ts +++ b/test/unit/controller/transaction-controller.ts @@ -36,7 +36,7 @@ import { BaseTransactionResponse } from '../../../src/controller/response/transa import { verifyBaseTransactionEntity } from '../validators'; import RoleManager from '../../../src/rbac/role-manager'; import { TransactionRequest } from '../../../src/controller/request/transaction-request'; -import { defaultPagination, PAGINATION_DEFAULT, PaginationResult } from '../../../src/helpers/pagination'; +import { defaultPagination, maxPagination, PAGINATION_DEFAULT, PaginationResult } from '../../../src/helpers/pagination'; import { inUserContext, UserFactory } from '../../helpers/user-factory'; import MemberAuthenticator from '../../../src/entity/authenticator/member-authenticator'; import { truncateAllTables } from '../../setup'; @@ -530,6 +530,35 @@ describe('TransactionController', (): void => { .query({ skip: 'Wie dit leest trekt een bak' }); expect(res.status).to.equal(400); }); + + it('should return all transactions except for the ones createdby a user themself', async () => { + const excludeById = 7; + const take = maxPagination(); + + const res = await request(ctx.app) + .get('/transactions') + .set('Authorization', `Bearer ${ctx.adminToken}`) + .query({ take, excludeById }); + expect(res.status).to.equal(200); + + const actualTransactions = ctx.transactions + .filter((transactions) => transactions.createdBy.id != excludeById); + + const transactions = res.body.records as BaseTransactionResponse[]; + const spec = await Swagger.importSpecification(); + expect(transactions.length).to.equal(actualTransactions.length); + transactions.forEach((transaction: BaseTransactionResponse) => { + verifyBaseTransactionEntity(spec, transaction); + }); + }); + + it('should return 400 when excludeById is not a number', async () => { + const res = await request(ctx.app) + .get('/transactions') + .set('Authorization', `Bearer ${ctx.adminToken}`) + .query({ skip: '42 is erg Vo' }); + expect(res.status).to.equal(400); + }); }); describe('GET /transactions/{id}', () => { diff --git a/test/unit/service/transaction-service.ts b/test/unit/service/transaction-service.ts index 9128dc27b..59ecc7e30 100644 --- a/test/unit/service/transaction-service.ts +++ b/test/unit/service/transaction-service.ts @@ -686,6 +686,15 @@ describe('TransactionService', (): void => { expect(records.length).to.equal(0); }); + + it('should not return transactions createdBy given user', async () => { + const transaction = ctx.transactions[0]; + + const records = (await new TransactionService().getTransactions({ excludeById: transaction.createdBy.id })).records; + records.forEach((r) => { + expect(r.createdBy).to.not.eq(transaction.createdBy.id); + }); + }); }); describe('Get all transactions involving a user', () => {