diff --git a/packages/server/src/controllers/FeedController/index.js b/packages/server/src/controllers/FeedController/index.js index c8f3bf18..5f23b96d 100644 --- a/packages/server/src/controllers/FeedController/index.js +++ b/packages/server/src/controllers/FeedController/index.js @@ -1,6 +1,7 @@ import { Controller } from "linebridge/dist/server" import getPosts from "./methods/getPosts" +import getPlaylists from "./methods/getPlaylists" export default class FeedController extends Controller { static refName = "FeedController" @@ -29,6 +30,31 @@ export default class FeedController extends Controller { feed = feed.concat(posts) + return res.json(feed) + } + }, + "/playlists": { + 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 = [] + + // fetch playlists + const playlists = await getPlaylists({ + for_user_id, + limit: req.query?.limit, + skip: req.query?.trim, + }) + + feed = feed.concat(playlists) + return res.json(feed) } } diff --git a/packages/server/src/controllers/FeedController/methods/getPlaylists.js b/packages/server/src/controllers/FeedController/methods/getPlaylists.js new file mode 100644 index 00000000..d4d64442 --- /dev/null +++ b/packages/server/src/controllers/FeedController/methods/getPlaylists.js @@ -0,0 +1,43 @@ +import { User, Playlist, UserFollow } from "../../../models" + +export default async (payload) => { + const { + for_user_id, + limit = 20, + skip = 0, + } = payload + + // get post from users that the user follows + const followingUsers = await UserFollow.find({ + user_id: for_user_id + }) + + const followingUserIds = followingUsers.map((followingUser) => followingUser.to) + + const fetchFromUserIds = [ + for_user_id, + ...followingUserIds, + ] + + let playlists = await Playlist.find({ + user_id: { $in: fetchFromUserIds } + }) + .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) + + return { + ...playlist.toObject(), + user: { + username: user.username, + avatar: user.avatar, + }, + } + })) + + return playlists +} \ No newline at end of file