chore: add new route for get single transaction for user

This commit is contained in:
mahyargdz
2025-03-03 15:28:57 +03:30
parent 1b722d0e79
commit e234f98998
8 changed files with 71 additions and 19 deletions
@@ -5,6 +5,8 @@ import { Column, Entity, ManyToOne } from "typeorm";
import { Wallet } from "./wallet.entity";
import { BaseEntity } from "../../../common/entities/base.entity";
import { DecimalTransformer } from "../../../common/transformers/decimal.transformer";
import { DepositRequest } from "../../payments/entities/deposit-request.entity";
import { Payment } from "../../payments/entities/payment.entity";
import { TransactionType } from "../enums/transaction-type.enum";
@Entity()
@@ -23,4 +25,10 @@ export class WalletTransaction extends BaseEntity {
@Column({ type: "text", nullable: false })
description: string;
@ManyToOne(() => Payment, (payment) => payment.transactions, { onDelete: "CASCADE", nullable: true })
payment: Payment | null;
@ManyToOne(() => DepositRequest, (depositRequest) => depositRequest.transactions, { onDelete: "CASCADE", nullable: true })
depositRequest: DepositRequest | null;
}
@@ -7,6 +7,8 @@ import { PaginationDto } from "../../../common/DTO/pagination.dto";
import { WalletMessage } from "../../../common/enums/message.enum";
import { decimal } from "../../../common/transformers/decimal.transformer";
import { SearchTransactionQueryDto } from "../../payments/DTO/search-transaction-query.dto";
import { DepositRequest } from "../../payments/entities/deposit-request.entity";
import { Payment } from "../../payments/entities/payment.entity";
import { PaginationUtils } from "../../utils/providers/pagination.utils";
import { WalletTransaction } from "../entities/transaction.entity";
import { Wallet } from "../entities/wallet.entity";
@@ -39,7 +41,7 @@ export class WalletsService {
return wallet;
}
//*********************************** */
async createPaymentTransaction(userId: string, amount: Decimal, queryRunner: QueryRunner) {
async createPaymentTransaction(userId: string, amount: Decimal, payment: Payment, queryRunner: QueryRunner) {
const wallet = await queryRunner.manager.findOne(Wallet, { where: { user: { id: userId } }, lock: { mode: "pessimistic_write" } });
if (!wallet) throw new BadRequestException(WalletMessage.WALLET_NOT_FOUND);
@@ -48,6 +50,7 @@ export class WalletsService {
wallet: { id: wallet.id },
type: TransactionType.DEPOSIT,
description: WalletMessage.DEPOSIT_WALLET_IPG,
payment,
});
wallet.balance = new Decimal(wallet.balance).add(transaction.amount);
@@ -59,7 +62,7 @@ export class WalletsService {
}
//*********************************** */
async createDepositTransaction(amount: Decimal, userId: string, queryRunner: QueryRunner) {
async createDepositTransaction(userId: string, amount: Decimal, depositRequest: DepositRequest, queryRunner: QueryRunner) {
const wallet = await queryRunner.manager.findOne(Wallet, { where: { user: { id: userId } }, lock: { mode: "pessimistic_write" } });
if (!wallet) throw new BadRequestException(WalletMessage.WALLET_NOT_FOUND);
@@ -68,6 +71,7 @@ export class WalletsService {
wallet: { id: wallet.id },
type: TransactionType.DEPOSIT,
description: WalletMessage.DEPOSIT_WALLET_TRANSFER,
depositRequest,
});
wallet.balance = new Decimal(wallet.balance).add(transaction.amount);
@@ -149,13 +153,29 @@ export class WalletsService {
count,
totalDeposits: decimal(totals.totalDeposits) || 0,
totalWithdrawals: decimal(totals.totalWithdrawals) || 0,
//TODO:fix this
balancePercentChange: 5,
totalDepositsPercentChange: 4,
totalWithdrawalsPercentChange: 10,
paginate: true,
};
}
//*********************************** */
async getTransactionById(transactionId: string, userId: string) {
const transaction = await this.walletsTransactionRepo
.createQueryBuilder("transaction")
.leftJoinAndSelect("transaction.wallet", "wallet")
.leftJoin("wallet.user", "user")
.addSelect(["user.id", "user.firstName", "user.lastName"])
.leftJoinAndSelect("transaction.payment", "payment", "payment.id IS NOT NULL")
.leftJoinAndSelect("payment.paymentGateway", "paymentGateway", "payment.id IS NOT NULL")
.leftJoinAndSelect("transaction.depositRequest", "depositRequest", "depositRequest.id IS NOT NULL")
.leftJoinAndSelect("depositRequest.bankAccount", "bankAccount", "depositRequest.id IS NOT NULL")
.where("transaction.id = :transactionId", { transactionId })
.andWhere("wallet.userId = :userId", { userId })
.getOne();
if (!transaction) throw new BadRequestException(WalletMessage.TRANSACTION_NOT_FOUND);
return { transaction };
}
//*********************************** */
+9 -1
View File
@@ -1,4 +1,4 @@
import { Controller, Get, Query } from "@nestjs/common";
import { Controller, Get, Param, Query } from "@nestjs/common";
import { ApiOperation, ApiTags } from "@nestjs/swagger";
import { WalletsService } from "./providers/wallets.service";
@@ -6,6 +6,7 @@ import { AuthGuards } from "../../common/decorators/auth-guard.decorator";
import { Pagination } from "../../common/decorators/pagination.decorator";
import { UserDec } from "../../common/decorators/user.decorator";
import { PaginationDto } from "../../common/DTO/pagination.dto";
import { ParamDto } from "../../common/DTO/param.dto";
@Controller("wallets")
@ApiTags("wallets")
@@ -26,4 +27,11 @@ export class WalletsController {
getTransactions(@UserDec("id") userId: string, @Query() paginationDto: PaginationDto) {
return this.walletsService.getTransaction(userId, paginationDto);
}
@ApiOperation({ summary: "get transaction by id" })
@AuthGuards()
@Get("transactions/:id")
getTransactionById(@Param() paramDto: ParamDto, @UserDec("id") userId: string) {
return this.walletsService.getTransactionById(paramDto.id, userId);
}
}