mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-12 03:54:16 +00:00
86 lines
1.6 KiB
JavaScript
86 lines
1.6 KiB
JavaScript
import pMap from "p-map"
|
|
|
|
import UsersCollector from "../../collectors/users"
|
|
import TracksCollector from "../../collectors/tracks"
|
|
import ExtensionsCollector from "../../collectors/extensions"
|
|
|
|
const escapeRegex = (str) => {
|
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // Escapa caracteres especiales
|
|
}
|
|
|
|
const collectors = {
|
|
users: UsersCollector,
|
|
tracks: TracksCollector,
|
|
extensions: ExtensionsCollector,
|
|
}
|
|
|
|
export default {
|
|
useMiddlewares: ["withOptionalAuthentication"],
|
|
fn: async (req, res) => {
|
|
let {
|
|
keywords = "",
|
|
limit = 50,
|
|
offset = 0,
|
|
fields = "users,tracks",
|
|
} = req.query
|
|
|
|
if (typeof keywords === "undefined") {
|
|
throw new OperationError(400, "Keywords are required")
|
|
}
|
|
|
|
fields = fields.split(",").map((field) => field.trim())
|
|
|
|
let results = {}
|
|
|
|
keywords = escapeRegex(keywords)
|
|
|
|
const collections = []
|
|
|
|
fields.forEach((field) => {
|
|
if (collectors[field]) {
|
|
collections.push(collectors[field])
|
|
}
|
|
})
|
|
|
|
let searchers = collections.map((collection) => {
|
|
return async () => {
|
|
if (!collection.key) {
|
|
return null
|
|
}
|
|
|
|
results[collection.key] = {
|
|
items: [],
|
|
}
|
|
|
|
const query = collection.query(keywords)
|
|
|
|
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
|
|
},
|
|
}
|