diff --git a/angular/RestClient/src/app/booking/booking.component.html b/angular/RestClient/src/app/booking/booking.component.html index fd958650cb24eac92fe0bf1b969561bbf117a95f..f0914574773896371534a5b70eb082ac4e8a1551 100644 --- a/angular/RestClient/src/app/booking/booking.component.html +++ b/angular/RestClient/src/app/booking/booking.component.html @@ -2,7 +2,7 @@ <h2>Crear Reserva</h2> <form [formGroup]="bookingForm" (ngSubmit)="submitBooking()"> <div class="form-group"> - <label for="userId">Usuario:</label> + <label for="userId">ID del Usuario:</label> <input type="number" id="userId" @@ -11,6 +11,16 @@ /> </div> + <div class="form-group"> + <label for="roomId">ID del Hotel:</label> + <input + type="number" + id="roomId" + formControlName="roomId" + class="form-control" + /> + </div> + <div class="form-group"> <label for="roomType">Tipo de Habitación:</label> <select id="roomType" formControlName="roomType" class="form-control"> diff --git a/angular/RestClient/src/app/booking/booking.component.ts b/angular/RestClient/src/app/booking/booking.component.ts index c9288039b0567f1cb640b66a139f7b8fc18212c7..ff85d898468a03fafcf0fc64a1c71fd9c0a8dcef 100644 --- a/angular/RestClient/src/app/booking/booking.component.ts +++ b/angular/RestClient/src/app/booking/booking.component.ts @@ -5,15 +5,10 @@ import { FormBuilder, Validators, } from '@angular/forms'; -interface BookingRequest { - userId: number; // ID del usuario que realiza la reserva - hotelId: number; // ID del hotel en el que se realiza la reserva - roomType: string; // Tipo de habitación (single, double, suite) - startDate: string; // Fecha de inicio de la reserva - endDate: string; // Fecha de fin de la reserva// Asegúrate de ajustar la ruta -} + import { BookingService } from '../shared/booking.service'; // Asegúrate de que el servicio exista import { ActivatedRoute } from '@angular/router'; +import { Booking } from '../../types'; @Component({ standalone: true, @@ -34,7 +29,7 @@ export class BookingComponent implements OnInit { // Inicialización del formulario con validaciones this.bookingForm = this.fb.group({ userId: ['', Validators.required], - hotelId: ['', Validators.required], + roomId: ['', Validators.required], roomType: ['', Validators.required], startDate: ['', Validators.required], endDate: ['', Validators.required], @@ -49,7 +44,13 @@ export class BookingComponent implements OnInit { submitBooking() { if (this.bookingForm.valid) { - const bookingRequest: BookingRequest = this.bookingForm.value; + const formValue = this.bookingForm.value; + const bookingRequest: Booking = { + ...formValue, + userId: { id: formValue.userId }, + roomId: { id: formValue.roomId }, + }; + console.warn(bookingRequest); // Llama al servicio para crear una nueva reserva this.bookingService.createBooking(bookingRequest).subscribe( diff --git a/angular/RestClient/src/app/shared/booking.service.ts b/angular/RestClient/src/app/shared/booking.service.ts index 3a4db3fc8c30952e5d240e43027138009b3ac000..fe01d96d76a876d1fd8d06b5bd02af9282475476 100644 --- a/angular/RestClient/src/app/shared/booking.service.ts +++ b/angular/RestClient/src/app/shared/booking.service.ts @@ -2,25 +2,19 @@ import { Injectable } from '@angular/core'; import { HttpClient, HttpHeaders } from '@angular/common/http'; import { Observable } from 'rxjs'; -interface BookingRequest { - userId: number; // ID del usuario que realiza la reserva - hotelId: number; // ID del hotel en el que se realiza la reserva - roomType: string; // Tipo de habitación (single, double, suite) - startDate: string; // Fecha de inicio de la reserva - endDate: string; // Fecha de fin de la reserva -} + import { Booking } from '../../types/Booking'; // Ajusta la ruta a tu modelo Booking @Injectable({ providedIn: 'root', // Esto hace que el servicio esté disponible en toda la aplicación }) export class BookingService { - private apiUrl = 'http://localhost:8080/api/bookings'; + private apiUrl = 'http://localhost:8080/bookings'; constructor(private http: HttpClient) {} // Método para crear una nueva reserva - createBooking(bookingRequest: BookingRequest): Observable<Booking> { + createBooking(bookingRequest: Booking): Observable<Booking> { return this.http.post<Booking>(this.apiUrl, bookingRequest, { headers: new HttpHeaders({ 'Content-Type': 'application/json', diff --git a/angular/RestClient/src/app/shared/cliente-api-rest.service.ts b/angular/RestClient/src/app/shared/cliente-api-rest.service.ts index 2ef2d202cba1e4b65a219472c37b5335963cfdc1..6cfa26dd890aa8b7ddc91ee5376ad4fc2c328b4f 100644 --- a/angular/RestClient/src/app/shared/cliente-api-rest.service.ts +++ b/angular/RestClient/src/app/shared/cliente-api-rest.service.ts @@ -59,9 +59,9 @@ export class ClienteApiRestService { getRoomsAvailableInDateRange(hotelId: number, start: Date, end: Date) { const startStr = start.toISOString().split('T')[0]; const endStr = end.toISOString().split('T')[0]; - return this.http.get<Room[]>( - `${ClienteApiRestService.HOTEL_URI}/${hotelId}/rooms?start=${startStr}&end=${endStr}` - ); + const url = `${ClienteApiRestService.HOTEL_URI}/${hotelId}/rooms?start=${startStr}&end=${endStr}`; + console.warn(url); + return this.http.get<Room[]>(url); } getAllUsers() { diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/BookingController.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/BookingController.java index c5bd2cbd629e28aae1a037ddbe248a507271f1dd..e3c13ce8744e73bb3259c34011ef330cf236f701 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/BookingController.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/BookingController.java @@ -40,11 +40,6 @@ public class BookingController { Room room = roomRepository.findById(booking.getRoomId().getId()) .orElseThrow(() -> new RuntimeException("Room not found")); - // Validar el tipo de habitación - if (!room.getType().equals(booking.getRoomId().getType())) { - throw new RuntimeException("Room type does not match the requested type"); - } - // Verificar disponibilidad List<Booking> existingBookings = bookingRepository.findByRoomIdAndDateRange( room.getId(), booking.getStartDate(), booking.getEndDate()); @@ -63,5 +58,4 @@ public class BookingController { bookingRepository.deleteById(id); } - } diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Models/Booking.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Models/Booking.java index c2b36c948f72392174dcf1ebdcb7c4face3303ef..86a712f8071ca5c09c2fc84b0442a09929137999 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Models/Booking.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Models/Booking.java @@ -20,7 +20,6 @@ import java.time.LocalDate; public class Booking { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - @Basic(optional = false) private int id; // TODO revisar si lo de cascade es estrictamente necesario @JoinColumn(name = "user_id", referencedColumnName = "id") diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/RoomRepository.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/RoomRepository.java index 71b439ff3db90f48caa5ed5fbea6df89d44bd02e..3df9937f1ba7dc7c8bc0aa839a7a93ffd0baa8de 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/RoomRepository.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/RoomRepository.java @@ -16,7 +16,6 @@ public interface RoomRepository extends JpaRepository<Room, Integer> { List<Room> findAllByHotelId(int hotelId); // Encontrar habitaciones disponibles de un hotel en un rango de fechas - // TODO revisar los límites en las fechas @Query(""" SELECT r FROM Room r WHERE r.hotel.id = ?1 @@ -24,7 +23,11 @@ public interface RoomRepository extends JpaRepository<Room, Integer> { AND NOT EXISTS ( SELECT b FROM Booking b WHERE b.roomId.id = r.id - AND (b.startDate < ?3 AND b.endDate > ?2) + AND ( + b.endDate > ?2 + OR + b.startDate > ?3 + ) ) """) List<Room> findAvailableRoomsByHotelAndDates(