Skip to content

Commit

Permalink
fix: 부스즐겨찾기 키워드개수
Browse files Browse the repository at this point in the history
  • Loading branch information
sooieese00 committed Nov 7, 2024
1 parent 5260bf6 commit 39d02b2
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 16 deletions.
10 changes: 7 additions & 3 deletions build/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ paths:
tags:
- User
summary: 유저가 즐겨찾기한 포토부스 조회
description: '특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, 유저가 좋아요한 여부를 반환합니다.'
description: '특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, count가 1 이상인 키워드의 개수, 유저가 좋아요한 여부를 반환합니다.'
parameters:
- in: path
name: user_id
Expand Down Expand Up @@ -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: 포토부스에 대한 가장 최근 리뷰 사진
Expand Down
35 changes: 26 additions & 9 deletions controllers/boothLikeController.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) => {
Expand Down Expand Up @@ -85,41 +86,56 @@ 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,
as: 'keyword',
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
};
Expand All @@ -134,4 +150,5 @@ const readBoothLike = async (req, res) => {




module.exports = { addBoothLike, deleteBoothLike, readBoothLike };
12 changes: 8 additions & 4 deletions docs/booth-like.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ get:
tags:
- User
summary: "유저가 즐겨찾기한 포토부스 조회"
description: "특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, 유저가 좋아요한 여부를 반환합니다."
description: "특정 유저가 즐겨찾기한 포토부스를 조회합니다. 각 포토부스에 대한 가장 최근 리뷰 사진, 부스 이름, 부스 평점, 가장 많이 사용된 키워드, count가 1 이상인 키워드의 개수, 유저가 좋아요한 여부를 반환합니다."
parameters:
- in: path
name: user_id
Expand Down Expand Up @@ -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: "포토부스에 대한 가장 최근 리뷰 사진"
Expand Down Expand Up @@ -77,4 +81,4 @@ get:
example: "즐겨찾는 부스 조회 실패"
error:
type: object
description: "오류 상세 정보"
description: "오류 상세 정보"

0 comments on commit 39d02b2

Please sign in to comment.