From 1e821dca5c818cc6dce7635d207c6110406b80bb Mon Sep 17 00:00:00 2001 From: seoljiwon Date: Mon, 9 Jan 2023 17:03:08 +0900 Subject: [PATCH] [REFACTOR] refactor user mypage review --- .../api/routes/user/userReviewListGET.js | 68 +++++++++---------- functions/db/review.js | 28 ++++++-- 2 files changed, 54 insertions(+), 42 deletions(-) diff --git a/functions/api/routes/user/userReviewListGET.js b/functions/api/routes/user/userReviewListGET.js index d49f4aaf..71af817e 100644 --- a/functions/api/routes/user/userReviewListGET.js +++ b/functions/api/routes/user/userReviewListGET.js @@ -1,3 +1,4 @@ +const _ = require("lodash"); const util = require("../../../lib/util"); const statusCode = require("../../../constants/statusCode"); const responseMessage = require("../../../constants/responseMessage"); @@ -18,49 +19,42 @@ module.exports = async (req, res) => { try { client = await db.connect(req); - let reviewList = await reviewDB.getReviewListByUserId(client, userId); + const [writer, relationReviewTagList] = await Promise.all([ + userDB.getUserByUserId(client, userId), + relationReviewTagDB.getRelationReviewTagList(client), + ]); - let writer = await userDB.getUserByUserId(client, userId); - - writer = { - writerId: writer.id, - nickname: writer.nickname, - }; - - reviewList = await Promise.all( - reviewList.map(async (review) => { - const tagNameList = await relationReviewTagDB.getTagNameListByReviewId(client, review.id); - - // 좋아요 정보 - const likeData = await likeDB.getLikeByTarget( - client, - review.id, - likeType.REVIEW, - req.user.id, - ); - - const isLiked = likeData ? likeData.isLiked : false; + let reviewList = await reviewDB.getReviewListByUserId( + client, + userId, + likeType.REVIEW, + req.user.id, + ); - const likeCount = await likeDB.getLikeCountByTarget(client, review.id, likeType.REVIEW); - const like = { - isLiked: isLiked, - likeCount: likeCount.likeCount, - }; + reviewList = reviewList.map((review) => { + review.tagList = _.filter(relationReviewTagList, (r) => r.reviewId === review.id).map((r) => { + return { tagName: r.tagName }; + }); - return { - id: review.id, - majorName: review.majorName, - oneLineReview: review.oneLineReview, - createdAt: review.createdAt, - tagList: tagNameList, - like: like, - }; - }), - ); + return { + id: review.id, + majorName: review.majorName, + oneLineReview: review.oneLineReview, + createdAt: review.createdAt, + tagList: review.tagList, + like: { + isLiked: review.isLiked, + likeCount: review.likeCount, + }, + }; + }); res.status(statusCode.OK).send( util.success(statusCode.OK, responseMessage.READ_ALL_POSTS_SUCCESS, { - writer, + writer: { + writerId: writer.id, + nickname: writer.nickname, + }, reviewList, }), ); diff --git a/functions/db/review.js b/functions/db/review.js index 7ff35708..fcef92e4 100644 --- a/functions/db/review.js +++ b/functions/db/review.js @@ -128,19 +128,37 @@ const deleteReview = async (client, id) => { return convertSnakeToCamel.keysToCamel(rows[0]); }; -const getReviewListByUserId = async (client, userId) => { +const getReviewListByUserId = async (client, writerId, likeTypeId, userId) => { const { rows } = await client.query( ` - SELECT r.*, m.major_name + SELECT r.*, m.major_name, + ( + SELECT cast(count(l.*) as integer) AS like_count FROM "like" l + WHERE l.target_id = r.id + AND l.target_type_id = $2 + AND l.is_liked = true + AND r.is_deleted = false + ), + ( + coalesce( + ( + SELECT l.is_liked FROM "like" l + WHERE l.target_id = r.id + AND l.target_type_id = $2 + AND l.user_id = $3 + AND r.is_deleted = false + ), false + ) + ) as is_liked FROM review r INNER JOIN major m - ON r.major_id = m.id - AND m.is_deleted = false + ON r.major_id = m.id + AND m.is_deleted = false AND r.writer_id = $1 AND r.is_deleted = false ORDER BY created_at desc `, - [userId], + [writerId, likeTypeId, userId], ); return convertSnakeToCamel.keysToCamel(rows); };