mirror of
https://github.com/velocitatem/PHANTOM.git
synced 2026-07-15 17:43:36 +00:00
* fix: fixes of backwords * fixing hotel information with image placeholders * chore: clean up product display in hotel and cleaner interfacing * adding loader with historical data loading * feature: cleaning up pipeline * chore: simple surge pricer * created new pricing pipeline * adding a checkout page to both sites * fix: fixing stale pacakge * test: we wont be using elasticity anymore so its okay * chore: cleaning elasticity references * chore: store sting * feature: e2e intro pipline surge pricing * fix: CVE vulnerability patching
89 lines
2.4 KiB
TypeScript
89 lines
2.4 KiB
TypeScript
export interface HotelProduct {
|
|
id: string;
|
|
room_type: string;
|
|
date_index: number;
|
|
metadata: {
|
|
amenities?: string[];
|
|
total?: number;
|
|
image_url?: string;
|
|
base_price?: number;
|
|
name?: string;
|
|
refundable?: boolean;
|
|
};
|
|
availability: number;
|
|
}
|
|
|
|
export interface Hotel {
|
|
id: string;
|
|
name: string;
|
|
roomType: string;
|
|
checkIn: string;
|
|
checkOut: string;
|
|
dateIndex: number;
|
|
amenities: string[];
|
|
pricePerNight: number;
|
|
nights: number;
|
|
}
|
|
|
|
const EPOCH = new Date(0);
|
|
|
|
export const transformProduct = (p: HotelProduct): Hotel => {
|
|
const { id, room_type, date_index, metadata } = p;
|
|
|
|
// DB stores date_index as days since epoch
|
|
// but if value is small (<1000), treat as days from today for backward compat
|
|
let checkIn: Date;
|
|
if (date_index < 1000) {
|
|
// legacy: treat as offset from today
|
|
const today = new Date();
|
|
today.setHours(0, 0, 0, 0);
|
|
checkIn = new Date(today.getTime() + date_index * 86400000);
|
|
} else {
|
|
// proper: days since epoch
|
|
checkIn = new Date(EPOCH.getTime() + date_index * 86400000);
|
|
}
|
|
|
|
const nights = 1;
|
|
const checkOut = new Date(checkIn.getTime() + nights * 86400000);
|
|
|
|
const formatOpts: Intl.DateTimeFormatOptions = {
|
|
month: 'short',
|
|
day: 'numeric',
|
|
year: checkIn.getFullYear() !== new Date().getFullYear() ? 'numeric' : undefined
|
|
};
|
|
|
|
return {
|
|
id,
|
|
name: metadata?.name || room_type,
|
|
roomType: room_type,
|
|
checkIn: checkIn.toLocaleDateString('en-US', formatOpts),
|
|
checkOut: checkOut.toLocaleDateString('en-US', formatOpts),
|
|
dateIndex: date_index,
|
|
amenities: metadata?.amenities || [],
|
|
pricePerNight: metadata?.base_price || 100,
|
|
nights,
|
|
};
|
|
};
|
|
|
|
// convert date string to days from today
|
|
export const dateToDaysFromToday = (dateStr: string): number => {
|
|
const target = new Date(dateStr);
|
|
target.setHours(0, 0, 0, 0);
|
|
const today = new Date();
|
|
today.setHours(0, 0, 0, 0);
|
|
return Math.floor((target.getTime() - today.getTime()) / 86400000);
|
|
};
|
|
|
|
// convert date string to date_index (days since epoch)
|
|
export const dateToIndex = (dateStr: string): number => {
|
|
const d = new Date(dateStr);
|
|
return Math.floor((d.getTime() - EPOCH.getTime()) / 86400000);
|
|
};
|
|
|
|
// get current date_index
|
|
export const todayIndex = (): number => {
|
|
const now = new Date();
|
|
now.setHours(0, 0, 0, 0);
|
|
return Math.floor((now.getTime() - EPOCH.getTime()) / 86400000);
|
|
};
|