From 7661611c66cc5606bb06bd8ff120afeab57170ee Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Tue, 4 Apr 2023 10:49:54 +0000 Subject: [PATCH] improve music feed endpoints --- .../src/controllers/FeedController/index.js | 65 ++++++++++++++++++- ...ylists.js => getPlaylistsFromFollowing.js} | 0 .../services/getPlaylistsFromGlobal.js | 35 ++++++++++ 3 files changed, 97 insertions(+), 3 deletions(-) rename packages/server/src/controllers/FeedController/services/{getPlaylists.js => getPlaylistsFromFollowing.js} (100%) create mode 100644 packages/server/src/controllers/FeedController/services/getPlaylistsFromGlobal.js diff --git a/packages/server/src/controllers/FeedController/index.js b/packages/server/src/controllers/FeedController/index.js index cd1bd225..e52de4a7 100755 --- a/packages/server/src/controllers/FeedController/index.js +++ b/packages/server/src/controllers/FeedController/index.js @@ -1,7 +1,8 @@ import { Controller } from "linebridge/dist/server" import getPosts from "./services/getPosts" -import getPlaylists from "./services/getPlaylists" +import getPlaylistsFromFollowing from "./services/getPlaylistsFromFollowing" +import getPlaylistsFromGlobal from "./services/getPlaylistsFromGlobal" export default class FeedController extends Controller { static refName = "FeedController" @@ -28,7 +29,7 @@ export default class FeedController extends Controller { }) // fetch playlists - let playlists = await getPlaylists({ + let playlists = await getPlaylistsFromFollowing({ for_user_id, limit: req.query?.limit, skip: req.query?.trim, @@ -61,6 +62,64 @@ export default class FeedController extends Controller { return res.json(feed) } }, + "/music/global": { + middlewares: ["withAuthentication"], + fn: async (req, res) => { + const for_user_id = req.user?._id.toString() + + if (!for_user_id) { + return res.status(400).json({ + error: "Invalid user id" + }) + } + + // fetch playlists from global + const result = await getPlaylistsFromGlobal({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + return res.json(result) + } + }, + "/music": { + middlewares: ["withAuthentication"], + fn: async (req, res) => { + const for_user_id = req.user?._id.toString() + + if (!for_user_id) { + return res.status(400).json({ + error: "Invalid user id" + }) + } + + let feed = { + followingArtists: [], + global: [], + mayLike: [], + } + + // fetch playlists from following + const followingArtistsPlaylists = await getPlaylistsFromFollowing({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + // fetch playlists from global + const globalPlaylists = await getPlaylistsFromGlobal({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + feed.followingArtists = followingArtistsPlaylists + feed.global = globalPlaylists + + return res.json(feed) + } + }, "/posts": { middlewares: ["withAuthentication"], fn: async (req, res) => { @@ -100,7 +159,7 @@ export default class FeedController extends Controller { let feed = [] // fetch playlists - const playlists = await getPlaylists({ + const playlists = await getPlaylistsFromFollowing({ for_user_id, limit: req.query?.limit, skip: req.query?.trim, diff --git a/packages/server/src/controllers/FeedController/services/getPlaylists.js b/packages/server/src/controllers/FeedController/services/getPlaylistsFromFollowing.js similarity index 100% rename from packages/server/src/controllers/FeedController/services/getPlaylists.js rename to packages/server/src/controllers/FeedController/services/getPlaylistsFromFollowing.js diff --git a/packages/server/src/controllers/FeedController/services/getPlaylistsFromGlobal.js b/packages/server/src/controllers/FeedController/services/getPlaylistsFromGlobal.js new file mode 100644 index 00000000..2bf860c7 --- /dev/null +++ b/packages/server/src/controllers/FeedController/services/getPlaylistsFromGlobal.js @@ -0,0 +1,35 @@ +import { User, Playlist } from "@models" +import getTrackDataById from "../../TracksController/services/getTrackDataById" + +export default async (payload) => { + const { + limit = 20, + skip = 0, + } = payload + + let playlists = await Playlist.find() + .sort({ created_at: -1 }) + .limit(limit) + .skip(skip) + + playlists = await Promise.all(playlists.map(async (playlist) => { + // get user data + const user = await User.findById(playlist.user_id) + + playlist.list = await Promise.all(playlist.list.map(async (track_id) => { + return await getTrackDataById(track_id) + })).catch((err) => { + return [] + }) + + return { + ...playlist.toObject(), + user: { + username: user.username, + avatar: user.avatar, + }, + } + })) + + return playlists +} \ No newline at end of file