mirror of
https://github.com/ragestudio/comty.git
synced 2025-06-09 10:34:17 +00:00
improve search, using collectors
This commit is contained in:
parent
db14fd0c94
commit
ebdf6f7797
19
packages/server/services/search/collectors/extensions.js
Normal file
19
packages/server/services/search/collectors/extensions.js
Normal file
@ -0,0 +1,19 @@
|
||||
import { Extension } from "@db_models"
|
||||
|
||||
export default {
|
||||
key: "extensions",
|
||||
model: Extension,
|
||||
query: (keywords) => {
|
||||
const [name, version] = keywords.split("@")
|
||||
|
||||
const build = {
|
||||
name: { $regex: name, $options: "i" },
|
||||
}
|
||||
|
||||
if (version) {
|
||||
build.version = { $regex: version, $options: "i" }
|
||||
}
|
||||
|
||||
return build
|
||||
},
|
||||
}
|
11
packages/server/services/search/collectors/tracks.js
Normal file
11
packages/server/services/search/collectors/tracks.js
Normal file
@ -0,0 +1,11 @@
|
||||
import { Track } from "@db_models"
|
||||
|
||||
export default {
|
||||
key: "tracks",
|
||||
model: Track,
|
||||
query: (keywords) => {
|
||||
return {
|
||||
$or: [{ title: new RegExp(keywords, "i") }],
|
||||
}
|
||||
},
|
||||
}
|
14
packages/server/services/search/collectors/users.js
Normal file
14
packages/server/services/search/collectors/users.js
Normal file
@ -0,0 +1,14 @@
|
||||
import { User } from "@db_models"
|
||||
|
||||
export default {
|
||||
key: "users",
|
||||
model: User,
|
||||
query: (keywords) => {
|
||||
return {
|
||||
$or: [
|
||||
{ username: new RegExp(keywords, "i") },
|
||||
{ public_name: new RegExp(keywords, "i") },
|
||||
],
|
||||
}
|
||||
},
|
||||
}
|
@ -1,46 +1,46 @@
|
||||
import { Track, User } from "@db_models"
|
||||
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 } = req.query
|
||||
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 = [
|
||||
{
|
||||
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") }],
|
||||
}
|
||||
},
|
||||
},
|
||||
]
|
||||
const collections = []
|
||||
|
||||
fields.forEach((field) => {
|
||||
if (collectors[field]) {
|
||||
collections.push(collectors[field])
|
||||
}
|
||||
})
|
||||
|
||||
let searchers = collections.map((collection) => {
|
||||
return async () => {
|
||||
@ -52,7 +52,7 @@ export default {
|
||||
items: [],
|
||||
}
|
||||
|
||||
const query = collection.query()
|
||||
const query = collection.query(keywords)
|
||||
|
||||
const totalItems = await collection.model.countDocuments(query)
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user