From 5775161ac5cb248dd49885532fcb0600d164105c Mon Sep 17 00:00:00 2001 From: Bintang Murtifandy <21844@student.stembayo.sch.id> Date: Tue, 26 May 2026 21:44:40 +0700 Subject: [PATCH] feat: implement removeTrack and deletePlaylist endpoints; add byIds method to trackController --- src/controllers/playlistController.js | 50 +++++++++++++++++++++++++++ src/controllers/trackController.js | 13 +++++++ src/routes/playlists.js | 2 ++ src/routes/tracks.js | 1 + 4 files changed, 66 insertions(+) diff --git a/src/controllers/playlistController.js b/src/controllers/playlistController.js index 9e39e55..5fcdb17 100644 --- a/src/controllers/playlistController.js +++ b/src/controllers/playlistController.js @@ -97,4 +97,54 @@ export const playlistController = { next(error); } }, + + async removeTrack(req, res, next) { + try { + const { playlistId } = req.params; + const { trackId } = req.body; + + if (!trackId) { + return res + .status(400) + .json({ success: false, message: 'Track id is required' }); + } + + const playlist = await Playlist.findOneAndUpdate( + { _id: playlistId, user: req.userId }, + { $pull: { tracks: trackId } }, + { new: true } + ).populate('tracks').lean(); + + if (!playlist) { + return res + .status(404) + .json({ success: false, message: 'Playlist not found' }); + } + + return res.json({ success: true, data: playlist }); + } catch (error) { + next(error); + } + }, + + async deletePlaylist(req, res, next) { + try { + const { playlistId } = req.params; + + const playlist = await Playlist.findOneAndDelete({ + _id: playlistId, + user: req.userId, + }); + + if (!playlist) { + return res + .status(404) + .json({ success: false, message: 'Playlist not found' }); + } + + return res.json({ success: true, message: 'Playlist deleted' }); + } catch (error) { + next(error); + } + }, }; diff --git a/src/controllers/trackController.js b/src/controllers/trackController.js index 7d73137..679dd32 100644 --- a/src/controllers/trackController.js +++ b/src/controllers/trackController.js @@ -2,6 +2,19 @@ import Track from '../models/Track.js'; import User from '../models/User.js'; export const trackController = { + async byIds(req, res, next) { + try { + const { ids } = req.body; + if (!Array.isArray(ids) || !ids.length) { + return res.json({ success: true, data: [] }); + } + const tracks = await Track.find({ _id: { $in: ids } }).lean(); + return res.json({ success: true, data: tracks }); + } catch (error) { + next(error); + } + }, + async list(req, res, next) { try { const tracks = await Track.find().sort({ createdAt: -1 }).lean(); diff --git a/src/routes/playlists.js b/src/routes/playlists.js index a85717b..bf23baa 100644 --- a/src/routes/playlists.js +++ b/src/routes/playlists.js @@ -14,5 +14,7 @@ router.post( playlistController.create ); router.post('/:playlistId/tracks', auth, playlistController.addTrack); +router.delete('/:playlistId/tracks', auth, playlistController.removeTrack); +router.delete('/:playlistId', auth, playlistController.deletePlaylist); export default router; diff --git a/src/routes/tracks.js b/src/routes/tracks.js index d5694c9..6e7bfd7 100644 --- a/src/routes/tracks.js +++ b/src/routes/tracks.js @@ -7,6 +7,7 @@ import { uploadTrackAssets } from '../utils/multer.js'; const router = Router(); router.get('/', trackController.list); +router.post('/by-ids', trackController.byIds); router.get('/liked', auth, trackController.listLiked); router.post( '/',