diff options
| author | Joe Carstairs <65492573+Sycamost@users.noreply.github.com> | 2023-08-12 09:39:41 +0100 |
|---|---|---|
| committer | Joe Carstairs <65492573+Sycamost@users.noreply.github.com> | 2023-08-12 09:41:58 +0100 |
| commit | 6549313a54e7fede18cfa170df82c29f511d76d7 (patch) | |
| tree | 2dc148824adfa08dd7b32cf2ca2179e6e3e23dfc /api/order.ts | |
| parent | fae665188dfd2c333c6fbba43a8d3c776b285d27 (diff) | |
No more API build step
Diffstat (limited to 'api/order.ts')
| -rw-r--r-- | api/order.ts | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/api/order.ts b/api/order.ts new file mode 100644 index 0000000..25def6d --- /dev/null +++ b/api/order.ts @@ -0,0 +1,61 @@ +import type { VercelRequest, VercelResponse } from '@vercel/node'; +import type Order from './_Order'; +import { paypalCaptureOrder, paypalCreateOrder } from './_paypal'; + +export default async function handler(request: VercelRequest, response: VercelResponse) { + if (request.method === 'POST') { + await handlePost(request, response); + } else if (request.method === 'PATCH') { + await handlePatch(request, response); + } else { + console.warn('Method was not POST. Method was ' + request.method); + response.status(404); + return; + } +} + +async function handlePost(request: VercelRequest, response: VercelResponse) { + const { productDescription, shortDescription, totalPrice }: Partial<Order> = request.body; + + if (!productDescription) { + response.status(400).send('Expected body to contain productDescription, but none provided.'); + } else if (!shortDescription) { + response.status(400).send('Expected body to contain shortDescription, but none provided.'); + } else if (!totalPrice) { + response.status(400).send('Expected body to contain totalPrice, but none provided.'); + } else { + try { + const paypalResponse = await paypalCreateOrder({ productDescription, shortDescription, totalPrice }); + response.status(201).json({ + orderId: paypalResponse.id, + }); + } catch (err) { + response.status(500).send(`Internal server error. ${err}`); + } + } +} + +async function handlePatch(request: VercelRequest, response: VercelResponse) { + const { id, isApproved }: Partial<PatchRequestBody> = request.body; + + if (!id) { + response.status(400).send('Expected body to contain id, but none provided.'); + } else if (!isApproved) { + response.status(400).send('Expected body to contain isApproved, but none provided.'); + } else { + try { + const paypalResponse = await paypalCaptureOrder(id); + response.status(201).json({ + orderId: paypalResponse.id, + paypalStatus: paypalResponse.status, + }); + } catch (err) { + response.status(500).send(`Internal server error. ${err}`); + } + } +} + +type PatchRequestBody = { + id: string; + isApproved: boolean; +}; |
