From 39d02b285bb97343ddbd4144152ac509892ae7d1 Mon Sep 17 00:00:00 2001 From: sooieese Date: Thu, 7 Nov 2024 17:39:53 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=B6=80=EC=8A=A4=EC=A6=90=EA=B2=A8?= =?UTF-8?q?=EC=B0=BE=EA=B8=B0=20=ED=82=A4=EC=9B=8C=EB=93=9C=EA=B0=9C?= =?UTF-8?q?=EC=88=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/swagger.yaml | 10 ++++++--- controllers/boothLikeController.js | 35 ++++++++++++++++++++++-------- docs/booth-like.yaml | 12 ++++++---- 3 files changed, 41 insertions(+), 16 deletions(-) diff --git a/build/swagger.yaml b/build/swagger.yaml index 1c9f6f5..89ef5de 100644 --- a/build/swagger.yaml +++ b/build/swagger.yaml @@ -238,7 +238,7 @@ paths: tags: - User summary: 유저가 즐겨찾기한 포토부스 조회 - description: '특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, 유저가 좋아요한 여부를 반환합니다.' + description: '특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, count가 1 이상인 키워드의 개수, 유저가 좋아요한 여부를 반환합니다.' parameters: - in: path name: user_id @@ -273,11 +273,15 @@ paths: type: string description: 포토부스에서 가장 많이 사용된 키워드 example: 인생네컷 - is_liked_by_user: + keyword_count: + type: integer + description: count가 1 이상인 키워드의 개수 + example: 5 + user_like: type: boolean description: 유저가 해당 포토부스를 좋아요했는지 여부 example: true - recent_photo: + photobooth_image: type: object nullable: true description: 포토부스에 대한 가장 최근 리뷰 사진 diff --git a/controllers/boothLikeController.js b/controllers/boothLikeController.js index cc57662..4317840 100644 --- a/controllers/boothLikeController.js +++ b/controllers/boothLikeController.js @@ -2,6 +2,7 @@ const User = require('../models/user'); const Photobooth = require('../models/photobooth'); const Photo = require('../models/photo'); const {Keyword, Keyword_list} = require('../models/keyword'); +const {Sequelize, Op, fn, col} = require('sequelize'); // 부스 즐겨찾기 추가 const addBoothLike = async (req, res) => { @@ -85,12 +86,17 @@ const readBoothLike = async (req, res) => { return acc; }, {}); - // 각 부스에 대한 최다 키워드 가져오기 + // 각 부스에 대한 최다 키워드 가져오기 및 count가 1 이상인 키워드 개수 계산 const topKeywords = await Keyword.findAll({ where: { photobooth_id: likedBoothIds }, - attributes: ['photobooth_id', 'keyword_id', 'count'], + attributes: [ + 'photobooth_id', + 'keyword_id', + 'count', + [Sequelize.fn('COUNT', Sequelize.col('keyword_id')), 'keyword_count'] + ], include: [ { model: Keyword_list, @@ -98,28 +104,38 @@ const readBoothLike = async (req, res) => { attributes: ['keyword'] } ], + where: { + count: { [Op.gte]: 1 } // count가 1 이상인 것만 가져오기 + }, order: [[ 'count', 'DESC' ]], - group: ['photobooth_id'] + group: ['photobooth_id', 'keyword_id'] }); - // 부스 ID별로 가장 많이 사용된 키워드 매핑 - const topKeywordMap = topKeywords.reduce((acc, keyword) => { - acc[keyword.photobooth_id] = keyword.keyword.keyword; // 키워드 이름만 저장 + // 부스 ID별로 가장 많이 사용된 키워드 및 count가 1 이상인 키워드 개수 매핑 + const keywordDataMap = topKeywords.reduce((acc, keyword) => { + if (!acc[keyword.photobooth_id]) { + acc[keyword.photobooth_id] = { + top_keyword: keyword.keyword.keyword, + keyword_count: 0 + }; + } + acc[keyword.photobooth_id].keyword_count += 1; return acc; }, {}); + // 응답 데이터 가공 const response = user.likedBooths.map(booth => { const recentPhoto = recentPhotoMap[booth.id]; - const topKeyword = topKeywordMap[booth.id] || null; + const keywordData = keywordDataMap[booth.id] || { top_keyword: null, keyword_count: 0 }; return { photobooth_id: booth.id, photobooth_name: booth.name, rating: booth.rating, - top_keyword: topKeyword, + top_keyword: keywordData.top_keyword, + keyword_count: keywordData.keyword_count, user_like: true, photobooth_image: recentPhoto ? { - date: recentPhoto.date, image_url: recentPhoto.image_url } : null }; @@ -134,4 +150,5 @@ const readBoothLike = async (req, res) => { + module.exports = { addBoothLike, deleteBoothLike, readBoothLike }; diff --git a/docs/booth-like.yaml b/docs/booth-like.yaml index c1980a6..b7c4b4e 100644 --- a/docs/booth-like.yaml +++ b/docs/booth-like.yaml @@ -2,7 +2,7 @@ get: tags: - User summary: "유저가 즐겨찾기한 포토부스 조회" - description: "특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, 유저가 좋아요한 여부를 반환합니다." + description: "특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, count가 1 이상인 키워드의 개수, 유저가 좋아요한 여부를 반환합니다." parameters: - in: path name: user_id @@ -37,11 +37,15 @@ get: type: string description: "포토부스에서 가장 많이 사용된 키워드" example: "인생네컷" - is_liked_by_user: + keyword_count: + type: integer + description: "count가 1 이상인 키워드의 개수" + example: 5 + user_like: type: boolean description: "유저가 해당 포토부스를 좋아요했는지 여부" example: true - recent_photo: + photobooth_image: type: object nullable: true description: "포토부스에 대한 가장 최근 리뷰 사진" @@ -77,4 +81,4 @@ get: example: "즐겨찾는 부스 조회 실패" error: type: object - description: "오류 상세 정보" \ No newline at end of file + description: "오류 상세 정보"