Feat: Add customer search controller (#1111)

* add controllers directory and loaders

* move controllers to pure functions

* controller refactor

* update imports
This commit is contained in:
Philip Korsholm
2022-03-09 10:55:05 +01:00
committed by GitHub
parent daf49bcaf3
commit 5f5a2af30b
4 changed files with 57 additions and 34 deletions

View File

@@ -1,10 +1,7 @@
import { Type } from "class-transformer"
import { IsNumber, IsOptional, IsString } from "class-validator"
import { Customer } from "../../../.."
import CustomerService from "../../../../services/customer"
import { FindConfig } from "../../../../types/common"
import customerController from "../../../../controllers/customers"
import { AdminListCustomerSelector } from "../../../../types/customers"
import { validator } from "../../../../utils/validator"
/**
* @oas [get] /customers
* operationId: "GetCustomers"
@@ -24,38 +21,13 @@ import { validator } from "../../../../utils/validator"
* $ref: "#/components/schemas/customer"
*/
export default async (req, res) => {
const validated = await validator(AdminGetCustomersParams, req.query)
const customerService: CustomerService = req.scope.resolve("customerService")
const selector: AdminListCustomerSelector = {}
if (validated.q) {
selector.q = validated.q
}
let expandFields: string[] = []
if (validated.expand) {
expandFields = validated.expand.split(",")
}
const listConfig: FindConfig<Customer> = {
relations: expandFields,
skip: validated.offset,
take: validated.limit,
}
const [customers, count] = await customerService.listAndCount(
selector,
listConfig
const result = await customerController.listAndCount(
req.scope,
req.query,
req.body
)
res.json({
customers,
count,
offset: validated.offset,
limit: validated.limit,
})
res.json(result)
}
export class AdminGetCustomersParams extends AdminListCustomerSelector {

View File

@@ -0,0 +1,2 @@
import listAndCount from "./list-customers"
export default { listAndCount }

View File

@@ -0,0 +1,49 @@
import { omit, pickBy } from "lodash"
import { AdminGetCustomersParams } from "../../api/routes/admin/customers/list-customers"
import { AdminCustomersListRes } from "../../api"
import { CustomerService } from "../../services"
import { FindConfig } from "../../types/common"
import { validator } from "../../utils/validator"
import { Customer } from "../../models/customer"
const listAndCount = async (
scope,
query,
body,
context = {}
): Promise<AdminCustomersListRes> => {
const validatedQueryParams = await validator(AdminGetCustomersParams, query)
const customerService: CustomerService = scope.resolve("customerService")
let expandFields: string[] = []
if (validatedQueryParams.expand) {
expandFields = validatedQueryParams.expand.split(",")
}
const listConfig: FindConfig<Customer> = {
relations: expandFields,
skip: validatedQueryParams.offset,
take: validatedQueryParams.limit,
}
const filterableFields = omit(validatedQueryParams, [
"limit",
"offset",
"expand",
])
const [customers, count] = await customerService.listAndCount(
pickBy(filterableFields, (val) => typeof val !== "undefined"),
listConfig
)
return {
customers,
count,
offset: validatedQueryParams.offset,
limit: validatedQueryParams.limit,
}
}
export default listAndCount