From 36c01fe01c8532328d0f6e6629f4dcfc3ccbecf2 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Wed, 15 Apr 2026 16:24:03 +0330 Subject: [PATCH] add : referral codes list --- .../referrals/providers/referrals.service.ts | 11 +++++++-- .../repositories/referral-codes.repository.ts | 15 ++++++++++++ src/modules/reseller/reseller.controller.ts | 13 +++++++++- src/modules/reseller/reseller.service.ts | 24 +++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/modules/referrals/providers/referrals.service.ts b/src/modules/referrals/providers/referrals.service.ts index 537d2f8..93ff2e9 100755 --- a/src/modules/referrals/providers/referrals.service.ts +++ b/src/modules/referrals/providers/referrals.service.ts @@ -13,6 +13,7 @@ import { ReferralRewardsRepository } from "../repositories/referral-rewards.repo import { ReferralsRepository } from "../repositories/referrals.repository"; import { SearchCustomersDto } from "../../users/DTO/search-customers.dto"; import { SearchWithdrawRequestQueryDto } from "../../reseller/dto/search-withdraw-requests.dto"; +import { PaginationDto } from "../../../common/DTO/pagination.dto"; @Injectable() export class ReferralsService { private MAX_ATTEMPTS = 10; @@ -152,8 +153,14 @@ export class ReferralsService { async findRewards(userIds: string[], query: SearchWithdrawRequestQueryDto) { - const [data, count] = await this.referralRewardsRepository.findPaginatedList(userIds, query); + const [rewards, count] = await this.referralRewardsRepository.findPaginatedList(userIds, query); - return { data, count, paginate: true }; + return { rewards, count, paginate: true }; + } + + async getReferralCodesByUserIds(userIds: string[], query: PaginationDto) { + const [codes, count] = await this.referralCodesRepository.findPaginatedList(userIds, query); + + return { codes, count, paginate: true }; } } diff --git a/src/modules/referrals/repositories/referral-codes.repository.ts b/src/modules/referrals/repositories/referral-codes.repository.ts index 7847a77..63c7791 100755 --- a/src/modules/referrals/repositories/referral-codes.repository.ts +++ b/src/modules/referrals/repositories/referral-codes.repository.ts @@ -3,10 +3,25 @@ import { InjectRepository } from "@nestjs/typeorm"; import { Repository } from "typeorm"; import { ReferralCode } from "../entities/referral-code.entity"; +import { PaginationDto } from "../../../common/DTO/pagination.dto"; +import { PaginationUtils } from "../../utils/providers/pagination.utils"; @Injectable() export class ReferralCodesRepository extends Repository { constructor(@InjectRepository(ReferralCode) repository: Repository) { super(repository.target, repository.manager, repository.queryRunner); } + + async findPaginatedList(userIds: string[], queryDto: PaginationDto) { + const { limit, skip } = PaginationUtils(queryDto); + console.log(userIds) + const qb = this.createQueryBuilder("rr") + .where("rr.userId IN (:...userIds)", { userIds }) + .leftJoinAndSelect("rr.user", "user") + .orderBy("rr.createdAt", "DESC") + .skip(skip) + .take(limit); + + return qb.getManyAndCount(); + } } diff --git a/src/modules/reseller/reseller.controller.ts b/src/modules/reseller/reseller.controller.ts index 050c6fc..26658fd 100644 --- a/src/modules/reseller/reseller.controller.ts +++ b/src/modules/reseller/reseller.controller.ts @@ -159,7 +159,6 @@ export class ResellerController { return this.resellerService.createUserBankAccount(userId, dto) } - // ============ Get Bank Account ============= @ApiOperation({ summary: "Get Bank Account ==> reseller route" }) @ResellerRoute([ResellerType.agent, ResellerType.reseller]) @@ -176,4 +175,16 @@ export class ResellerController { return this.resellerService.deleteUserBankAccount(userId, id) } + // ============ Get Referral Codes ============= + @ApiOperation({ summary: "Get Referral codes List ==> reseller route" }) + @ResellerRoute([ResellerType.agent, ResellerType.reseller]) + @Get('referral-codes') + getReferalCodesList( + @UserDec("id") userId: string, + @UserDec("resellerType") type: ResellerType, + @Query() query: PaginationDto + ) { + return this.resellerService.getReferralCodes(userId, type, query) + } + } diff --git a/src/modules/reseller/reseller.service.ts b/src/modules/reseller/reseller.service.ts index 760cd09..ab1cd8d 100644 --- a/src/modules/reseller/reseller.service.ts +++ b/src/modules/reseller/reseller.service.ts @@ -12,6 +12,7 @@ import { SearchResellerInvoicesQueryDto } from './dto/search-reseller-invoices.d import { CreateUserBankAccountDto } from './dto/create-user-bank-account.dto'; import { UserBankAccountRepository } from './repositories/user-bank-account.repository'; import { ResellerType } from '../auth/DTO/verify-reseller-otp.dto'; +import { PaginationDto } from '../../common/DTO/pagination.dto'; @Injectable() export class ResellerService { @@ -148,6 +149,7 @@ export class ResellerService { return this.findResellerAgentsRewards(userId, query) } } + async findResellerAgentsRewards(userId: string, query: SearchWithdrawRequestQueryDto) { const reselller = await this.FindOneOrFailByUserId(userId) @@ -238,4 +240,26 @@ export class ResellerService { }) } + + //*********** Referral Code ************/ + async getReferralCodes(userId: string, type: ResellerType, query: PaginationDto) { + if (type == ResellerType.agent) { + return this.findAgentReferralCodes(userId, query) + } else if (type == ResellerType.reseller) { + return this.findResellerAgentsReferralCodes(userId, query) + } + } + + private async findResellerAgentsReferralCodes(userId: string, query: SearchWithdrawRequestQueryDto) { + const reselller = await this.FindOneOrFailByUserId(userId) + + const agentIds = reselller.agents.map(ag => ag.id) + + return this.referralService.findRewards(agentIds, query) + } + + private async findAgentReferralCodes(userId: string, query: SearchWithdrawRequestQueryDto) { + return this.referralService.findRewards([userId], query) + } + }