Update handlers

This commit is contained in:
Catalin Pinte 2022-10-20 10:09:46 +03:00
parent e8c1ef1f57
commit 3fd24810f9
7 changed files with 71 additions and 56 deletions

View File

@ -2,8 +2,9 @@ import type { APIProvider, CommerceAPI, EndpointHandler } from '..'
import type { NextRequest } from 'next/server'
import { normalizeApiError } from './errors'
import { transformHeaders } from '.'
export default function edgeApi<P extends APIProvider>(
export default function edgeHandler<P extends APIProvider>(
commerce: CommerceAPI<P>,
endpoints: Record<string, (commerce: CommerceAPI<P>) => EndpointHandler>
) {
@ -49,16 +50,14 @@ export default function edgeApi<P extends APIProvider>(
return output
}
const { headers } = output
const headers = transformHeaders(output.headers)
// If the output contains a redirectTo property, return a Response with the redirect
if (output.redirectTo) {
headers.append('Location', output.redirectTo)
return new Response(null, {
status: 302,
headers: {
...headers,
Location: output.redirectTo,
},
headers,
})
}

View File

@ -50,3 +50,17 @@ export const transformRequest = (req: NextApiRequest, path: string) => {
body,
})
}
export const transformHeaders = (
headers?: Record<string, string | number | string[]>
) =>
headers
? Object.entries(headers).reduce((acc, [key, value]) => {
if (Array.isArray(value)) {
value.forEach((v) => acc.append(key, v))
} else {
acc.append(key, `${value}`)
}
return acc
}, new Headers())
: new Headers()

View File

@ -4,7 +4,7 @@ import type { APIProvider, CommerceAPI, EndpointHandler } from '..'
import { normalizeApiError } from './errors'
import { transformRequest } from '.'
export default function nodeApi<P extends APIProvider>(
export default function nodeHandler<P extends APIProvider>(
commerce: CommerceAPI<P>,
endpoints: {
[key: string]: (commerce: CommerceAPI<P>) => EndpointHandler
@ -44,8 +44,7 @@ export default function nodeApi<P extends APIProvider>(
)
}
const newReq = transformRequest(req, path)
const output = await handlers[path](newReq)
const output = await handlers[path](transformRequest(req, path))
if (output instanceof Response) {
return res.end(output.body)
@ -54,9 +53,9 @@ export default function nodeApi<P extends APIProvider>(
const { status, errors, data, redirectTo, headers } = output
if (headers) {
for (const [key, value] of Object.entries(headers)) {
Object.entries(headers).forEach(([key, value]) => {
res.setHeader(key, value)
}
})
}
if (redirectTo) {

View File

@ -7,7 +7,7 @@ export type APIResponse<Data = any> = {
data?: Data
errors?: ErrorData[]
status?: number
headers?: HeadersInit
headers?: Record<string, number | string | string[]>
/**
* @type {string}
* @example redirectTo: '/cart'

View File

@ -11,7 +11,7 @@ const addItem: CartEndpoint['handlers']['addItem'] = async ({
}) => {
// Get token
let token = req.cookies.get(tokenCookie)
let headers = new Headers()
let headers: any = {}
// Create an order if it doesn't exist
if (!cartId) {
@ -24,20 +24,21 @@ const addItem: CartEndpoint['handlers']['addItem'] = async ({
cartId = ID
headers.append(
'set-cookie',
headers = {
'set-cookie': [
serialize(cartCookie, cartId!, {
maxAge: 60 * 60 * 24 * 30,
expires: new Date(Date.now() + 60 * 60 * 24 * 30 * 1000),
secure: process.env.NODE_ENV === 'production',
path: '/',
sameSite: 'lax',
})
)
}),
],
}
headers.append(
'set-cookie',
serialize(tokenCookie, meta.token.access_token, {
if (meta?.token) {
headers['set-cookie'].push(
serialize(tokenCookie, meta.token?.access_token, {
maxAge: meta.token.expires_in,
expires: new Date(Date.now() + meta.token.expires_in * 1000),
secure: process.env.NODE_ENV === 'production',
@ -46,6 +47,7 @@ const addItem: CartEndpoint['handlers']['addItem'] = async ({
})
)
}
}
let specs: RawVariantSpec[] = []

View File

@ -19,7 +19,7 @@ const getCart: CartEndpoint['handlers']['getCart'] = async ({
const token = req.cookies.get(tokenCookie)
// Get cart & line items
const [cart, { Items, meta }] = await Promise.all([
const [cart, { Items }] = await Promise.all([
restBuyerFetch('GET', `/orders/Outgoing/${cartId}`, null, { token }),
restBuyerFetch('GET', `/orders/Outgoing/${cartId}/lineitems`, null, {
token,
@ -34,24 +34,18 @@ const getCart: CartEndpoint['handlers']['getCart'] = async ({
}
} catch (error) {
console.error(error)
const headers = new Headers()
headers.append(
'set-cookie',
const headers = {
'set-cookie': [
serialize(cartCookie, '', {
maxAge: -1,
path: '/',
})
)
headers.append(
'set-cookie',
}),
serialize(tokenCookie, '', {
maxAge: -1,
path: '/',
})
)
}),
],
}
// Return empty cart
return {
data: null,

View File

@ -75,11 +75,18 @@ export async function fetchData<T>(opts: {
// If something failed getting the data response
if (!dataResponse.ok) {
let errors
try {
// Get the body of it
const error = await dataResponse.json()
// And return an error
errors = error.Errors
} catch (e) {
const message = await dataResponse.text()
errors = [{ message }]
}
throw new FetcherError({
errors: error.Errors,
errors,
status: dataResponse.status,
})
}