210 lines
7.2 KiB
TypeScript
210 lines
7.2 KiB
TypeScript
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; |