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 pMap from "p-map"
|
||||||
|
|
||||||
|
import UsersCollector from "../../collectors/users"
|
||||||
|
import TracksCollector from "../../collectors/tracks"
|
||||||
|
import ExtensionsCollector from "../../collectors/extensions"
|
||||||
|
|
||||||
const escapeRegex = (str) => {
|
const escapeRegex = (str) => {
|
||||||
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // Escapa caracteres especiales
|
return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") // Escapa caracteres especiales
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const collectors = {
|
||||||
|
users: UsersCollector,
|
||||||
|
tracks: TracksCollector,
|
||||||
|
extensions: ExtensionsCollector,
|
||||||
|
}
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
useMiddlewares: ["withOptionalAuthentication"],
|
useMiddlewares: ["withOptionalAuthentication"],
|
||||||
fn: async (req, res) => {
|
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") {
|
if (typeof keywords === "undefined") {
|
||||||
throw new OperationError(400, "Keywords are required")
|
throw new OperationError(400, "Keywords are required")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fields = fields.split(",").map((field) => field.trim())
|
||||||
|
|
||||||
let results = {}
|
let results = {}
|
||||||
|
|
||||||
keywords = escapeRegex(keywords)
|
keywords = escapeRegex(keywords)
|
||||||
|
|
||||||
const collections = [
|
const collections = []
|
||||||
{
|
|
||||||
key: "users",
|
fields.forEach((field) => {
|
||||||
model: User,
|
if (collectors[field]) {
|
||||||
query: () => {
|
collections.push(collectors[field])
|
||||||
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) => {
|
let searchers = collections.map((collection) => {
|
||||||
return async () => {
|
return async () => {
|
||||||
@ -52,7 +52,7 @@ export default {
|
|||||||
items: [],
|
items: [],
|
||||||
}
|
}
|
||||||
|
|
||||||
const query = collection.query()
|
const query = collection.query(keywords)
|
||||||
|
|
||||||
const totalItems = await collection.model.countDocuments(query)
|
const totalItems = await collection.model.countDocuments(query)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user