commerce/lib/bigcommerce/api/utils/create-api-handler.ts
2020-10-11 00:19:11 -05:00

48 lines
1.2 KiB
TypeScript

import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next'
import { BigcommerceConfig, getConfig } from '..'
export type BigcommerceApiHandler<
T = any,
H extends BigcommerceHandlers = {}
> = (
req: NextApiRequest,
res: NextApiResponse<BigcommerceApiResponse<T>>,
config: BigcommerceConfig,
handlers: H
) => void | Promise<void>
export type BigcommerceHandler<T = any, Body = any> = (options: {
req: NextApiRequest
res: NextApiResponse<BigcommerceApiResponse<T>>
config: BigcommerceConfig
body: Body
}) => void | Promise<void>
export type BigcommerceHandlers<T = any> = {
[k: string]: BigcommerceHandler<T, any>
}
export type BigcommerceApiResponse<T> = {
data: T | null
errors?: { message: string }[]
}
export default function createApiHandler<H extends BigcommerceHandlers>(
handler: BigcommerceApiHandler<any, H>,
handlers: H
) {
return function getApiHandler({
config,
operations,
}: {
config?: BigcommerceConfig
operations?: Partial<H>
} = {}): NextApiHandler {
const ops = { ...operations, ...handlers }
return function apiHandler(req, res) {
return handler(req, res, getConfig(config), ops)
}
}
}