import { metrics } from "@opentelemetry/api" import * as api from "@/lib/api" import { badRequestError, serverErrorByStatus } from "@/server/errors/trpc" import { router, serviceProcedure } from "@/server/trpc" import { getBookingStatusInput } from "./input" import { createBookingSchema } from "./output" const meter = metrics.getMeter("trpc.booking") const getBookingStatusCounter = meter.createCounter("trpc.booking.status") const getBookingStatusSuccessCounter = meter.createCounter( "trpc.booking.status-success" ) const getBookingStatusFailCounter = meter.createCounter( "trpc.booking.status-fail" ) export const bookingQueryRouter = router({ status: serviceProcedure.input(getBookingStatusInput).query(async function ({ ctx, input, }) { const { confirmationNumber } = input getBookingStatusCounter.add(1, { confirmationNumber }) const apiResponse = await api.get( `${api.endpoints.v1.booking}/${confirmationNumber}/status`, { headers: { Authorization: `Bearer ${ctx.serviceToken}`, }, } ) if (!apiResponse.ok) { const responseMessage = await apiResponse.text() getBookingStatusFailCounter.add(1, { confirmationNumber, error_type: "http_error", error: responseMessage, }) console.error( "api.booking.status error", JSON.stringify({ query: { confirmationNumber }, error: { status: apiResponse.status, statusText: apiResponse.statusText, text: responseMessage, }, }) ) throw serverErrorByStatus(apiResponse.status, apiResponse) } const apiJson = await apiResponse.json() const verifiedData = createBookingSchema.safeParse(apiJson) if (!verifiedData.success) { getBookingStatusFailCounter.add(1, { confirmationNumber, error_type: "validation_error", error: JSON.stringify(verifiedData.error), }) console.error( "api.booking.status validation error", JSON.stringify({ query: { confirmationNumber }, error: verifiedData.error, }) ) throw badRequestError() } getBookingStatusSuccessCounter.add(1, { confirmationNumber }) console.info( "api.booking.status success", JSON.stringify({ query: { confirmationNumber }, }) ) return verifiedData.data }), })