import { metrics } from "@opentelemetry/api" import { Lang } from "@/constants/languages" import { env } from "@/env/server" import * as api from "@/lib/api" import encryptValue from "../utils/encryptValue" import type { FriendTransaction, Stay } from "./output" const meter = metrics.getMeter("trpc.user") const getProfileCounter = meter.createCounter("trpc.user.profile") const getProfileSuccessCounter = meter.createCounter( "trpc.user.profile-success" ) const getProfileFailCounter = meter.createCounter("trpc.user.profile-fail") async function updateStaysBookingUrl( data: Stay[], token: string, lang: Lang ): Promise async function updateStaysBookingUrl( data: FriendTransaction[], token: string, lang: Lang ): Promise async function updateStaysBookingUrl( data: Stay[] | FriendTransaction[], token: string, lang: Lang ) { // Temporary API call needed till we have user name in ctx session data getProfileCounter.add(1) console.info("api.user.profile updatebookingurl start", JSON.stringify({})) const apiResponse = await api.get(api.endpoints.v1.Profile.profile, { cache: "no-store", headers: { Authorization: `Bearer ${token}`, }, }) // Temporary Url, domain and lang support for current web const bookingUrl = new URL( "/hotelreservation/my-booking", env.PUBLIC_URL || "https://www.scandichotels.com" // fallback to production for ephemeral envs (like deploy previews) ) switch (lang) { case Lang.sv: bookingUrl.host = bookingUrl.host.replace(".com", ".se") bookingUrl.pathname = "/hotelreservation/din-bokning" break case Lang.no: bookingUrl.host = bookingUrl.host.replace(".com", ".no") bookingUrl.pathname = "/hotelreservation/my-booking" break case Lang.da: bookingUrl.host = bookingUrl.host.replace(".com", ".dk") bookingUrl.pathname = "/hotelreservation/min-booking" break case Lang.fi: bookingUrl.host = bookingUrl.host.replace(".com", ".fi") bookingUrl.pathname = "/varaa-hotelli/varauksesi" break case Lang.de: bookingUrl.host = bookingUrl.host.replace(".com", ".de") bookingUrl.pathname = "/hotelreservation/my-booking" break default: break } if (!apiResponse.ok) { getProfileFailCounter.add(1, { error: JSON.stringify(apiResponse) }) console.info( "api.user.profile updatebookingurl error", JSON.stringify({ error: apiResponse }) ) return data } const apiJson = await apiResponse.json() if (!apiJson.data?.attributes) { return data } getProfileSuccessCounter.add(1) console.info("api.user.profile updatebookingurl success", JSON.stringify({})) return data.map((d) => { const originalString = d.attributes.confirmationNumber.toString() + "," + apiJson.data.attributes.lastName const encryptedBookingValue = encryptValue(originalString) if (!!encryptedBookingValue) { bookingUrl.searchParams.set("RefId", encryptedBookingValue) } else { bookingUrl.searchParams.set("lastName", apiJson.data.attributes.lastName) bookingUrl.searchParams.set("bookingId", d.attributes.confirmationNumber) } return { ...d, attributes: { ...d.attributes, bookingUrl: bookingUrl.toString(), }, } }) } export { updateStaysBookingUrl }