From 233f0ac4cb9719773dc99ef4995757fdae29d9fe Mon Sep 17 00:00:00 2001 From: Dustin Do Date: Sun, 9 Jun 2024 01:48:01 +0700 Subject: [PATCH] feat(api): [Transaction] add delete transaction api --- apps/api/v1/routes/transactions.ts | 21 +++++++++++++++++++- apps/api/v1/services/transaction.service.ts | 22 +++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/apps/api/v1/routes/transactions.ts b/apps/api/v1/routes/transactions.ts index 88b349e1..8a1956ac 100644 --- a/apps/api/v1/routes/transactions.ts +++ b/apps/api/v1/routes/transactions.ts @@ -5,9 +5,11 @@ import { getAuthUserStrict } from '../middlewares/auth' import { canUserReadBudget, findBudget } from '../services/budget.service' import { canUserCreateTransaction, + canUserDeleteTransaction, canUserReadTransaction, canUserUpdateTransaction, createTransaction, + deleteTransaction, findTransaction, updateTransaction, } from '../services/transaction.service' @@ -130,7 +132,24 @@ router.delete( }), ), async (c) => { - return c.json({ message: 'not implemented' }) + const { transactionId } = c.req.valid('param') + const user = getAuthUserStrict(c) + + const transaction = await findTransaction({ transactionId }) + + if ( + !(transaction && (await canUserReadTransaction({ user, transaction }))) + ) { + return c.json({ message: 'transaction not found' }, 404) + } + + if (!(await canUserDeleteTransaction({ user, transaction }))) { + return c.json({ message: 'user cannot delete transaction' }, 403) + } + + await deleteTransaction({ transactionId }) + + return c.json(transaction) }, ) diff --git a/apps/api/v1/services/transaction.service.ts b/apps/api/v1/services/transaction.service.ts index 8ffa22c0..1d3b4019 100644 --- a/apps/api/v1/services/transaction.service.ts +++ b/apps/api/v1/services/transaction.service.ts @@ -86,6 +86,16 @@ export async function canUserUpdateTransaction({ return false } +export async function canUserDeleteTransaction({ + user, + transaction, +}: { + user: User + transaction: Transaction +}) { + return canUserUpdateTransaction({ user, transaction, walletAccount: null }) +} + export async function findTransaction({ transactionId, }: { @@ -131,3 +141,15 @@ export async function updateTransaction({ return transaction } + +export async function deleteTransaction({ + transactionId, +}: { + transactionId: string +}) { + await prisma.transaction.delete({ + where: { + id: transactionId, + }, + }) +}