Implement Sirvoy booking services
This commit is contained in:
210
src/services/channelManagerApi.ts
Normal file
210
src/services/channelManagerApi.ts
Normal 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;
|
||||
Reference in New Issue
Block a user