Feat/SW-3549 pass scandic token * WIP pass scandic token * pass scandic token when booking * Merge branch 'master' of bitbucket.org:scandic-swap/web into feat/SW-3549-pass-scandic-token * pass user token when doing availability search * undo changes * merge * Merged in fix/sw-3551-rsc-bookingflowconfig (pull request #2988) fix(SW-3551): Fix issue with BookingConfigProvider in RSC * wip move config to pages * Move config providing to pages * Merged in fix/update-promo-error-modal-text (pull request #2990) fix: update promo error modal text * fix: update promo error modal text Approved-by: Emma Zettervall * Merged in fix/sw-3514-missing-membership-input-for-multiroom (pull request #2991) fix(SW-3514): Show join Scandic Friends card for SAS multiroom * Show join card for room 2+ Approved-by: Hrishikesh Vaipurkar * Merged in feat/lokalise-rebuild (pull request #2993) Feat/lokalise rebuild * chore(lokalise): update translation ids * chore(lokalise): easier to switch between projects * chore(lokalise): update translation ids * . * . * . * . * . * . * chore(lokalise): update translation ids * chore(lokalise): update translation ids * . * . * . * chore(lokalise): update translation ids * chore(lokalise): update translation ids * . * . * chore(lokalise): update translation ids * chore(lokalise): update translation ids * chore(lokalise): new translations * merge * switch to errors for missing id's * merge * sync translations Approved-by: Linus Flood * Merged in feat/SW-3552-logout-from-social-session-when- (pull request #2994) feat(SW-3552): Removed scandic session on logout Approved-by: Joakim Jäderberg * merge * replace getRedemptionTokenSafely() with context based instead * Refactor user verification and error handling across multiple components; implement safeTry utility for safer async calls * Refactor user verification and error handling across multiple components; implement safeTry utility for safer async calls * merge * Merge branch 'master' of bitbucket.org:scandic-swap/web into feat/SW-3549-pass-scandic-token * add booking scope remove unused getMembershipNumber() Approved-by: Anton Gunnarsson Approved-by: Hrishikesh Vaipurkar
128 lines
3.5 KiB
TypeScript
128 lines
3.5 KiB
TypeScript
import { getCacheClient } from "@scandic-hotels/common/dataCache"
|
|
import { createCounter } from "@scandic-hotels/common/telemetry"
|
|
|
|
import { env } from "../../../../env/server"
|
|
import * as api from "../../../api"
|
|
import { badRequestError } from "../../../errors"
|
|
import { toApiLang } from "../../../utils"
|
|
import { hotelsAvailabilitySchema } from "../output"
|
|
|
|
import type { Lang } from "@scandic-hotels/common/constants/language"
|
|
|
|
import type { HotelsByHotelIdsAvailabilityInputSchema } from "../availability/hotelsByHotelIds"
|
|
|
|
export async function getHotelsAvailabilityByHotelIds({
|
|
input,
|
|
lang,
|
|
userToken,
|
|
serviceToken,
|
|
userPoints = 0,
|
|
}: {
|
|
input: HotelsByHotelIdsAvailabilityInputSchema
|
|
lang: Lang
|
|
userToken: string | null | undefined
|
|
serviceToken: string
|
|
userPoints: number | undefined
|
|
}) {
|
|
const {
|
|
hotelIds,
|
|
roomStayStartDate,
|
|
roomStayEndDate,
|
|
adults,
|
|
children,
|
|
bookingCode,
|
|
redemption,
|
|
} = input
|
|
|
|
const apiLang = toApiLang(lang)
|
|
|
|
const params = new URLSearchParams([
|
|
["roomStayStartDate", roomStayStartDate],
|
|
["roomStayEndDate", roomStayEndDate],
|
|
["adults", adults.toString()],
|
|
["children", children ?? ""],
|
|
["bookingCode", bookingCode],
|
|
["isRedemption", redemption.toString()],
|
|
["language", apiLang],
|
|
])
|
|
|
|
const getHotelsAvailabilityByHotelIdsCounter = createCounter(
|
|
"hotel",
|
|
"getHotelsAvailabilityByHotelIds"
|
|
)
|
|
const metricsGetHotelsAvailabilityByHotelIds =
|
|
getHotelsAvailabilityByHotelIdsCounter.init({
|
|
apiLang,
|
|
hotelIds,
|
|
roomStayStartDate,
|
|
roomStayEndDate,
|
|
adults,
|
|
children,
|
|
bookingCode,
|
|
redemption,
|
|
})
|
|
|
|
metricsGetHotelsAvailabilityByHotelIds.start()
|
|
|
|
const cacheClient = await getCacheClient()
|
|
|
|
const result = cacheClient.cacheOrGet(
|
|
`${apiLang}:hotels:availability:${hotelIds.join(",")}:${roomStayStartDate}:${roomStayEndDate}:${adults}:${children}:${bookingCode}`,
|
|
async () => {
|
|
/**
|
|
* Since API expects the params appended and not just
|
|
* a comma separated string we need to initialize the
|
|
* SearchParams with a sequence of pairs
|
|
* (hotelIds=810&hotelIds=879&hotelIds=222 etc.)
|
|
**/
|
|
|
|
hotelIds.forEach((hotelId) =>
|
|
params.append("hotelIds", hotelId.toString())
|
|
)
|
|
|
|
const apiResponse = await api.get(
|
|
api.endpoints.v1.Availability.hotels(),
|
|
{
|
|
headers: {
|
|
Authorization: `Bearer ${userToken ?? serviceToken}`,
|
|
},
|
|
},
|
|
params
|
|
)
|
|
if (!apiResponse.ok) {
|
|
await metricsGetHotelsAvailabilityByHotelIds.httpError(apiResponse)
|
|
throw new Error("Failed to fetch hotels availability by hotelIds")
|
|
}
|
|
|
|
const apiJson = await apiResponse.json()
|
|
const validateAvailabilityData =
|
|
hotelsAvailabilitySchema.safeParse(apiJson)
|
|
if (!validateAvailabilityData.success) {
|
|
metricsGetHotelsAvailabilityByHotelIds.validationError(
|
|
validateAvailabilityData.error
|
|
)
|
|
throw badRequestError()
|
|
}
|
|
|
|
if (redemption) {
|
|
validateAvailabilityData.data.data.forEach((data) => {
|
|
data.attributes.productType?.redemptions?.forEach((r) => {
|
|
r.hasEnoughPoints = userPoints >= r.localPrice.pointsPerStay
|
|
})
|
|
})
|
|
}
|
|
|
|
return {
|
|
availability: validateAvailabilityData.data.data.flatMap(
|
|
(hotels) => hotels.attributes
|
|
),
|
|
}
|
|
},
|
|
redemption ? "no cache" : env.CACHE_TIME_CITY_SEARCH
|
|
)
|
|
|
|
metricsGetHotelsAvailabilityByHotelIds.success()
|
|
|
|
return result
|
|
}
|