Implement Sirvoy booking services

This commit is contained in:
gpt-engineer-app[bot]
2025-09-25 18:25:37 +00:00
parent 557f8bdd77
commit 576d7dd711
5 changed files with 998 additions and 4 deletions

View File

@@ -0,0 +1,210 @@
import { API_CONFIG } from '@/config/api';
// Extend API configuration for Channel Manager
export const CHANNEL_MANAGER_API = {
...API_CONFIG,
ENDPOINTS: {
...API_CONFIG.ENDPOINTS,
// Listings Management
LISTINGS: '/listings',
LISTING_DETAIL: '/listings/:id',
// Channel Management
CHANNELS: '/channels',
CHANNEL_CONNECT: '/channels/connect',
CHANNEL_DISCONNECT: '/channels/:id/disconnect',
CHANNEL_SYNC: '/channels/:id/sync',
// Reservations (multi-type)
RESERVATIONS: '/reservations',
RESERVATION_DETAIL: '/reservations/:id',
CREATE_RESERVATION: '/reservations',
UPDATE_RESERVATION: '/reservations/:id',
CANCEL_RESERVATION: '/reservations/:id/cancel',
// Hotels
HOTELS: '/hotels',
HOTEL_ROOMS: '/hotels/:id/rooms',
HOTEL_AVAILABILITY: '/hotels/:id/availability',
HOTEL_RATES: '/hotels/:id/rates',
// Restaurants
RESTAURANTS: '/restaurants',
RESTAURANT_TABLES: '/restaurants/:id/tables',
RESTAURANT_AVAILABILITY: '/restaurants/:id/availability',
RESTAURANT_MENU: '/restaurants/:id/menu',
// Vehicles
VEHICLES: '/vehicles',
VEHICLE_AVAILABILITY: '/vehicles/:id/availability',
VEHICLE_RATES: '/vehicles/:id/rates',
// Flights
FLIGHTS: '/flights',
FLIGHT_SEARCH: '/flights/search',
FLIGHT_BOOKING: '/flights/book',
// Itineraries
ITINERARIES: '/itineraries',
ITINERARY_DETAIL: '/itineraries/:id',
// Analytics & Reports
ANALYTICS: '/analytics',
REVENUE_REPORTS: '/analytics/revenue',
OCCUPANCY_REPORTS: '/analytics/occupancy',
CHANNEL_PERFORMANCE: '/analytics/channels',
}
};
// Channel Manager Service
export class ChannelManagerService {
private static async request(endpoint: string, options: RequestInit = {}) {
const token = localStorage.getItem('auth_token');
// Create AbortController for timeout functionality
const controller = new AbortController();
const timeoutId = setTimeout(() => controller.abort(), CHANNEL_MANAGER_API.TIMEOUT);
const response = await fetch(`${CHANNEL_MANAGER_API.BASE_URL}${endpoint}`, {
...options,
headers: {
...CHANNEL_MANAGER_API.DEFAULT_HEADERS,
...(token && { Authorization: `Bearer ${token}` }),
...options.headers,
},
signal: controller.signal,
});
clearTimeout(timeoutId);
if (!response.ok) {
throw new Error(`API Error: ${response.status} ${response.statusText}`);
}
// Handle 204 No Content responses
if (response.status === 204) {
return null;
}
return await response.json();
}
// Listings Management
static getListings = (type?: string) =>
this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.LISTINGS}${type ? `?type=${type}` : ''}`);
static getListingDetail = (id: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.LISTING_DETAIL.replace(':id', id));
static createListing = (data: any) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.LISTINGS, {
method: 'POST',
body: JSON.stringify(data),
});
static updateListing = (id: string, data: any) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.LISTING_DETAIL.replace(':id', id), {
method: 'PUT',
body: JSON.stringify(data),
});
static deleteListing = (id: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.LISTING_DETAIL.replace(':id', id), {
method: 'DELETE',
});
// Channel Management
static getChannels = () =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.CHANNELS);
static connectChannel = (channelData: any) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.CHANNEL_CONNECT, {
method: 'POST',
body: JSON.stringify(channelData),
});
static disconnectChannel = (channelId: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.CHANNEL_DISCONNECT.replace(':id', channelId), {
method: 'DELETE',
});
static syncChannel = (channelId: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.CHANNEL_SYNC.replace(':id', channelId), {
method: 'POST',
});
// Reservations Management
static getReservations = (filters?: any) => {
const queryParams = filters
? '?' + new URLSearchParams(filters).toString()
: '';
return this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.RESERVATIONS}${queryParams}`);
};
static getReservationDetail = (id: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.RESERVATION_DETAIL.replace(':id', id));
static createReservation = (data: any) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.CREATE_RESERVATION, {
method: 'POST',
body: JSON.stringify(data),
});
static updateReservation = (id: string, data: any) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.UPDATE_RESERVATION.replace(':id', id), {
method: 'PUT',
body: JSON.stringify(data),
});
static cancelReservation = (id: string, reason?: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.CANCEL_RESERVATION.replace(':id', id), {
method: 'POST',
body: JSON.stringify({ reason }),
});
// Hotel specific methods
static getHotelRooms = (hotelId: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.HOTEL_ROOMS.replace(':id', hotelId));
static getHotelAvailability = (hotelId: string, dateRange: { startDate: string; endDate: string }) =>
this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.HOTEL_AVAILABILITY.replace(':id', hotelId)}?${new URLSearchParams(dateRange)}`);
static updateHotelRates = (hotelId: string, rates: any) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.HOTEL_RATES.replace(':id', hotelId), {
method: 'PUT',
body: JSON.stringify(rates),
});
// Restaurant specific methods
static getRestaurantTables = (restaurantId: string) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.RESTAURANT_TABLES.replace(':id', restaurantId));
static getRestaurantAvailability = (restaurantId: string, date: string) =>
this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.RESTAURANT_AVAILABILITY.replace(':id', restaurantId)}?date=${date}`);
// Vehicle specific methods
static getVehicleAvailability = (vehicleId: string, dateRange: { startDate: string; endDate: string }) =>
this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.VEHICLE_AVAILABILITY.replace(':id', vehicleId)}?${new URLSearchParams(dateRange)}`);
// Flight methods
static searchFlights = (searchParams: any) =>
this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.FLIGHT_SEARCH}?${new URLSearchParams(searchParams)}`);
static bookFlight = (bookingData: any) =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.FLIGHT_BOOKING, {
method: 'POST',
body: JSON.stringify(bookingData),
});
// Analytics methods
static getAnalytics = (type: string, dateRange: { startDate: string; endDate: string }) =>
this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.ANALYTICS}/${type}?${new URLSearchParams(dateRange)}`);
static getRevenueReports = (dateRange: { startDate: string; endDate: string }) =>
this.request(`${CHANNEL_MANAGER_API.ENDPOINTS.REVENUE_REPORTS}?${new URLSearchParams(dateRange)}`);
static getChannelPerformance = () =>
this.request(CHANNEL_MANAGER_API.ENDPOINTS.CHANNEL_PERFORMANCE);
}
export default ChannelManagerService;