From 82e03978b89938219958032efb1448cc76baa181 Mon Sep 17 00:00:00 2001 From: Saumit Date: Sat, 27 Sep 2025 02:14:26 +0530 Subject: Initial snapshot - OpenTelemetry demo 2.1.3 -f --- src/frontend/gateways/http/Shipping.gateway.ts | 60 ++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/frontend/gateways/http/Shipping.gateway.ts (limited to 'src/frontend/gateways/http') diff --git a/src/frontend/gateways/http/Shipping.gateway.ts b/src/frontend/gateways/http/Shipping.gateway.ts new file mode 100644 index 0000000..fad3264 --- /dev/null +++ b/src/frontend/gateways/http/Shipping.gateway.ts @@ -0,0 +1,60 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +import { Address, CartItem, GetQuoteResponse } from '../../protos/demo'; + +const { SHIPPING_ADDR = '' } = process.env; + +// Transform address from camelCase to snake_case for HTTP API +const transformAddress = (address: Address) => ({ + street_address: address.streetAddress, + city: address.city, + state: address.state, + country: address.country, + zip_code: address.zipCode, +}); + +// Transform cart items from camelCase to snake_case for HTTP API +const transformCartItems = (items: CartItem[]) => + items.map(item => ({ + product_id: item.productId, + quantity: item.quantity, + })); + +const ShippingGateway = () => ({ + async getShippingCost(itemList: CartItem[], address: Address): Promise { + const requestBody = { + items: transformCartItems(itemList), + address: transformAddress(address), + }; + + const response = await fetch(`${SHIPPING_ADDR}/get-quote`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(requestBody), + }); + + if (!response.ok) { + const errorText = await response.text(); + throw new Error(`HTTP error: ${response.status} ${response.statusText} - ${errorText}`); + } + + const data = await response.json(); + + const costUsd = data.cost_usd ? { + currencyCode: data.cost_usd.currency_code, + units: data.cost_usd.units, + nanos: data.cost_usd.nanos, + } : undefined; + + const transformedResponse: GetQuoteResponse = { + costUsd, + }; + + return transformedResponse; + }, +}); + +export default ShippingGateway(); -- cgit v1.2.3