mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-09 10:34:17 +00:00
140 lines
4.4 KiB
JavaScript
Executable File
140 lines
4.4 KiB
JavaScript
Executable File
import { Controller } from "linebridge/dist/server"
|
|
|
|
import pmap from "p-map"
|
|
|
|
import getPosts from "./services/getPosts"
|
|
|
|
import getGlobalReleases from "./services/getGlobalReleases"
|
|
import getReleasesFromFollowing from "./services/getReleasesFromFollowing"
|
|
import getPlaylistsFromFollowing from "./services/getPlaylistsFromFollowing"
|
|
|
|
export default class FeedController extends Controller {
|
|
static refName = "FeedController"
|
|
static useRoute = "/feed"
|
|
|
|
httpEndpoints = {
|
|
get: {
|
|
"/timeline": {
|
|
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 posts
|
|
let posts = await getPosts({
|
|
for_user_id,
|
|
limit: req.query?.limit,
|
|
skip: req.query?.trim,
|
|
})
|
|
|
|
// add type to posts and playlists
|
|
posts = posts.map((data) => {
|
|
data.type = "post"
|
|
|
|
return data
|
|
})
|
|
|
|
let feed = [
|
|
...posts,
|
|
]
|
|
|
|
// sort feed
|
|
feed.sort((a, b) => {
|
|
return new Date(b.created_at) - new Date(a.created_at)
|
|
})
|
|
|
|
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 getGlobalReleases({
|
|
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"
|
|
})
|
|
}
|
|
|
|
const searchers = [
|
|
getGlobalReleases,
|
|
//getReleasesFromFollowing,
|
|
//getPlaylistsFromFollowing,
|
|
]
|
|
|
|
let result = await pmap(
|
|
searchers,
|
|
async (fn, index) => {
|
|
const data = await fn({
|
|
for_user_id,
|
|
limit: req.query?.limit,
|
|
skip: req.query?.trim,
|
|
})
|
|
|
|
return data
|
|
}, {
|
|
concurrency: 3,
|
|
},)
|
|
|
|
result = result.reduce((acc, cur) => {
|
|
return [...acc, ...cur]
|
|
}, [])
|
|
|
|
return res.json(result)
|
|
}
|
|
},
|
|
"/posts": {
|
|
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 posts
|
|
const posts = await getPosts({
|
|
for_user_id,
|
|
limit: req.query?.limit,
|
|
skip: req.query?.trim,
|
|
})
|
|
|
|
feed = feed.concat(posts)
|
|
|
|
return res.json(feed)
|
|
}
|
|
},
|
|
}
|
|
}
|
|
} |