directus-extension-search-engine
Version:
110 lines (83 loc) • 4.07 kB
text/typescript
import { InvalidPayloadError } from "@directus/errors"
import { accessMiddleware } from "../middlewares/role.middleware"
import { BaseService } from "../services/base.service"
import { TypeContextConstructor } from "../types/base.type"
import { asyncHandler } from "../utils"
import { typeMiddleware } from "../middlewares/type.middleware"
import { MultiSearchRequestSchema, MultiSearchRequestsSchema } from "typesense/lib/Typesense/MultiSearch"
import { SearchParams } from "typesense/lib/Typesense/Documents"
export class SearchControllerClass extends BaseService {
protected router: any
constructor(router: any, context: TypeContextConstructor) {
super({ context })
this.router = router
this.router.post("/typesense/search-collection/:collection",
typeMiddleware(context),
// accessMiddleware(['user'], context),
asyncHandler(async (req: any, res: any, next: any) => {
let { collection } = req.params
let searchParameters = req.body as SearchParams
let { data, errors } = await this.emitter.emitFilter("TYPESENSE_SEARCH_COLLECTION", { collection, searchParameters })
if (errors) {
return next(errors)
}
return res.status(201).json(data)
}))
this.router.post("/typesense/multi-search",
typeMiddleware(context),
// accessMiddleware(['user'], context),
asyncHandler(async (req: any, res: any, next: any) => {
let commonSearchParams = req.query as Partial<MultiSearchRequestSchema>
let searchRequests = req.body as MultiSearchRequestsSchema
let { data, errors } = await this.emitter.emitFilter("TYPESENSE_MULTI_SEARCH", { searchRequests, commonSearchParams })
if (errors) {
return next(errors)
}
return res.status(201).json(data)
}))
this.router.post("/typesense/refresh-index",
typeMiddleware(context),
accessMiddleware(['admin'], context),
asyncHandler(async (req: any, res: any, next: any) => {
this.emitter.emitAction("TYPESENSE_REFRESH_INDEX")
return res.status(201).json({
data: {
status: "success",
type: "TYPESENSE_REFRESH_INDEX"
}
})
}))
this.router.post("/typesense/index-data",
typeMiddleware(context),
accessMiddleware(['admin'], context),
asyncHandler(async (req: any, res: any, next: any) => {
let { collections } = req.body
this.emitter.emitAction("TYPESENSE_INDEX_DATA", { collections })
return res.status(201).json({
data: {
status: "success",
type: "TYPESENSE_INDEX_DATA"
}
})
}))
this.router.post("/typesense/clear-collections",
typeMiddleware(context),
accessMiddleware(['admin'], context),
asyncHandler(async (req: any, res: any, next: any) => {
let { collections } = req.body
this.emitter.emitAction("TYPESENSE_CLEAR_SCHEMA", { collections })
return res.status(201).json({
data: {
status: "success",
type: "TYPESENSE_CLEAR_SCHEMA"
}
})
}))
// this.router.post("/elasticsearch",
// typeMiddleware(context),
// accessMiddleware(['user'], context),
// asyncHandler(async (req: any, res: any, next: any) => {
// return res.status(200).json({ data: 111 })
// }))
}
}