Files
Hotel-Booking/Frontend/src/services/api/roomService.ts
Iliyan Angelov a1bd576540 updates
2025-11-17 23:50:14 +02:00

223 lines
4.6 KiB
TypeScript

import apiClient from './apiClient';
/**
* Room API Service
*/
export interface Room {
id: number;
room_type_id: number;
room_number: string;
floor: number;
status: 'available' | 'occupied' | 'maintenance';
featured: boolean;
price?: number;
description?: string;
capacity?: number;
room_size?: string;
view?: string;
images?: string[];
amenities?: string[];
created_at: string;
updated_at: string;
room_type?: {
id: number;
name: string;
description: string;
base_price: number;
capacity: number;
amenities: string[];
images: string[];
};
average_rating?: number | string | null;
total_reviews?: number | string | null;
}
export interface RoomListResponse {
success: boolean;
status?: string;
data: {
rooms: Room[];
pagination?: {
total: number;
page: number;
limit: number;
totalPages: number;
};
};
message?: string;
}
export interface FeaturedRoomsParams {
featured?: boolean;
limit?: number;
}
export interface RoomSearchParams {
type?: string;
minPrice?: number;
maxPrice?: number;
capacity?: number;
page?: number;
limit?: number;
sort?: string;
}
/**
* Get featured rooms for homepage
*/
export const getFeaturedRooms = async (
params: FeaturedRoomsParams = {}
): Promise<RoomListResponse> => {
const response = await apiClient.get('/rooms', {
params: {
featured: params.featured ?? true,
limit: params.limit ?? 6,
},
});
return response.data;
};
/**
* Get all rooms with filters
*/
export const getRooms = async (
params: RoomSearchParams = {}
): Promise<RoomListResponse> => {
const response = await apiClient.get('/rooms', {
params,
});
return response.data;
};
/**
* Get room by ID (deprecated - use getRoomByNumber instead)
*/
export const getRoomById = async (
id: number
): Promise<{ success: boolean; data: { room: Room } }> => {
const response = await apiClient.get(`/rooms/id/${id}`);
return response.data;
};
/**
* Get booked dates for a specific room
*/
export const getRoomBookedDates = async (
roomId: number
): Promise<{ success: boolean; data: { room_id: number; booked_dates: string[] } }> => {
const response = await apiClient.get(`/rooms/${roomId}/booked-dates`);
return response.data;
};
/**
* Get room by room number
*/
export const getRoomByNumber = async (
room_number: string
): Promise<{ success: boolean; data: { room: Room } }> => {
const response = await apiClient.get(`/rooms/${room_number}`);
return response.data;
};
/**
* Search available rooms
*/
export interface AvailableSearchParams {
from: string;
to: string;
type?: string;
capacity?: number;
page?: number;
limit?: number;
}
export const searchAvailableRooms = async (
params: AvailableSearchParams
): Promise<RoomListResponse> => {
const response = await apiClient.get('/rooms/available', {
params,
});
return response.data;
};
/**
* Get available amenities list (unique)
*/
export const getAmenities = async (): Promise<{
success?: boolean;
status?: string;
data: { amenities: string[] };
}> => {
const response = await apiClient.get('/rooms/amenities');
return response.data;
};
/**
* Create new room
*/
export interface CreateRoomData {
room_number: string;
floor: number;
room_type_id: number;
status: 'available' | 'occupied' | 'maintenance';
featured?: boolean;
price?: number;
description?: string;
capacity?: number;
room_size?: string;
view?: string;
amenities?: string[];
}
export const createRoom = async (
data: CreateRoomData
): Promise<{ success: boolean; data: { room: Room }; message: string }> => {
const response = await apiClient.post('/rooms', data);
return response.data;
};
/**
* Update room
*/
export const updateRoom = async (
id: number,
data: Partial<CreateRoomData>
): Promise<{ success: boolean; data: { room: Room }; message: string }> => {
const response = await apiClient.put(`/rooms/${id}`, data);
return response.data;
};
/**
* Delete room
*/
export const deleteRoom = async (
id: number
): Promise<{ success: boolean; message: string }> => {
const response = await apiClient.delete(`/rooms/${id}`);
return response.data;
};
/**
* Bulk delete rooms
*/
export const bulkDeleteRooms = async (
ids: number[]
): Promise<{ success: boolean; message: string; data: { deleted_count: number; deleted_ids: number[] } }> => {
const response = await apiClient.post('/rooms/bulk-delete', { ids });
return response.data;
};
export default {
getFeaturedRooms,
getRooms,
getRoomById,
getRoomByNumber,
searchAvailableRooms,
getAmenities,
createRoom,
updateRoom,
deleteRoom,
bulkDeleteRooms,
};