mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-09 10:34:17 +00:00
added basic search endpoint
This commit is contained in:
parent
9c9fa4c18b
commit
e9a6fa9c7e
85
packages/server/services/search/routes/search/get.js
Normal file
85
packages/server/services/search/routes/search/get.js
Normal file
@ -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
|
||||
},
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user