mirror of
https://github.com/vercel/commerce.git
synced 2025-05-17 15:06:59 +00:00
Update handlers
This commit is contained in:
parent
e8c1ef1f57
commit
3fd24810f9
@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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) {
|
||||
|
@ -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'
|
||||
|
@ -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[] = []
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
})
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user