Skip to content
Snippets Groups Projects
Commit 2ac41e52 authored by migudel's avatar migudel :speech_balloon:
Browse files

Merge branch 'fix/monolith_arquitecture' into 'develop'

Fix/monolith arquitecture

See merge request !20
parents 23d19ea8 81673238
No related branches found
No related tags found
2 merge requests!26Revert "Funciona register",!20Fix/monolith arquitecture
Showing
with 141 additions and 55 deletions
......@@ -2,3 +2,4 @@
taller
*.pdf
**/target/
**/.vscode
\ No newline at end of file
const monolithUrl = 'http://room-booking:8080';
export const environment = {
production: true,
authAPI: 'http://auth-api:8101',
userAPI: `http://${monolithUrl}`,
hotelAPI: `http://${monolithUrl}`,
bookingAPI: `http://${monolithUrl}`,
};
package com.uva.roomBooking;
package com.uva.monolith;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
......
package com.uva.bookings.Exceptions;
package com.uva.monolith.exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
......
package com.uva.hotelService.Exceptions;
package com.uva.monolith.exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
......
package com.uva.users.Exceptions;
package com.uva.monolith.exceptions;
public class InvalidDateRangeException extends RuntimeException {
public InvalidDateRangeException(String message) {
super(message);
}
}
package com.uva.bookings.Exceptions;
package com.uva.monolith.exceptions;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus;
......
// BookingController.java
package com.uva.roomBooking.Controllers;
import com.uva.roomBooking.Models.Booking;
import com.uva.roomBooking.Models.Room;
import com.uva.roomBooking.Models.User;
import com.uva.roomBooking.Repositories.BookingRepository;
import com.uva.roomBooking.Repositories.RoomRepository;
import com.uva.roomBooking.Repositories.UserRepository;
package com.uva.monolith.services.bookings.controllers;
import jakarta.transaction.Transactional;
import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import com.uva.monolith.services.bookings.models.Booking;
import com.uva.monolith.services.bookings.repositories.BookingRepository;
import com.uva.monolith.services.hotels.models.Room;
import com.uva.monolith.services.hotels.repositories.RoomRepository;
import com.uva.monolith.services.users.models.User;
import com.uva.monolith.services.users.repositories.UserRepository;
import java.time.LocalDate;
import java.util.List;
@RestController
......@@ -33,9 +33,29 @@ public class BookingController {
this.roomRepository = roomRepository;
}
@GetMapping
public List<Booking> getAllBookings() {
return bookingRepository.findAll();
@GetMapping(params = { "start", "end", "roomId" })
public List<Booking> getAllBookings(
@RequestParam(required = false) LocalDate start,
@RequestParam(required = false) LocalDate end,
@RequestParam(required = false) Integer roomId) {
List<Booking> bookings = null;
if (start != null && end != null) {
bookings = bookingRepository.findByDateRange(start, end);
}
if (roomId != null) {
if (bookings == null) {
bookings = bookingRepository.findByRoomId(roomId);
} else {
bookings = bookings.stream()
.filter(booking -> booking.getRoomId().getId() == roomId)
.toList();
}
}
if (start == null & end == null && roomId == null) {
bookings = bookingRepository.findAll();
}
return bookings;
}
@PostMapping
......
package com.uva.roomBooking.Models;
package com.uva.monolith.services.bookings.models;
import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType;
......@@ -13,6 +13,9 @@ import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import java.time.LocalDate;
import com.uva.monolith.services.hotels.models.Room;
import com.uva.monolith.services.users.models.User;
@Entity
@Table(name = "bookings")
public class Booking {
......
// BookingRepository.java
package com.uva.roomBooking.Repositories;
import com.uva.roomBooking.Models.Booking;
package com.uva.monolith.services.bookings.repositories;
import jakarta.transaction.Transactional;
......@@ -13,7 +11,15 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.uva.monolith.services.bookings.models.Booking;
public interface BookingRepository extends JpaRepository<Booking, Integer> {
@Query("SELECT b FROM Booking b WHERE b.roomId.id = ?1")
List<Booking> findByRoomId(int roomId);
@Query("SELECT b FROM Booking b WHERE b.startDate < ?1 AND b.endDate > ?2")
List<Booking> findByDateRange(@Param("startDate") LocalDate startDate,
@Param("endDate") LocalDate endDate);
@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,
......
package com.uva.roomBooking.Controllers;
package com.uva.monolith.services.hotels.controllers;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import com.uva.roomBooking.Exceptions.HotelNotFoundException;
import com.uva.roomBooking.Exceptions.InvalidDateRangeException;
import com.uva.roomBooking.Exceptions.InvalidRequestException;
import com.uva.roomBooking.Models.Booking;
import com.uva.roomBooking.Models.Hotel;
import com.uva.roomBooking.Models.Room;
import com.uva.roomBooking.Repositories.BookingRepository;
import com.uva.roomBooking.Repositories.HotelRepository;
import com.uva.roomBooking.Repositories.RoomRepository;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import com.uva.monolith.exceptions.HotelNotFoundException;
import com.uva.monolith.exceptions.InvalidDateRangeException;
import com.uva.monolith.exceptions.InvalidRequestException;
import com.uva.monolith.services.bookings.repositories.BookingRepository;
import com.uva.monolith.services.hotels.models.Hotel;
import com.uva.monolith.services.hotels.models.Room;
import com.uva.monolith.services.hotels.repositories.HotelRepository;
import com.uva.monolith.services.hotels.repositories.RoomRepository;
@RestController
@RequestMapping("hotels")
@CrossOrigin(origins = "*")
......
package com.uva.roomBooking.Models;
package com.uva.monolith.services.hotels.models;
import com.fasterxml.jackson.annotation.JsonIgnore;
......
package com.uva.hotelService.Models;
package com.uva.monolith.services.hotels.models;
import java.util.List;
import jakarta.persistence.Basic;
......
package com.uva.roomBooking.Models;
package com.uva.monolith.services.hotels.models;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;
import com.uva.monolith.services.bookings.models.Booking;
import com.uva.monolith.services.users.models.Tipo;
import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType;
......
package com.uva.hotelService.Repositories;
package com.uva.monolith.services.hotels.repositories;
import org.springframework.data.jpa.repository.JpaRepository;
import com.uva.hotelService.Models.Hotel;
import com.uva.monolith.services.hotels.models.Hotel;
public interface HotelRepository extends JpaRepository<Hotel, Integer> {
......
package com.uva.roomBooking.Repositories;
package com.uva.monolith.services.hotels.repositories;
import com.uva.roomBooking.Models.Room;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.uva.monolith.services.hotels.models.Room;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
......
package com.uva.roomBooking.Controllers;
package com.uva.monolith.services.users.controllers;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
......@@ -13,12 +15,13 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
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.UserRepository;
import com.uva.monolith.services.bookings.models.Booking;
import com.uva.monolith.services.users.models.User;
import com.uva.monolith.services.users.models.UserStatus;
import com.uva.monolith.services.users.repositories.UserRepository;
@RestController
@RequestMapping("users")
......@@ -35,11 +38,18 @@ public class UserController {
return userRepository.findAll();
}
@GetMapping(params = { "email" })
public ResponseEntity<?> getUserByEmail(@RequestParam String email) {
try {
return new ResponseEntity<User>(userRepository.findByEmail(email).orElseThrow(), HttpStatus.ACCEPTED);
} catch (Exception e) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
}
@PostMapping
public User addUser(@RequestBody User user) {
// 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 userRepository.save(user);
}
......
package com.uva.hotelService.Models;
package com.uva.monolith.services.users.models;
public enum Tipo {
SINGLE,
......
package com.uva.roomBooking.Models;
package com.uva.monolith.services.users.models;
import java.time.LocalDate;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.uva.monolith.services.bookings.models.Booking;
import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType;
......@@ -19,6 +21,7 @@ import jakarta.persistence.Table;
@Entity
@Table(name = "users")
public class User {
// TODO extraer a dos clases hijas, una por cada tipo
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
......@@ -30,9 +33,16 @@ public class User {
@Basic(optional = false)
private String email;
@Basic(optional = false)
private String password;
@Basic(optional = false)
@Enumerated(EnumType.STRING)
private UserStatus status = UserStatus.NO_BOOKINGS;
private UserRol rol = UserRol.CONSUMER;
@Basic(optional = false)
@Enumerated(EnumType.STRING)
private UserStatus status;
@JsonIgnore
@OneToMany(mappedBy = "userId", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
......@@ -41,9 +51,12 @@ public class User {
public User() {
}
public User(int id, String name, String email, UserStatus status, List<Booking> bookings) {
public User(int id, String name, String email, String password, UserRol rol, UserStatus status,
List<Booking> bookings) {
setId(id);
setName(name);
setEmail(email);
setRol(rol);
setStatus(status);
setBookings(bookings);
}
......@@ -72,8 +85,28 @@ public class User {
this.email = email;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public UserRol getRol() {
return this.rol;
}
public void setRol(UserRol rol) {
this.rol = rol;
}
public UserStatus getStatus() {
return this.status;
if (!getBookings().isEmpty())
return UserStatus.NO_BOOKINGS;
boolean activeBookings = getBookings().stream()
.anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); // reserva >= ahora
return activeBookings ? UserStatus.WITH_ACTIVE_BOOKINGS : UserStatus.WITH_INACTIVE_BOOKINGS;
}
public void setStatus(UserStatus status) {
......
package com.uva.monolith.services.users.models;
public enum UserRol {
HOTEL_ADMIN, CONSUMER
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment