feat: add Album model, artist/search/upload controllers, requireArtist middleware
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
import Track from '../models/Track.js';
|
||||
|
||||
export const searchController = {
|
||||
async search(req, res, next) {
|
||||
try {
|
||||
const query = (req.query.q || '').trim();
|
||||
|
||||
if (!query) {
|
||||
return res.json({
|
||||
success: true,
|
||||
data: { tracks: [], artists: [], albums: [] },
|
||||
});
|
||||
}
|
||||
|
||||
const regex = new RegExp(query.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'i');
|
||||
|
||||
const tracks = await Track.find({
|
||||
$or: [
|
||||
{ title: regex },
|
||||
{ artist: regex },
|
||||
{ album: regex },
|
||||
],
|
||||
})
|
||||
.select('-__v')
|
||||
.sort({ createdAt: -1 })
|
||||
.limit(50)
|
||||
.lean();
|
||||
|
||||
const artistNames = [...new Set(tracks.map(t => t.artist))];
|
||||
const artists = artistNames.map(name => ({ name }));
|
||||
|
||||
const albumNames = [...new Set(tracks.map(t => t.album))];
|
||||
const albums = albumNames.map(name => ({ name }));
|
||||
|
||||
const data = { tracks, artists, albums };
|
||||
|
||||
return res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
return next(error);
|
||||
}
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user