From abf85c79ec9e3337cc1cab2911590954ddbd21a8 Mon Sep 17 00:00:00 2001 From: migudel <miguel.moras@estudiantes.uva.es> Date: Sun, 3 Nov 2024 11:24:15 +0100 Subject: [PATCH] Cambios en la estructura --- .gitignore | 3 ++ angular/RestClient/src/app/app.component.ts | 2 +- angular/RestClient/src/app/app.routes.ts | 25 +++++++----- .../booking-list/booking-list.component.css | 0 .../booking-list/booking-list.component.html | 0 .../booking-list.component.spec.ts | 0 .../booking-list/booking-list.component.ts | 8 ++-- .../bookings}/booking/booking.component.css | 0 .../bookings}/booking/booking.component.html | 0 .../booking/booking.component.spec.ts | 2 +- .../bookings}/booking/booking.component.ts | 4 +- .../hotel-list/hotel-list.component.css | 0 .../hotel-list/hotel-list.component.html | 0 .../hotel-list/hotel-list.component.spec.ts | 0 .../hotel}/hotel-list/hotel-list.component.ts | 4 +- .../hotel-register.component.css | 0 .../hotel-register.component.html | 0 .../hotel-register.component.spec.ts | 0 .../hotel-register.component.ts | 4 +- .../user}/main-page/main-page.component.css | 0 .../user}/main-page/main-page.component.html | 0 .../main-page/main-page.component.spec.ts | 0 .../user}/main-page/main-page.component.ts | 14 ++++--- .../user-booking-list.component.css | 0 .../user-booking-list.component.html | 1 + .../user-booking-list.component.spec.ts | 23 +++++++++++ .../user-booking-list.component.ts | 12 ++++++ .../navigation/navigation.component.css | 0 .../navigation/navigation.component.html | 4 +- .../navigation/navigation.component.spec.ts | 0 .../navigation/navigation.component.ts | 0 .../Controllers/UserController.java | 40 +++++++++++++------ .../com/uva/roomBooking/Models/Booking.java | 4 +- .../uva/roomBooking/Models/UserStatus.java | 1 - .../Repositories/BookingRepository.java | 3 ++ 35 files changed, 108 insertions(+), 46 deletions(-) create mode 100644 .gitignore rename angular/RestClient/src/app/{ => core/features/bookings}/booking-list/booking-list.component.css (100%) rename angular/RestClient/src/app/{ => core/features/bookings}/booking-list/booking-list.component.html (100%) rename angular/RestClient/src/app/{ => core/features/bookings}/booking-list/booking-list.component.spec.ts (100%) rename angular/RestClient/src/app/{ => core/features/bookings}/booking-list/booking-list.component.ts (87%) rename angular/RestClient/src/app/{ => core/features/bookings}/booking/booking.component.css (100%) rename angular/RestClient/src/app/{ => core/features/bookings}/booking/booking.component.html (100%) rename angular/RestClient/src/app/{ => core/features/bookings}/booking/booking.component.spec.ts (96%) rename angular/RestClient/src/app/{ => core/features/bookings}/booking/booking.component.ts (92%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-list/hotel-list.component.css (100%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-list/hotel-list.component.html (100%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-list/hotel-list.component.spec.ts (100%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-list/hotel-list.component.ts (95%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-register/hotel-register.component.css (100%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-register/hotel-register.component.html (100%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-register/hotel-register.component.spec.ts (100%) rename angular/RestClient/src/app/{ => core/features/hotel}/hotel-register/hotel-register.component.ts (96%) rename angular/RestClient/src/app/{ => core/features/user}/main-page/main-page.component.css (100%) rename angular/RestClient/src/app/{ => core/features/user}/main-page/main-page.component.html (100%) rename angular/RestClient/src/app/{ => core/features/user}/main-page/main-page.component.spec.ts (100%) rename angular/RestClient/src/app/{ => core/features/user}/main-page/main-page.component.ts (69%) create mode 100644 angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.css create mode 100644 angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.html create mode 100644 angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.spec.ts create mode 100644 angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.ts rename angular/RestClient/src/app/{ => core}/navigation/navigation.component.css (100%) rename angular/RestClient/src/app/{ => core}/navigation/navigation.component.html (58%) rename angular/RestClient/src/app/{ => core}/navigation/navigation.component.spec.ts (100%) rename angular/RestClient/src/app/{ => core}/navigation/navigation.component.ts (100%) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..103bd2c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +### Own ### +taller +*.pdf \ No newline at end of file diff --git a/angular/RestClient/src/app/app.component.ts b/angular/RestClient/src/app/app.component.ts index 5584345..f6060ec 100644 --- a/angular/RestClient/src/app/app.component.ts +++ b/angular/RestClient/src/app/app.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { RouterOutlet } from '@angular/router'; -import { NavigationComponent } from './navigation/navigation.component'; +import { NavigationComponent } from './core/navigation/navigation.component'; @Component({ selector: 'app-root', diff --git a/angular/RestClient/src/app/app.routes.ts b/angular/RestClient/src/app/app.routes.ts index 58c8baf..b8ee77b 100644 --- a/angular/RestClient/src/app/app.routes.ts +++ b/angular/RestClient/src/app/app.routes.ts @@ -1,9 +1,10 @@ import { Routes } from '@angular/router'; -import { HotelListComponent } from './hotel-list/hotel-list.component'; -import { BookingComponent } from './booking/booking.component'; -import { BookingListComponent } from './booking-list/booking-list.component'; -import { HotelRegisterComponent } from './hotel-register/hotel-register.component'; -import { MainPageComponent } from './main-page/main-page.component'; +import { HotelListComponent } from './core/features/hotel/hotel-list/hotel-list.component'; +import { BookingComponent } from './core/features/bookings/booking/booking.component'; +import { HotelRegisterComponent } from './core/features/hotel/hotel-register/hotel-register.component'; +import { MainPageComponent } from './core/features/user/main-page/main-page.component'; +import { BookingListComponent } from './core/features/bookings/booking-list/booking-list.component'; +import { UserBookingListComponent } from './core/features/user/user-booking-list/user-booking-list.component'; export const routes: Routes = [ { @@ -11,9 +12,17 @@ export const routes: Routes = [ component: MainPageComponent, // Componente de la página principal }, { - path: 'booking/search', + path: 'bookings/search', component: BookingListComponent, }, + { + path: 'bookings/new', + component: BookingComponent, + }, + { + path: 'users/:id/bookings', + component: UserBookingListComponent, + }, { path: 'hotels', component: HotelListComponent, @@ -26,10 +35,6 @@ export const routes: Routes = [ path: 'hotels/:id', component: HotelRegisterComponent, }, - { - path: 'booking', // Añade la ruta para el componente de reservas - component: BookingComponent, - }, { path: '**', redirectTo: '', diff --git a/angular/RestClient/src/app/booking-list/booking-list.component.css b/angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.css similarity index 100% rename from angular/RestClient/src/app/booking-list/booking-list.component.css rename to angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.css diff --git a/angular/RestClient/src/app/booking-list/booking-list.component.html b/angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.html similarity index 100% rename from angular/RestClient/src/app/booking-list/booking-list.component.html rename to angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.html diff --git a/angular/RestClient/src/app/booking-list/booking-list.component.spec.ts b/angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.spec.ts similarity index 100% rename from angular/RestClient/src/app/booking-list/booking-list.component.spec.ts rename to angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.spec.ts diff --git a/angular/RestClient/src/app/booking-list/booking-list.component.ts b/angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.ts similarity index 87% rename from angular/RestClient/src/app/booking-list/booking-list.component.ts rename to angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.ts index 27e093f..298f8ee 100644 --- a/angular/RestClient/src/app/booking-list/booking-list.component.ts +++ b/angular/RestClient/src/app/core/features/bookings/booking-list/booking-list.component.ts @@ -7,10 +7,11 @@ import { import { FormsModule } from '@angular/forms'; import { MatInputModule } from '@angular/material/input'; import { MatSelectModule } from '@angular/material/select'; -import { Hotel, Room, RoomType, roomTypeArray } from '../../types'; -import { ClienteApiRestService } from '../shared/cliente-api-rest.service'; +import { Hotel, Room, RoomType, roomTypeArray } from '../../../../../types'; + import { Router } from '@angular/router'; import { MatCard, MatCardModule } from '@angular/material/card'; +import { ClienteApiRestService } from '../../../../shared/cliente-api-rest.service'; type SelectableRoomType = 'All' | RoomType; const selectableRoomTypeArray: SelectableRoomType[] = ['All', ...roomTypeArray]; @@ -89,6 +90,7 @@ export class BookingListComponent { } bookingRoom(roomId: number) { - this.router.navigate(['/booking'], { queryParams: { roomId } }); + // TODO plantear si se quiere mantener el query param o el rest param + this.router.navigate(['/bookings', 'new'], { queryParams: { roomId } }); } } diff --git a/angular/RestClient/src/app/booking/booking.component.css b/angular/RestClient/src/app/core/features/bookings/booking/booking.component.css similarity index 100% rename from angular/RestClient/src/app/booking/booking.component.css rename to angular/RestClient/src/app/core/features/bookings/booking/booking.component.css diff --git a/angular/RestClient/src/app/booking/booking.component.html b/angular/RestClient/src/app/core/features/bookings/booking/booking.component.html similarity index 100% rename from angular/RestClient/src/app/booking/booking.component.html rename to angular/RestClient/src/app/core/features/bookings/booking/booking.component.html diff --git a/angular/RestClient/src/app/booking/booking.component.spec.ts b/angular/RestClient/src/app/core/features/bookings/booking/booking.component.spec.ts similarity index 96% rename from angular/RestClient/src/app/booking/booking.component.spec.ts rename to angular/RestClient/src/app/core/features/bookings/booking/booking.component.spec.ts index 486d21f..5cfaef6 100644 --- a/angular/RestClient/src/app/booking/booking.component.spec.ts +++ b/angular/RestClient/src/app/core/features/bookings/booking/booking.component.spec.ts @@ -1,7 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { BookingComponent } from './booking.component'; -import { BookingService } from '../shared/booking.service'; +import { BookingService } from '../../../../shared/booking.service'; import { of } from 'rxjs'; class MockBookingService { diff --git a/angular/RestClient/src/app/booking/booking.component.ts b/angular/RestClient/src/app/core/features/bookings/booking/booking.component.ts similarity index 92% rename from angular/RestClient/src/app/booking/booking.component.ts rename to angular/RestClient/src/app/core/features/bookings/booking/booking.component.ts index ff85d89..803417a 100644 --- a/angular/RestClient/src/app/booking/booking.component.ts +++ b/angular/RestClient/src/app/core/features/bookings/booking/booking.component.ts @@ -6,9 +6,9 @@ import { Validators, } from '@angular/forms'; -import { BookingService } from '../shared/booking.service'; // Asegúrate de que el servicio exista +import { BookingService } from '../../../../shared/booking.service'; // Asegúrate de que el servicio exista import { ActivatedRoute } from '@angular/router'; -import { Booking } from '../../types'; +import { Booking } from '../../../../../types'; @Component({ standalone: true, diff --git a/angular/RestClient/src/app/hotel-list/hotel-list.component.css b/angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.css similarity index 100% rename from angular/RestClient/src/app/hotel-list/hotel-list.component.css rename to angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.css diff --git a/angular/RestClient/src/app/hotel-list/hotel-list.component.html b/angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.html similarity index 100% rename from angular/RestClient/src/app/hotel-list/hotel-list.component.html rename to angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.html diff --git a/angular/RestClient/src/app/hotel-list/hotel-list.component.spec.ts b/angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.spec.ts similarity index 100% rename from angular/RestClient/src/app/hotel-list/hotel-list.component.spec.ts rename to angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.spec.ts diff --git a/angular/RestClient/src/app/hotel-list/hotel-list.component.ts b/angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.ts similarity index 95% rename from angular/RestClient/src/app/hotel-list/hotel-list.component.ts rename to angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.ts index 866f745..bdd87d3 100644 --- a/angular/RestClient/src/app/hotel-list/hotel-list.component.ts +++ b/angular/RestClient/src/app/core/features/hotel/hotel-list/hotel-list.component.ts @@ -1,6 +1,6 @@ import { Component } from '@angular/core'; import { RouterModule, Router } from '@angular/router'; -import { Hotel } from '../../types'; +import { Hotel } from '../../../../../types'; import { MatAccordion, MatExpansionPanel, @@ -12,7 +12,7 @@ import { MatSlideToggle } from '@angular/material/slide-toggle'; import { MatTable, MatTableModule } from '@angular/material/table'; import { MatButton } from '@angular/material/button'; import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; -import { ClienteApiRestService } from '../shared/cliente-api-rest.service'; +import { ClienteApiRestService } from '../../../../shared/cliente-api-rest.service'; @Component({ selector: 'app-hotel-list', diff --git a/angular/RestClient/src/app/hotel-register/hotel-register.component.css b/angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.css similarity index 100% rename from angular/RestClient/src/app/hotel-register/hotel-register.component.css rename to angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.css diff --git a/angular/RestClient/src/app/hotel-register/hotel-register.component.html b/angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.html similarity index 100% rename from angular/RestClient/src/app/hotel-register/hotel-register.component.html rename to angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.html diff --git a/angular/RestClient/src/app/hotel-register/hotel-register.component.spec.ts b/angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.spec.ts similarity index 100% rename from angular/RestClient/src/app/hotel-register/hotel-register.component.spec.ts rename to angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.spec.ts diff --git a/angular/RestClient/src/app/hotel-register/hotel-register.component.ts b/angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.ts similarity index 96% rename from angular/RestClient/src/app/hotel-register/hotel-register.component.ts rename to angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.ts index da35653..fd09a25 100644 --- a/angular/RestClient/src/app/hotel-register/hotel-register.component.ts +++ b/angular/RestClient/src/app/core/features/hotel/hotel-register/hotel-register.component.ts @@ -13,8 +13,8 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; import { CommonModule } from '@angular/common'; -import { ClienteApiRestService } from '../shared/cliente-api-rest.service'; -import { Address, Hotel, Room } from '../../types'; +import { ClienteApiRestService } from '../../../../shared/cliente-api-rest.service'; +import { Address, Hotel, Room } from '../../../../../types'; import { ActivatedRoute, Router } from '@angular/router'; const emptyRoom: Room = { diff --git a/angular/RestClient/src/app/main-page/main-page.component.css b/angular/RestClient/src/app/core/features/user/main-page/main-page.component.css similarity index 100% rename from angular/RestClient/src/app/main-page/main-page.component.css rename to angular/RestClient/src/app/core/features/user/main-page/main-page.component.css diff --git a/angular/RestClient/src/app/main-page/main-page.component.html b/angular/RestClient/src/app/core/features/user/main-page/main-page.component.html similarity index 100% rename from angular/RestClient/src/app/main-page/main-page.component.html rename to angular/RestClient/src/app/core/features/user/main-page/main-page.component.html diff --git a/angular/RestClient/src/app/main-page/main-page.component.spec.ts b/angular/RestClient/src/app/core/features/user/main-page/main-page.component.spec.ts similarity index 100% rename from angular/RestClient/src/app/main-page/main-page.component.spec.ts rename to angular/RestClient/src/app/core/features/user/main-page/main-page.component.spec.ts diff --git a/angular/RestClient/src/app/main-page/main-page.component.ts b/angular/RestClient/src/app/core/features/user/main-page/main-page.component.ts similarity index 69% rename from angular/RestClient/src/app/main-page/main-page.component.ts rename to angular/RestClient/src/app/core/features/user/main-page/main-page.component.ts index 1e34339..4d31d5f 100644 --- a/angular/RestClient/src/app/main-page/main-page.component.ts +++ b/angular/RestClient/src/app/core/features/user/main-page/main-page.component.ts @@ -1,16 +1,16 @@ // main-page.component.ts import { Component, OnInit } from '@angular/core'; -import { ClienteApiRestService } from '../shared/cliente-api-rest.service'; -import { User } from '../../types'; +import { ClienteApiRestService } from '../../../../shared/cliente-api-rest.service'; +import { User } from '../../../../../types'; import { FormsModule } from '@angular/forms'; import { CommonModule } from '@angular/common'; -import users from '../../mocks/users.json'; +import users from '../../../../../mocks/users.json'; @Component({ standalone: true, imports: [FormsModule, CommonModule], selector: 'app-main-page', templateUrl: './main-page.component.html', - styleUrls: ['./main-page.component.css'] + styleUrls: ['./main-page.component.css'], }) export class MainPageComponent implements OnInit { users: User[] = []; @@ -20,7 +20,7 @@ export class MainPageComponent implements OnInit { constructor(private ClienteApiRestService: ClienteApiRestService) {} ngOnInit(): void { - this.users = (users as unknown as User[]); + this.users = users as unknown as User[]; this.ClienteApiRestService.getAllUsers().subscribe((data: User[]) => { this.users = data; this.filteredUsers = data; // Inicialmente, muestra todos los usuarios @@ -31,7 +31,9 @@ export class MainPageComponent implements OnInit { if (this.selectedStatus === 'all') { this.filteredUsers = this.users; } else { - this.filteredUsers = this.users.filter(user => user.status === this.selectedStatus); + this.filteredUsers = this.users.filter( + (user) => user.status === this.selectedStatus + ); } } } diff --git a/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.css b/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.css new file mode 100644 index 0000000..e69de29 diff --git a/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.html b/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.html new file mode 100644 index 0000000..75ada56 --- /dev/null +++ b/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.html @@ -0,0 +1 @@ +<p>user-booking-list works!</p> diff --git a/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.spec.ts b/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.spec.ts new file mode 100644 index 0000000..aae5d91 --- /dev/null +++ b/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { UserBookingListComponent } from './user-booking-list.component'; + +describe('UserBookingListComponent', () => { + let component: UserBookingListComponent; + let fixture: ComponentFixture<UserBookingListComponent>; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [UserBookingListComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(UserBookingListComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.ts b/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.ts new file mode 100644 index 0000000..568e58c --- /dev/null +++ b/angular/RestClient/src/app/core/features/user/user-booking-list/user-booking-list.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-user-booking-list', + standalone: true, + imports: [], + templateUrl: './user-booking-list.component.html', + styleUrl: './user-booking-list.component.css' +}) +export class UserBookingListComponent { + +} diff --git a/angular/RestClient/src/app/navigation/navigation.component.css b/angular/RestClient/src/app/core/navigation/navigation.component.css similarity index 100% rename from angular/RestClient/src/app/navigation/navigation.component.css rename to angular/RestClient/src/app/core/navigation/navigation.component.css diff --git a/angular/RestClient/src/app/navigation/navigation.component.html b/angular/RestClient/src/app/core/navigation/navigation.component.html similarity index 58% rename from angular/RestClient/src/app/navigation/navigation.component.html rename to angular/RestClient/src/app/core/navigation/navigation.component.html index e2433be..6361546 100644 --- a/angular/RestClient/src/app/navigation/navigation.component.html +++ b/angular/RestClient/src/app/core/navigation/navigation.component.html @@ -1,12 +1,12 @@ <nav> <ul> - <li><a class="btn" [routerLink]="['/']">Home</a></li> + <li><a class="btn" [routerLink]="['/']">Home - Usuarios</a></li> <li> <a class="btn" [routerLink]="['/hotels', 'new']">Registrar Hotel</a> </li> <li><a class="btn" [routerLink]="['/hotels']">Hoteles</a></li> <li> - <a class="btn" [routerLink]="['/booking', 'search']">Nueva Reserva</a> + <a class="btn" [routerLink]="['/bookings', 'search']">Nueva Reserva</a> </li> </ul> </nav> diff --git a/angular/RestClient/src/app/navigation/navigation.component.spec.ts b/angular/RestClient/src/app/core/navigation/navigation.component.spec.ts similarity index 100% rename from angular/RestClient/src/app/navigation/navigation.component.spec.ts rename to angular/RestClient/src/app/core/navigation/navigation.component.spec.ts diff --git a/angular/RestClient/src/app/navigation/navigation.component.ts b/angular/RestClient/src/app/core/navigation/navigation.component.ts similarity index 100% rename from angular/RestClient/src/app/navigation/navigation.component.ts rename to angular/RestClient/src/app/core/navigation/navigation.component.ts diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/UserController.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/UserController.java index 5972838..a2e8961 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/UserController.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Controllers/UserController.java @@ -15,22 +15,26 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.uva.roomBooking.Models.UserStatus; +import com.uva.roomBooking.Models.Booking; import com.uva.roomBooking.Models.User; +import com.uva.roomBooking.Repositories.BookingRepository; import com.uva.roomBooking.Repositories.UserRepository; @RestController @RequestMapping("users") @CrossOrigin(origins = "*") public class UserController { - private final UserRepository repository; + private final UserRepository userRepository; + private final BookingRepository bookingRepository; - public UserController(UserRepository repository) { - this.repository = repository; + public UserController(UserRepository userRepository, BookingRepository bookingRepository) { + this.userRepository = userRepository; + this.bookingRepository = bookingRepository; } @GetMapping public List<User> getAllUsers() { - return repository.findAll(); + return userRepository.findAll(); } @PostMapping @@ -38,29 +42,29 @@ public class UserController { // TODO revisar como se desea manejar estado por defecto user.setStatus(UserStatus.NO_BOOKINGS); // Aunque se asegure a lo mejor no es la forma de manejo esperada - return repository.save(user); + return userRepository.save(user); } @GetMapping("/{id}") public User getUserById(@PathVariable int id) { - return repository.findById(id).orElseThrow(); + return userRepository.findById(id).orElseThrow(); } @PutMapping("/{id}") public User updateUserData(@PathVariable int id, @RequestBody Map<String, String> json) { - User target = repository.findById(id).orElseThrow(); + User target = userRepository.findById(id).orElseThrow(); if (!json.containsKey("name") || !json.containsKey("email")) { // TODO cambiar manejo throw new RuntimeException("Missing required fields"); } target.setName(json.get("name")); target.setEmail(json.get("email")); - return repository.save(target); + return userRepository.save(target); } @PatchMapping("/{id}") public User updateUserState(@PathVariable int id, @RequestBody Map<String, String> json) { - User target = repository.findById(id).orElseThrow(); + User target = userRepository.findById(id).orElseThrow(); String strStatus = json.get("status"); if (strStatus == null) { // TODO cambiar manejo @@ -68,25 +72,35 @@ public class UserController { } UserStatus userStatus = UserStatus.valueOf(strStatus); switch (userStatus) { + // TODO Buscar como validar las (in)active bookings case NO_BOOKINGS: if (!target.getBookings().isEmpty()) throw new IllegalArgumentException("Invalid State: The user have at least one booking"); case WITH_ACTIVE_BOOKINGS: + if (target.getBookings().isEmpty()) + throw new IllegalArgumentException("Invalid State: The user don't have bookings"); case WITH_INACTIVE_BOOKINGS: - // TODO + if (target.getBookings().isEmpty()) + throw new IllegalArgumentException("Invalid State: The user don't have bookings"); default: break; } target.setStatus(userStatus); - return repository.save(target); + return userRepository.save(target); } @DeleteMapping("/{id}") public User deleteUser(@PathVariable Integer id) { User target; - if ((target = repository.findById(id).orElseThrow()) != null) { - repository.deleteById(id); + if ((target = userRepository.findById(id).orElseThrow()) != null) { + userRepository.deleteById(id); } return target; } + + @GetMapping("/{id}/bookings") + public List<Booking> getUserBookingsById(@PathVariable int id) { + User user = userRepository.findById(id).orElseThrow(); + return bookingRepository.findByUserId(user); + } } 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 86a712f..c546d19 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 @@ -1,7 +1,5 @@ package com.uva.roomBooking.Models; -import java.util.Date; - import jakarta.persistence.Basic; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -20,8 +18,8 @@ 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") @ManyToOne(optional = false, fetch = FetchType.EAGER, cascade = CascadeType.MERGE) private User userId; diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Models/UserStatus.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Models/UserStatus.java index 0a766e8..41adce4 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Models/UserStatus.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Models/UserStatus.java @@ -1,6 +1,5 @@ package com.uva.roomBooking.Models; -// TODO Esto posiblemente requiera otro tratamiento debido al convenio de formato de constantes en db-java public enum UserStatus { NO_BOOKINGS, WITH_ACTIVE_BOOKINGS, WITH_INACTIVE_BOOKINGS; } diff --git a/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/BookingRepository.java b/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/BookingRepository.java index a010a3a..d988f40 100644 --- a/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/BookingRepository.java +++ b/java/roomBooking/src/main/java/com/uva/roomBooking/Repositories/BookingRepository.java @@ -2,6 +2,7 @@ package com.uva.roomBooking.Repositories; import com.uva.roomBooking.Models.Booking; +import com.uva.roomBooking.Models.User; import java.time.LocalDate; import java.util.List; @@ -12,6 +13,8 @@ import org.springframework.data.repository.query.Param; public interface BookingRepository extends JpaRepository<Booking, Integer> { + List<Booking> findByUserId(User userId); + @Query("SELECT b FROM Booking b WHERE b.roomId.id = ?1 AND b.startDate < ?2 AND b.endDate > ?3") List<Booking> findByRoomIdAndDateRange(@Param("roomId") int roomId, @Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate); -- GitLab