From 7df2c563723244426330b3e6a9e77cdb616ea733 Mon Sep 17 00:00:00 2001 From: Paul Kang Date: Wed, 20 Nov 2024 14:42:42 +0900 Subject: [PATCH] =?UTF-8?q?playlist=20=EC=A1=B0=ED=9A=8C=20api=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/models/dao/playlist.dao.js | 15 +++++++++++++-- src/models/sql/playlist.sql.js | 27 +++++++++++++++------------ 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/src/models/dao/playlist.dao.js b/src/models/dao/playlist.dao.js index a2cf6a7..f3e2c5c 100644 --- a/src/models/dao/playlist.dao.js +++ b/src/models/dao/playlist.dao.js @@ -54,12 +54,23 @@ export const showUserPlaylistsDAO = async (userId) => { export const playlistInfoDAO = async (playlistId) => { try { const conn = await pool.getConnection(); - const [rows] = await pool.query(playlistInfoSql, [playlistId]); + const [rows] = await conn.query(playlistInfoSql, [playlistId]); conn.release(); + + // 조회된 플레이리스트가 없을 경우 처리 + if (rows.length === 0) { + return { + playlist_id: playlistId, + playlist_title: null, + thumbnail: null, + songs: null, + }; + } + return rows[0]; // 하나의 플레이리스트 결과만 반환 } catch (error) { console.error(error); - throw new BaseError(status.PARAMETER_IS_WRONG); + throw new BaseError(status.PARAMETER_IS_WRONG, "Error fetching playlist info"); } }; diff --git a/src/models/sql/playlist.sql.js b/src/models/sql/playlist.sql.js index 2df825e..bc99276 100644 --- a/src/models/sql/playlist.sql.js +++ b/src/models/sql/playlist.sql.js @@ -39,28 +39,31 @@ export const playlistInfoSql = ` sp.id AS playlist_id, sp.title AS playlist_title, ( - SELECT si.thumbnail + SELECT si.media FROM SONG_INFO_TB si JOIN SONG_PLAYLIST_INFO spi ON si.id = spi.song_id WHERE spi.playlist_id = sp.id ORDER BY spi.order LIMIT 1 - ) AS thumbnail, - JSON_ARRAYAGG( - JSON_OBJECT( - 'song_id', si.id, - 'song_title', si.title, - 'song_order', spi.order, - 'artist_id', um.id, - 'artist_name', um.name, - 'thumbnail', si.thumbnail + ) AS thumbnail, -- 첫 번째 곡의 썸네일 + CASE + WHEN COUNT(spi.song_id) = 0 THEN NULL -- 곡이 없을 경우 null + ELSE JSON_ARRAYAGG( + JSON_OBJECT( + 'song_id', si.id, + 'song_title', si.title, + 'song_order', spi.order, + 'artist_id', um.id, + 'artist_name', um.name, + 'thumbnail', si.media -- 각 곡의 썸네일 + ) ) - ) AS songs + END AS songs FROM SONG_PLAYLIST_TB sp LEFT JOIN SONG_PLAYLIST_INFO spi ON sp.id = spi.playlist_id LEFT JOIN SONG_INFO_TB si ON spi.song_id = si.id LEFT JOIN USER_MEMBER_TB um ON si.user_id = um.id - WHERE sp.id = ? AND si.id IS NOT NULL + WHERE sp.id = ? GROUP BY sp.id; `;