Adds query builder

This commit is contained in:
olivermrbl
2020-08-12 20:55:31 +02:00
parent 348c9980a5
commit 782acf4dca
4 changed files with 90 additions and 4 deletions
@@ -1,9 +1,22 @@
export default async (req, res) => {
const selector = {}
import _ from "lodash"
export default async (req, res) => {
try {
const orderService = req.scope.resolve("orderService")
const orders = await orderService.list(selector)
const queryBuilderService = req.scope.resolve("queryBuilderService")
const query = queryBuilderService.buildQuery(req.query, [
"email",
"status",
"fulfillment_status",
"payment_status",
])
let orders = await orderService.list(query)
orders = await Promise.all(
orders.map(order => orderService.decorate(order))
)
res.json({ orders })
} catch (error) {
@@ -1,7 +1,17 @@
import _ from "lodash"
export default async (req, res) => {
try {
const productService = req.scope.resolve("productService")
let products = await productService.list({})
const queryBuilderService = req.scope.resolve("queryBuilderService")
const query = queryBuilderService.buildQuery(req.query, [
"title",
"description",
])
let products = await productService.list(query)
products = await Promise.all(
products.map(
async product =>
@@ -0,0 +1,48 @@
import { BaseService } from "medusa-interfaces"
import _ from "lodash"
class QueryBuilderService extends BaseService {
buildQuery(params, properties) {
const textSearch = _.pick(params, ["q"])
const filters = _.pick(params, properties)
const textQuery = this.buildTextSearchQuery(textSearch, properties)
const filterQuery = this.buildFilterQuery(filters)
if (textQuery && filterQuery) {
return {
$and: [textQuery, filterQuery],
}
} else if (!textQuery && filterQuery) {
return filterQuery
} else if (textQuery && !filterQuery) {
return textQuery
} else {
return {}
}
}
buildFilterQuery(filters) {
if (_.isEmpty(filters)) return
const filterQuery = {}
Object.keys(filters).map(filter => {
filterQuery[filter] = filters[filter]
})
return filterQuery
}
buildTextSearchQuery(search, searchProperties) {
if (_.isEmpty(search)) return
const searchQuery = searchProperties.map(s => ({
[s]: new RegExp(search.q),
}))
return { $or: searchQuery }
}
}
export default QueryBuilderService