diff --git a/src/features/funding/funding.service.ts b/src/features/funding/funding.service.ts index 9e29043d..6f34127d 100644 --- a/src/features/funding/funding.service.ts +++ b/src/features/funding/funding.service.ts @@ -95,19 +95,19 @@ export class FundingService { .createQueryBuilder('friend') .where( '((friend.userId = :userId AND friend.friendId = :friendId) OR (friend.userId = :friendId AND friend.friendId = :userId))', - { userId: user.userId, friendId: userId }) + { userId: user.userId, friendId: userId }, + ) .andWhere('friend.status = :status', { status: FriendStatus.Friend }) .getOne(); if (!friendship) { - queryBuilder.andWhere( - 'funding.fundPubl = :publ', - { publ: true } - ) + queryBuilder.andWhere('funding.fundPubl = :publ', { publ: true }); } } } else { - queryBuilder.where('funding.fundUser != :userId', { userId: user.userId }); + queryBuilder.where('funding.fundUser != :userId', { + userId: user.userId, + }); const friendIds = await this.friendRepository .createQueryBuilder('friend') @@ -132,10 +132,10 @@ export class FundingService { if (friendIdsArray.length > 0) { // 친구 목록이 있는 경우 if (fundPublFilter === 'all') { - queryBuilder.andWhere( - 'funding.fundPubl = :publ', - { publ: true, ids: friendIdsArray }, - ); + queryBuilder.andWhere('funding.fundPubl = :publ', { + publ: true, + ids: friendIdsArray, + }); } else if (fundPublFilter === 'friends') { queryBuilder.andWhere('funding.fundUser IN (:...ids)', { ids: friendIdsArray, @@ -224,21 +224,33 @@ export class FundingService { queryBuilder.take(limit); - queryBuilder.leftJoinAndSelect('funding.fundUser', 'user'); - // .leftJoinAndSelect('user.image', 'img'); + queryBuilder.leftJoinAndSelect('funding.fundUser', 'u'); + + // 현재 Nested Entity에는 ImageInstanceManager#mapImage를 사용할 수 없다. + queryBuilder.leftJoinAndMapOne( + 'u.image', + 'image', + 'ui', + ` + (u.defaultImgId IS NOT NULL AND ui.imgId = u.defaultImgId) OR + (u.defaultImgId IS NULL AND ui.subId = u.userId AND ui.imgType = :imgType) + `, + { imgType: ImageType.User }, + ); const fundingPromies: Promise[] = await queryBuilder .getMany() .then((fundings: Funding[]) => fundings.map(async (funding) => { - const fundUserImgUrl = await this.imageManager - .getImages(funding.fundUser) - .then((images) => images[0].imgUrl); - const { gifts, giftImgUrls } = await this.giftService.findAllGift(funding); - return new FundingDto(funding, fundUserImgUrl, gifts, giftImgUrls); + return new FundingDto( + funding, + funding.fundUser.image.imgUrl, + gifts, + giftImgUrls, + ); }), ); @@ -288,7 +300,7 @@ export class FundingService { user: User, ): Promise { // TODO - accessToken -> User 객체로 변환하기 - let funding = new Funding( + const funding = new Funding( user, createFundingDto.fundTitle, createFundingDto.fundCont, @@ -306,7 +318,7 @@ export class FundingService { const funding_save = await this.fundingRepository.save(funding); - let fundImg: string[] = []; + const fundImg: string[] = []; if (createFundingDto.fundImg) { // subId = fundId, imgType = "Funding" Image 객체를 만든다. const fundImgUrls = [createFundingDto.fundImg]; // TODO - CreateFundingDto.fundImg -> fundImgUrls 로 변경하기 @@ -344,7 +356,10 @@ export class FundingService { updateFundingDto: UpdateFundingDto, user: User, ): Promise { - const funding = await this.findFundingByUuidAndUserId(fundUuid, user.userId); + const funding = await this.findFundingByUuidAndUserId( + fundUuid, + user.userId, + ); const fundId = funding.fundId; // endAt이 앞당겨지면 안된다. @@ -356,7 +371,12 @@ export class FundingService { } // 이미지 업데이트 - const fundingImg = await this.updateFundingImage(funding, updateFundingDto.fundImg, fundId, user); + const fundingImg = await this.updateFundingImage( + funding, + updateFundingDto.fundImg, + fundId, + user, + ); // Funding 업데이트 await this.fundingRepository.update( diff --git a/src/features/gift/gift.service.ts b/src/features/gift/gift.service.ts index baa6543e..7866f3cb 100644 --- a/src/features/gift/gift.service.ts +++ b/src/features/gift/gift.service.ts @@ -34,25 +34,23 @@ export class GiftService { giftImgUrls: string[]; count: number; }> { - const [gifts, count] = await this.giftRepository.findAndCount({ - where: { funding: { fundId: fund.fundId } }, - relations: ['funding'], - order: { giftOrd: 'ASC' }, - }); - - const giftImgUrls: string[] = []; + const qb = this.giftRepository + .createQueryBuilder('g') + .leftJoinAndSelect('g.funding', 'f', 'g.fundId = :fundId') + .where('g.fundId = :fundId', { + fundId: fund.fundId, + }) + .orderBy('g.giftOrd', 'ASC'); + this.imageManager.mapImage(qb); + const [gifts, count] = await qb.getManyAndCount(); // Gift 배열을 ResponseGiftDto 배열로 변환 const responseGifts = await Promise.all( - gifts.map(async (gift) => { - const { imgUrl, isDef } = await this.getGiftImageUrl(gift); - if (imgUrl && !isDef) { - giftImgUrls.push(imgUrl); - } - return new ResponseGiftDto(gift, imgUrl || ''); - }), + gifts.map((gift) => new ResponseGiftDto(gift, gift.image.imgUrl)), ); + const giftImgUrls: string[] = gifts.map((g) => g.image.imgUrl); + return { gifts: responseGifts, giftImgUrls, count }; }