diff --git a/backend/services/issuer-service/src/infrastructure/persistence/coupon.repository.ts b/backend/services/issuer-service/src/infrastructure/persistence/coupon.repository.ts index fc500dd..8b537dd 100644 --- a/backend/services/issuer-service/src/infrastructure/persistence/coupon.repository.ts +++ b/backend/services/issuer-service/src/infrastructure/persistence/coupon.repository.ts @@ -1,6 +1,6 @@ import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { Repository, DataSource } from 'typeorm'; +import { Repository, DataSource, In } from 'typeorm'; import { Coupon, CouponStatus } from '../../domain/entities/coupon.entity'; import { Issuer } from '../../domain/entities/issuer.entity'; import { @@ -61,8 +61,6 @@ export class CouponRepository implements ICouponRepository { const { category, status, search, issuerId, page, limit } = filters; const qb = this.repo.createQueryBuilder('c'); - qb.leftJoinAndMapOne('c.issuer', Issuer, 'i', 'i.id = c.issuer_id'); - if (status) qb.andWhere('c.status = :status', { status }); if (issuerId) qb.andWhere('c.issuer_id = :issuerId', { issuerId }); if (category) qb.andWhere('c.category = :category', { category }); @@ -76,23 +74,33 @@ export class CouponRepository implements ICouponRepository { .skip((page - 1) * limit) .take(limit); - return qb.getManyAndCount(); + const [coupons, total] = await qb.getManyAndCount(); + await this._attachIssuers(coupons); + return [coupons, total]; } async findByOwnerWithIssuerJoin(userId: string, filters: CouponListFilters): Promise<[Coupon[], number]> { const { status, page, limit } = filters; const qb = this.repo.createQueryBuilder('c'); - qb.leftJoinAndMapOne('c.issuer', Issuer, 'i', 'i.id = c.issuer_id'); qb.andWhere('c.owner_user_id = :userId', { userId }); - if (status) qb.andWhere('c.status = :status', { status }); qb.orderBy('c.created_at', 'DESC') .skip((page - 1) * limit) .take(limit); - return qb.getManyAndCount(); + const [coupons, total] = await qb.getManyAndCount(); + await this._attachIssuers(coupons); + return [coupons, total]; + } + + private async _attachIssuers(coupons: Coupon[]): Promise { + if (coupons.length === 0) return; + const issuerIds = [...new Set(coupons.map((c) => c.issuerId))]; + const issuers = await this.dataSource.getRepository(Issuer).findBy({ id: In(issuerIds) }); + const issuerMap = new Map(issuers.map((i) => [i.id, i])); + coupons.forEach((c) => { c.issuer = issuerMap.get(c.issuerId); }); } async getOwnerSummary(userId: string): Promise { diff --git a/backend/services/user-service/src/domain/entities/wallet.entity.ts b/backend/services/user-service/src/domain/entities/wallet.entity.ts index 2260cef..829d340 100644 --- a/backend/services/user-service/src/domain/entities/wallet.entity.ts +++ b/backend/services/user-service/src/domain/entities/wallet.entity.ts @@ -9,7 +9,7 @@ export class Wallet { @PrimaryGeneratedColumn('uuid') id: string; @Column({ name: 'user_id', type: 'uuid', unique: true }) userId: string; @Column({ type: 'numeric', precision: 20, scale: 8, default: '0' }) balance: string; - @Column({ name: 'frozen_balance', type: 'numeric', precision: 20, scale: 8, default: '0' }) frozenBalance: string; + @Column({ name: 'frozen', type: 'numeric', precision: 20, scale: 8, default: '0' }) frozenBalance: string; @Column({ type: 'varchar', length: 10, default: 'USD' }) currency: string; @Column({ type: 'varchar', length: 20, default: 'active' }) status: string; @CreateDateColumn({ name: 'created_at', type: 'timestamptz' }) createdAt: Date;