commerce/framework/reactioncommerce/api/utils/create-api-handler.ts
Loan Laux 09249045eb
Add Reaction Commerce provider
Signed-off-by: Loan Laux <loan@outgrow.io>
2021-03-30 20:07:48 +04:00

61 lines
1.6 KiB
TypeScript

import type { NextApiHandler, NextApiRequest, NextApiResponse } from 'next'
import { ReactionCommerceConfig, getConfig } from '..'
export type ReactionCommerceApiHandler<
T = any,
H extends ReactionCommerceHandlers = {},
Options extends {} = {}
> = (
req: NextApiRequest,
res: NextApiResponse<ReactionCommerceApiResponse<T>>,
config: ReactionCommerceConfig,
handlers: H,
// Custom configs that may be used by a particular handler
options: Options
) => void | Promise<void>
export type ReactionCommerceHandler<T = any, Body = null> = (options: {
req: NextApiRequest
res: NextApiResponse<ReactionCommerceApiResponse<T>>
config: ReactionCommerceConfig
body: Body
}) => void | Promise<void>
export type ReactionCommerceHandlers<T = any> = {
[k: string]: ReactionCommerceHandler<T, any>
}
export type ReactionCommerceApiResponse<T> = {
data: T | null
errors?: { message: string; code?: string }[]
}
export default function createApiHandler<
T = any,
H extends ReactionCommerceHandlers = {},
Options extends {} = {}
>(
handler: ReactionCommerceApiHandler<T, H, Options>,
handlers: H,
defaultOptions: Options
) {
console.log('next api handler', defaultOptions)
return function getApiHandler({
config,
operations,
options,
}: {
config?: ReactionCommerceConfig
operations?: Partial<H>
options?: Options extends {} ? Partial<Options> : never
} = {}): NextApiHandler {
const ops = { ...operations, ...handlers }
const opts = { ...defaultOptions, ...options }
return function apiHandler(req, res) {
return handler(req, res, getConfig(config), ops, opts)
}
}
}