Merged in feat/SW-454-select-room-api (pull request #648)

Feat/SW-454 Create select rate page foundation

* Extract select-rate page to its own, fixed route

* Rename availability to hotelsAvailability

* Update availability hotels response

* Number to string


Approved-by: Pontus Dreij
This commit is contained in:
Niclas Edenvin
2024-10-08 09:10:06 +00:00
parent 05222035ff
commit 6e6d14875d
14 changed files with 143 additions and 72 deletions

View File

@@ -6,7 +6,7 @@ export const getHotelInputSchema = z.object({
.optional(),
})
export const getAvailabilityInputSchema = z.object({
export const getHotelsAvailabilityInputSchema = z.object({
cityId: z.string(),
roomStayStartDate: z.string(),
roomStayEndDate: z.string(),

View File

@@ -525,26 +525,18 @@ const occupancySchema = z.object({
const bestPricePerStaySchema = z.object({
currency: z.string(),
amount: z.number(),
regularAmount: z.number(),
memberAmount: z.number(),
discountRate: z.number(),
discountAmount: z.number(),
points: z.number(),
numberOfVouchers: z.number(),
numberOfBonusCheques: z.number(),
// TODO: remove optional when API is ready
regularAmount: z.string().optional(),
// TODO: remove optional when API is ready
memberAmount: z.string().optional(),
})
const bestPricePerNightSchema = z.object({
currency: z.string(),
amount: z.number(),
regularAmount: z.number(),
memberAmount: z.number(),
discountRate: z.number(),
discountAmount: z.number(),
points: z.number(),
numberOfVouchers: z.number(),
numberOfBonusCheques: z.number(),
// TODO: remove optional when API is ready
regularAmount: z.string().optional(),
// TODO: remove optional when API is ready
memberAmount: z.string().optional(),
})
const linksSchema = z.object({
@@ -556,7 +548,7 @@ const linksSchema = z.object({
),
})
const availabilitySchema = z.object({
const hotelsAvailabilitySchema = z.object({
data: z.array(
z.object({
attributes: z.object({
@@ -575,10 +567,10 @@ const availabilitySchema = z.object({
),
})
export const getAvailabilitySchema = availabilitySchema
export type Availability = z.infer<typeof availabilitySchema>
export type AvailabilityPrices =
Availability["data"][number]["attributes"]["bestPricePerNight"]
export const getHotelsAvailabilitySchema = hotelsAvailabilitySchema
export type HotelsAvailability = z.infer<typeof hotelsAvailabilitySchema>
export type HotelsAvailabilityPrices =
HotelsAvailability["data"][number]["attributes"]["bestPricePerNight"]
const flexibilityPrice = z.object({
standard: z.number(),

View File

@@ -20,14 +20,14 @@ import { toApiLang } from "@/server/utils"
import { hotelPageSchema } from "../contentstack/hotelPage/output"
import {
getAvailabilityInputSchema,
getHotelInputSchema,
getHotelsAvailabilityInputSchema,
getlHotelDataInputSchema,
getRatesInputSchema,
} from "./input"
import {
getAvailabilitySchema,
getHotelDataSchema,
getHotelsAvailabilitySchema,
getRatesSchema,
roomSchema,
} from "./output"
@@ -51,12 +51,14 @@ const getHotelCounter = meter.createCounter("trpc.hotel.get")
const getHotelSuccessCounter = meter.createCounter("trpc.hotel.get-success")
const getHotelFailCounter = meter.createCounter("trpc.hotel.get-fail")
const availabilityCounter = meter.createCounter("trpc.hotel.availability")
const availabilitySuccessCounter = meter.createCounter(
"trpc.hotel.availability-success"
const hotelsAvailabilityCounter = meter.createCounter(
"trpc.hotel.availability.hotels"
)
const availabilityFailCounter = meter.createCounter(
"trpc.hotel.availability-fail"
const hotelsAvailabilitySuccessCounter = meter.createCounter(
"trpc.hotel.availability.hotels-success"
)
const hotelsAvailabilityFailCounter = meter.createCounter(
"trpc.hotel.availability.hotels-fail"
)
async function getContentstackData(
@@ -250,8 +252,8 @@ export const hotelQueryRouter = router({
}
}),
availability: router({
get: hotelServiceProcedure
.input(getAvailabilityInputSchema)
hotels: hotelServiceProcedure
.input(getHotelsAvailabilityInputSchema)
.query(async ({ input, ctx }) => {
const {
cityId,
@@ -274,7 +276,7 @@ export const hotelQueryRouter = router({
attachedProfileId,
}
availabilityCounter.add(1, {
hotelsAvailabilityCounter.add(1, {
cityId,
roomStayStartDate,
roomStayEndDate,
@@ -284,11 +286,11 @@ export const hotelQueryRouter = router({
reservationProfileType,
})
console.info(
"api.hotels.availability start",
"api.hotels.hotelsAvailability start",
JSON.stringify({ query: { cityId, params } })
)
const apiResponse = await api.get(
`${api.endpoints.v1.availability}/${cityId}`,
`${api.endpoints.v1.hotelsAvailability}/${cityId}`,
{
headers: {
Authorization: `Bearer ${ctx.serviceToken}`,
@@ -298,7 +300,7 @@ export const hotelQueryRouter = router({
)
if (!apiResponse.ok) {
const text = await apiResponse.text()
availabilityFailCounter.add(1, {
hotelsAvailabilityFailCounter.add(1, {
cityId,
roomStayStartDate,
roomStayEndDate,
@@ -314,7 +316,7 @@ export const hotelQueryRouter = router({
}),
})
console.error(
"api.hotels.availability error",
"api.hotels.hotelsAvailability error",
JSON.stringify({
query: { cityId, params },
error: {
@@ -328,9 +330,9 @@ export const hotelQueryRouter = router({
}
const apiJson = await apiResponse.json()
const validateAvailabilityData =
getAvailabilitySchema.safeParse(apiJson)
getHotelsAvailabilitySchema.safeParse(apiJson)
if (!validateAvailabilityData.success) {
availabilityFailCounter.add(1, {
hotelsAvailabilityFailCounter.add(1, {
cityId,
roomStayStartDate,
roomStayEndDate,
@@ -342,7 +344,7 @@ export const hotelQueryRouter = router({
error: JSON.stringify(validateAvailabilityData.error),
})
console.error(
"api.hotels.availability validation error",
"api.hotels.hotelsAvailability validation error",
JSON.stringify({
query: { cityId, params },
error: validateAvailabilityData.error,
@@ -350,7 +352,7 @@ export const hotelQueryRouter = router({
)
throw badRequestError()
}
availabilitySuccessCounter.add(1, {
hotelsAvailabilitySuccessCounter.add(1, {
cityId,
roomStayStartDate,
roomStayEndDate,
@@ -360,7 +362,7 @@ export const hotelQueryRouter = router({
reservationProfileType,
})
console.info(
"api.hotels.availability success",
"api.hotels.hotelsAvailability success",
JSON.stringify({
query: { cityId, params: params },
})