diff --git a/packages/trpc/lib/routers/hotels/input.ts b/packages/trpc/lib/routers/hotels/input.ts index f5ec1430f..976ef627b 100644 --- a/packages/trpc/lib/routers/hotels/input.ts +++ b/packages/trpc/lib/routers/hotels/input.ts @@ -83,6 +83,7 @@ export const getHotelsByHotelIdsAvailabilityInputSchema = z adults: z.number(), children: z.string().optional(), bookingCode: z.string().optional().default(""), + redemption: z.boolean().optional().default(false), }) .refine( (data) => { diff --git a/packages/trpc/lib/routers/hotels/query.ts b/packages/trpc/lib/routers/hotels/query.ts index cafceabca..c48ed806f 100644 --- a/packages/trpc/lib/routers/hotels/query.ts +++ b/packages/trpc/lib/routers/hotels/query.ts @@ -136,12 +136,40 @@ export const hotelQueryRouter = router({ env.CACHE_TIME_CITY_SEARCH ) }), - hotelsByHotelIds: serviceProcedure + hotelsByHotelIds: safeProtectedServiceProcedure .input(getHotelsByHotelIdsAvailabilityInputSchema) + .use(async ({ ctx, input, next }) => { + if (input.redemption) { + if (ctx.session?.token.access_token) { + const verifiedUser = await getVerifiedUser({ session: ctx.session }) + if (!verifiedUser?.error) { + return next({ + ctx: { + token: ctx.session.token.access_token, + userPoints: verifiedUser?.data.membership?.currentPoints ?? 0, + }, + input, + }) + } + } + throw unauthorizedError() + } + return next({ + ctx: { + token: ctx.serviceToken, + }, + input, + }) + }) .query(async ({ input, ctx }) => { const { lang } = ctx const apiLang = toApiLang(lang) - return getHotelsAvailabilityByHotelIds(input, apiLang, ctx.serviceToken) + return getHotelsAvailabilityByHotelIds( + input, + apiLang, + ctx.token, + ctx.userPoints + ) }), enterDetails: safeProtectedServiceProcedure diff --git a/packages/trpc/lib/routers/hotels/utils.ts b/packages/trpc/lib/routers/hotels/utils.ts index 000891733..7c83851ed 100644 --- a/packages/trpc/lib/routers/hotels/utils.ts +++ b/packages/trpc/lib/routers/hotels/utils.ts @@ -796,7 +796,8 @@ export async function getHotelsAvailabilityByCity( export async function getHotelsAvailabilityByHotelIds( input: HotelsByHotelIdsAvailabilityInputSchema, apiLang: string, - serviceToken: string + token: string, + userPoints: number = 0 ) { const { hotelIds, @@ -805,6 +806,7 @@ export async function getHotelsAvailabilityByHotelIds( adults, children, bookingCode, + redemption, } = input const params = new URLSearchParams([ @@ -813,6 +815,7 @@ export async function getHotelsAvailabilityByHotelIds( ["adults", adults.toString()], ["children", children ?? ""], ["bookingCode", bookingCode], + ["isRedemption", redemption.toString()], ["language", apiLang], ]) @@ -829,6 +832,7 @@ export async function getHotelsAvailabilityByHotelIds( adults, children, bookingCode, + redemption, }) metricsGetHotelsAvailabilityByHotelIds.start() @@ -853,7 +857,7 @@ export async function getHotelsAvailabilityByHotelIds( api.endpoints.v1.Availability.hotels(), { headers: { - Authorization: `Bearer ${serviceToken}`, + Authorization: `Bearer ${token}`, }, }, params @@ -873,13 +877,21 @@ export async function getHotelsAvailabilityByHotelIds( 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 ), } }, - env.CACHE_TIME_CITY_SEARCH + redemption ? "no cache" : env.CACHE_TIME_CITY_SEARCH ) metricsGetHotelsAvailabilityByHotelIds.success()