mirror of
https://github.com/vercel/commerce.git
synced 2025-06-19 13:41:22 +00:00
Moved checkout api
This commit is contained in:
parent
11200b3bb1
commit
676b614bf6
62
framework/bigcommerce/api/endpoints/checkout/checkout.ts
Normal file
62
framework/bigcommerce/api/endpoints/checkout/checkout.ts
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
import type { CheckoutEndpoint } from '.'
|
||||||
|
|
||||||
|
const fullCheckout = true
|
||||||
|
|
||||||
|
const checkout: CheckoutEndpoint['handlers']['checkout'] = async ({
|
||||||
|
req,
|
||||||
|
res,
|
||||||
|
config,
|
||||||
|
}) => {
|
||||||
|
const { cookies } = req
|
||||||
|
const cartId = cookies[config.cartCookie]
|
||||||
|
|
||||||
|
if (!cartId) {
|
||||||
|
res.redirect('/cart')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data } = await config.storeApiFetch(
|
||||||
|
`/v3/carts/${cartId}/redirect_urls`,
|
||||||
|
{
|
||||||
|
method: 'POST',
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
if (fullCheckout) {
|
||||||
|
res.redirect(data.checkout_url)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: make the embedded checkout work too!
|
||||||
|
const html = `
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Checkout</title>
|
||||||
|
<script src="https://checkout-sdk.bigcommerce.com/v1/loader.js"></script>
|
||||||
|
<script>
|
||||||
|
window.onload = function() {
|
||||||
|
checkoutKitLoader.load('checkout-sdk').then(function (service) {
|
||||||
|
service.embedCheckout({
|
||||||
|
containerId: 'checkout',
|
||||||
|
url: '${data.embedded_checkout_url}'
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="checkout"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`
|
||||||
|
|
||||||
|
res.status(200)
|
||||||
|
res.setHeader('Content-Type', 'text/html')
|
||||||
|
res.write(html)
|
||||||
|
res.end()
|
||||||
|
}
|
||||||
|
|
||||||
|
export default checkout
|
18
framework/bigcommerce/api/endpoints/checkout/index.ts
Normal file
18
framework/bigcommerce/api/endpoints/checkout/index.ts
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import { GetAPISchema, createEndpoint } from '@commerce/api'
|
||||||
|
import checkoutEndpoint from '@commerce/api/endpoints/checkout'
|
||||||
|
import type { CheckoutSchema } from '../../../types/checkout'
|
||||||
|
import type { BigcommerceAPI } from '../..'
|
||||||
|
import checkout from './checkout'
|
||||||
|
|
||||||
|
export type CheckoutAPI = GetAPISchema<BigcommerceAPI, CheckoutSchema>
|
||||||
|
|
||||||
|
export type CheckoutEndpoint = CheckoutAPI['endpoint']
|
||||||
|
|
||||||
|
export const handlers: CheckoutEndpoint['handlers'] = { checkout }
|
||||||
|
|
||||||
|
const checkoutApi = createEndpoint<CheckoutAPI>({
|
||||||
|
handler: checkoutEndpoint,
|
||||||
|
handlers,
|
||||||
|
})
|
||||||
|
|
||||||
|
export default checkoutApi
|
1
framework/bigcommerce/types/checkout.ts
Normal file
1
framework/bigcommerce/types/checkout.ts
Normal file
@ -0,0 +1 @@
|
|||||||
|
export * from '@commerce/types/checkout'
|
35
framework/commerce/api/endpoints/checkout.ts
Normal file
35
framework/commerce/api/endpoints/checkout.ts
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import type { CheckoutSchema } from '../../types/checkout'
|
||||||
|
import { CommerceAPIError } from '../utils/errors'
|
||||||
|
import isAllowedOperation from '../utils/is-allowed-operation'
|
||||||
|
import type { GetAPISchema } from '..'
|
||||||
|
|
||||||
|
const checkoutEndpoint: GetAPISchema<
|
||||||
|
any,
|
||||||
|
CheckoutSchema
|
||||||
|
>['endpoint']['handler'] = async (ctx) => {
|
||||||
|
const { req, res, handlers } = ctx
|
||||||
|
|
||||||
|
if (
|
||||||
|
!isAllowedOperation(req, res, {
|
||||||
|
GET: handlers['checkout'],
|
||||||
|
})
|
||||||
|
) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const body = null
|
||||||
|
return await handlers['checkout']({ ...ctx, body })
|
||||||
|
} catch (error) {
|
||||||
|
console.error(error)
|
||||||
|
|
||||||
|
const message =
|
||||||
|
error instanceof CommerceAPIError
|
||||||
|
? 'An unexpected error ocurred with the Commerce API'
|
||||||
|
: 'An unexpected error ocurred'
|
||||||
|
|
||||||
|
res.status(500).json({ data: null, errors: [{ message }] })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default checkoutEndpoint
|
@ -8,6 +8,7 @@ import type { LogoutSchema } from '../types/logout'
|
|||||||
import type { SignupSchema } from '../types/signup'
|
import type { SignupSchema } from '../types/signup'
|
||||||
import type { ProductsSchema } from '../types/product'
|
import type { ProductsSchema } from '../types/product'
|
||||||
import type { WishlistSchema } from '../types/wishlist'
|
import type { WishlistSchema } from '../types/wishlist'
|
||||||
|
import type { CheckoutSchema } from '../types/checkout'
|
||||||
import {
|
import {
|
||||||
defaultOperations,
|
defaultOperations,
|
||||||
OPERATIONS,
|
OPERATIONS,
|
||||||
@ -23,6 +24,7 @@ export type APISchemas =
|
|||||||
| SignupSchema
|
| SignupSchema
|
||||||
| ProductsSchema
|
| ProductsSchema
|
||||||
| WishlistSchema
|
| WishlistSchema
|
||||||
|
| CheckoutSchema
|
||||||
|
|
||||||
export type GetAPISchema<
|
export type GetAPISchema<
|
||||||
C extends CommerceAPI<any>,
|
C extends CommerceAPI<any>,
|
||||||
|
10
framework/commerce/types/checkout.ts
Normal file
10
framework/commerce/types/checkout.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
export type CheckoutSchema = {
|
||||||
|
endpoint: {
|
||||||
|
options: {}
|
||||||
|
handlers: {
|
||||||
|
checkout: {
|
||||||
|
data: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,3 +0,0 @@
|
|||||||
import checkoutApi from '@framework/api/checkout'
|
|
||||||
|
|
||||||
export default checkoutApi()
|
|
4
pages/api/checkout.ts
Normal file
4
pages/api/checkout.ts
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
import checkoutApi from '@framework/api/endpoints/checkout'
|
||||||
|
import commerce from '@lib/api/commerce'
|
||||||
|
|
||||||
|
export default checkoutApi(commerce)
|
Loading…
x
Reference in New Issue
Block a user