2024-03-06 19:43:09 +00:00

86 lines
1.9 KiB
JavaScript
Executable File

import { Release, Playlist, Track } from "@db_models"
import TidalAPI from "@shared-classes/TidalAPI"
async function searchRoute(req, res) {
try {
const {
keywords,
limit = 5,
offset = 0,
useTidal = false
} = req.query
let results = {
playlists: [],
artists: [],
tracks: [],
album: [],
ep: [],
single: [],
}
let searchQuery = {
public: true,
}
if (keywords) {
searchQuery = {
...searchQuery,
title: {
$regex: keywords,
$options: "i",
},
// TODO: Improve searching by album or artist
}
}
let releases = await Release.find(searchQuery)
.limit(limit)
.skip(offset)
if (releases && releases.length > 0) {
releases.forEach((release) => {
results[release.type].push(release)
})
}
let playlists = await Playlist.find(searchQuery)
.limit(limit)
.skip(offset)
if (playlists) {
results.playlists = playlists
}
let tracks = await Track.find(searchQuery)
.limit(limit)
.skip(offset)
if (tracks) {
results.tracks = tracks
}
if (toBoolean(useTidal)) {
const tidalResult = await TidalAPI.search({
query: keywords
})
results.tracks = [...results.tracks, ...tidalResult]
}
return res.json(results)
} catch (error) {
return res.status(500).json({
error: error.message,
})
}
}
export default (router) => {
router.get("/", searchRoute)
return {
path: "/search",
router,
}
}