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:
@@ -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(),
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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 },
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user