diff options
Diffstat (limited to 'src/frontend/pages/api/cart.ts')
| -rwxr-xr-x | src/frontend/pages/api/cart.ts | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/frontend/pages/api/cart.ts b/src/frontend/pages/api/cart.ts new file mode 100755 index 0000000..3f5b1b7 --- /dev/null +++ b/src/frontend/pages/api/cart.ts @@ -0,0 +1,56 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +import type { NextApiHandler } from 'next'; +import CartGateway from '../../gateways/rpc/Cart.gateway'; +import { AddItemRequest, Empty } from '../../protos/demo'; +import ProductCatalogService from '../../services/ProductCatalog.service'; +import { IProductCart, IProductCartItem } from '../../types/Cart'; +import InstrumentationMiddleware from '../../utils/telemetry/InstrumentationMiddleware'; + +type TResponse = IProductCart | Empty; + +const handler: NextApiHandler<TResponse> = async ({ method, body, query }, res) => { + switch (method) { + case 'GET': { + const { sessionId = '', currencyCode = '' } = query; + const { userId, items } = await CartGateway.getCart(sessionId as string); + + const productList: IProductCartItem[] = await Promise.all( + items.map(async ({ productId, quantity }) => { + const product = await ProductCatalogService.getProduct(productId, currencyCode as string); + + return { + productId, + quantity, + product, + }; + }) + ); + + return res.status(200).json({ userId, items: productList }); + } + + case 'POST': { + const { userId, item } = body as AddItemRequest; + + await CartGateway.addItem(userId, item!); + const cart = await CartGateway.getCart(userId); + + return res.status(200).json(cart); + } + + case 'DELETE': { + const { userId } = body as AddItemRequest; + await CartGateway.emptyCart(userId); + + return res.status(204).send(''); + } + + default: { + return res.status(405); + } + } +}; + +export default InstrumentationMiddleware(handler); |
