From e9a6fa9c7ef09148df18fa2f017508b689329495 Mon Sep 17 00:00:00 2001 From: SrGooglo Date: Wed, 5 Feb 2025 02:52:05 +0000 Subject: [PATCH] added basic search endpoint --- .../services/search/routes/search/get.js | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 packages/server/services/search/routes/search/get.js diff --git a/packages/server/services/search/routes/search/get.js b/packages/server/services/search/routes/search/get.js new file mode 100644 index 00000000..656a5f97 --- /dev/null +++ b/packages/server/services/search/routes/search/get.js @@ -0,0 +1,85 @@ +import { Track, User } from "@db_models" +import pMap from "p-map" + +const escapeRegex = (str) => { + return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // Escapa caracteres especiales +} + +export default { + useMiddlewares: ["withOptionalAuthentication"], + fn: async (req, res) => { + let { keywords, limit = 50, offset = 0 } = req.query + + if (typeof keywords === "undefined") { + throw new OperationError(400, "Keywords are required") + } + + let results = {} + + keywords = escapeRegex(keywords) + + const collections = [ + { + key: "users", + model: User, + query: () => { + return { + $or: [ + { username: new RegExp(keywords, "i") }, + { public_name: new RegExp(keywords, "i") }, + ], + } + }, + }, + { + key: "tracks", + model: Track, + query: () => { + return { + $or: [{ title: new RegExp(keywords, "i") }], + } + }, + }, + ] + + let searchers = collections.map((collection) => { + return async () => { + if (!collection.key) { + return null + } + + results[collection.key] = { + items: [], + } + + const query = collection.query() + + const totalItems = await collection.model.countDocuments(query) + + let result = await collection.model + .find(query) + .limit(limit) + .skip(offset) + .sort({ _id: -1 }) + .lean() + + results[collection.key].items = result + results[collection.key].total_items = totalItems + + return result + } + }) + + await pMap( + searchers, + async (searcher) => { + return await searcher() + }, + { + concurrency: 3, + }, + ) + + return results + }, +}