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
Branches
Tags
2 merge requests!26Revert "Funciona register",!20Fix/monolith arquitecture
Showing
with 141 additions and 55 deletions
...@@ -2,3 +2,4 @@ ...@@ -2,3 +2,4 @@
taller taller
*.pdf *.pdf
**/target/ **/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.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; 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.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
......
package com.uva.hotelService.Exceptions; package com.uva.monolith.exceptions;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
......
package com.uva.users.Exceptions; package com.uva.monolith.exceptions;
public class InvalidDateRangeException extends RuntimeException { public class InvalidDateRangeException extends RuntimeException {
public InvalidDateRangeException(String message) { public InvalidDateRangeException(String message) {
super(message); super(message);
} }
} }
package com.uva.bookings.Exceptions; package com.uva.monolith.exceptions;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.ResponseStatus;
......
// BookingController.java // BookingController.java
package com.uva.roomBooking.Controllers; package com.uva.monolith.services.bookings.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;
import jakarta.transaction.Transactional; import jakarta.transaction.Transactional;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*; 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; import java.util.List;
@RestController @RestController
...@@ -33,9 +33,29 @@ public class BookingController { ...@@ -33,9 +33,29 @@ public class BookingController {
this.roomRepository = roomRepository; this.roomRepository = roomRepository;
} }
@GetMapping @GetMapping(params = { "start", "end", "roomId" })
public List<Booking> getAllBookings() { public List<Booking> getAllBookings(
return bookingRepository.findAll(); @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 @PostMapping
......
package com.uva.roomBooking.Models; package com.uva.monolith.services.bookings.models;
import jakarta.persistence.Basic; import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
...@@ -13,6 +13,9 @@ import jakarta.persistence.ManyToOne; ...@@ -13,6 +13,9 @@ import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table; import jakarta.persistence.Table;
import java.time.LocalDate; import java.time.LocalDate;
import com.uva.monolith.services.hotels.models.Room;
import com.uva.monolith.services.users.models.User;
@Entity @Entity
@Table(name = "bookings") @Table(name = "bookings")
public class Booking { public class Booking {
......
// BookingRepository.java // BookingRepository.java
package com.uva.roomBooking.Repositories; package com.uva.monolith.services.bookings.repositories;
import com.uva.roomBooking.Models.Booking;
import jakarta.transaction.Transactional; import jakarta.transaction.Transactional;
...@@ -13,7 +11,15 @@ import org.springframework.data.jpa.repository.Modifying; ...@@ -13,7 +11,15 @@ import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param; import org.springframework.data.repository.query.Param;
import com.uva.monolith.services.bookings.models.Booking;
public interface BookingRepository extends JpaRepository<Booking, Integer> { 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") @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, 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.List;
import java.util.Map; import java.util.Map;
import java.time.LocalDate; 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.HttpStatus;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; 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 @RestController
@RequestMapping("hotels") @RequestMapping("hotels")
@CrossOrigin(origins = "*") @CrossOrigin(origins = "*")
......
package com.uva.roomBooking.Models; package com.uva.monolith.services.hotels.models;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
......
package com.uva.hotelService.Models; package com.uva.monolith.services.hotels.models;
import java.util.List; import java.util.List;
import jakarta.persistence.Basic; import jakarta.persistence.Basic;
......
package com.uva.roomBooking.Models; package com.uva.monolith.services.hotels.models;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonIgnore; 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.Basic;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
......
package com.uva.hotelService.Repositories; package com.uva.monolith.services.hotels.repositories;
import org.springframework.data.jpa.repository.JpaRepository; 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> { 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.JpaRepository;
import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.Query;
import com.uva.monolith.services.hotels.models.Room;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
......
package com.uva.roomBooking.Controllers; package com.uva.monolith.services.users.controllers;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.List; import java.util.List;
import java.util.Map; 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.CrossOrigin;
import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
...@@ -13,12 +15,13 @@ import org.springframework.web.bind.annotation.PostMapping; ...@@ -13,12 +15,13 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.uva.roomBooking.Models.UserStatus; import com.uva.monolith.services.bookings.models.Booking;
import com.uva.roomBooking.Models.Booking; import com.uva.monolith.services.users.models.User;
import com.uva.roomBooking.Models.User; import com.uva.monolith.services.users.models.UserStatus;
import com.uva.roomBooking.Repositories.UserRepository; import com.uva.monolith.services.users.repositories.UserRepository;
@RestController @RestController
@RequestMapping("users") @RequestMapping("users")
...@@ -35,11 +38,18 @@ public class UserController { ...@@ -35,11 +38,18 @@ public class UserController {
return userRepository.findAll(); 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 @PostMapping
public User addUser(@RequestBody User user) { public User addUser(@RequestBody User user) {
// TODO revisar como se desea manejar estado por defecto
user.setStatus(UserStatus.NO_BOOKINGS); user.setStatus(UserStatus.NO_BOOKINGS);
// Aunque se asegure a lo mejor no es la forma de manejo esperada
return userRepository.save(user); return userRepository.save(user);
} }
......
package com.uva.hotelService.Models; package com.uva.monolith.services.users.models;
public enum Tipo { public enum Tipo {
SINGLE, SINGLE,
......
package com.uva.roomBooking.Models; package com.uva.monolith.services.users.models;
import java.time.LocalDate;
import java.util.List; import java.util.List;
import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonIgnore;
import com.uva.monolith.services.bookings.models.Booking;
import jakarta.persistence.Basic; import jakarta.persistence.Basic;
import jakarta.persistence.CascadeType; import jakarta.persistence.CascadeType;
...@@ -19,6 +21,7 @@ import jakarta.persistence.Table; ...@@ -19,6 +21,7 @@ import jakarta.persistence.Table;
@Entity @Entity
@Table(name = "users") @Table(name = "users")
public class User { public class User {
// TODO extraer a dos clases hijas, una por cada tipo
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false) @Basic(optional = false)
...@@ -30,9 +33,16 @@ public class User { ...@@ -30,9 +33,16 @@ public class User {
@Basic(optional = false) @Basic(optional = false)
private String email; private String email;
@Basic(optional = false)
private String password;
@Basic(optional = false) @Basic(optional = false)
@Enumerated(EnumType.STRING) @Enumerated(EnumType.STRING)
private UserStatus status = UserStatus.NO_BOOKINGS; private UserRol rol = UserRol.CONSUMER;
@Basic(optional = false)
@Enumerated(EnumType.STRING)
private UserStatus status;
@JsonIgnore @JsonIgnore
@OneToMany(mappedBy = "userId", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @OneToMany(mappedBy = "userId", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
...@@ -41,9 +51,12 @@ public class User { ...@@ -41,9 +51,12 @@ public class User {
public 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); setId(id);
setName(name);
setEmail(email); setEmail(email);
setRol(rol);
setStatus(status); setStatus(status);
setBookings(bookings); setBookings(bookings);
} }
...@@ -72,8 +85,28 @@ public class User { ...@@ -72,8 +85,28 @@ public class User {
this.email = email; 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() { 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) { 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 register or to comment