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

Merge branch 'dev/monolith/split_services_hotel_and_user' into 'develop'

Integración de servicio usuarios

See merge request !23
parents 06f0d032 2d6f3903
No related branches found
No related tags found
2 merge requests!26Revert "Funciona register",!23Integración de servicio usuarios
package com.uva.monolith.services.users.controllers; package com.uva.monolith.services.users.controllers;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -19,15 +17,11 @@ import org.springframework.web.bind.annotation.RequestBody; ...@@ -19,15 +17,11 @@ 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.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.server.ResponseStatusException; import org.springframework.web.client.HttpClientErrorException;
import com.uva.monolith.services.bookings.models.Booking;
import com.uva.monolith.services.users.models.Client;
import com.uva.monolith.services.users.models.User; import com.uva.monolith.services.users.models.User;
import com.uva.monolith.services.users.models.UserRol;
import com.uva.monolith.services.users.models.UserStatus; import com.uva.monolith.services.users.models.UserStatus;
import com.uva.monolith.services.users.repositories.ClientRepository; import com.uva.monolith.services.users.services.UserService;
import com.uva.monolith.services.users.repositories.UserRepository;
@RestController @RestController
@RequestMapping("users") @RequestMapping("users")
...@@ -35,103 +29,82 @@ import com.uva.monolith.services.users.repositories.UserRepository; ...@@ -35,103 +29,82 @@ import com.uva.monolith.services.users.repositories.UserRepository;
public class UserController { public class UserController {
@Autowired @Autowired
private UserRepository userRepository; private UserService userService;
@Autowired
private ClientRepository clientRepository;
@GetMapping @GetMapping
public List<User> getAllUsers() { public ResponseEntity<List<User>> getAllUsers() {
return userRepository.findAll(); List<User> users = userService.getAllUsers();
return ResponseEntity.ok(users);
} }
@GetMapping(params = { "email" }) @GetMapping(params = { "email" })
public ResponseEntity<?> getUserByEmail(@RequestParam String email) { public ResponseEntity<?> getUserByEmail(@RequestParam String email) {
try { try {
return new ResponseEntity<User>(userRepository.findByEmail(email).orElseThrow(), HttpStatus.ACCEPTED); return ResponseEntity.ok(userService.getUserByEmail(email));
} catch (Exception e) { } catch (HttpClientErrorException e) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND); if (e.getStatusCode() == HttpStatus.NOT_FOUND)
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
throw e;
} }
} }
@PostMapping @PostMapping
public User addUser(@RequestBody User user) { public ResponseEntity<?> addUser(@RequestBody User user) {
// user.setStatus(UserStatus.NO_BOOKINGS); userService.addUser(user);
if (user.getRol() == null) // Rol por defecto return new ResponseEntity<>(HttpStatus.ACCEPTED);
user.setRol(UserRol.CLIENT);
return userRepository.save(user);
} }
@GetMapping("/{id}") @GetMapping("/{id}")
public User getUserById(@PathVariable int id) { public ResponseEntity<?> getUserById(@PathVariable int id) {
return userRepository.findById(id).orElseThrow(); return ResponseEntity.ok(userService.getUserById(id));
} }
@PutMapping("/{id}") @PutMapping("/{id}")
public User updateUserData(@PathVariable int id, @RequestBody Map<String, String> json) { public ResponseEntity<?> updateUserData(@PathVariable int id, @RequestBody Map<String, String> json) {
User target = userRepository.findById(id).orElseThrow(); String name = json.get("name");
if (!json.containsKey("name") || !json.containsKey("email")) { String email = json.get("email");
// TODO cambiar manejo if (name == null || email == null) {
throw new RuntimeException("Missing required fields"); return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST);
}
try {
User user = userService.updateUserData(id, name, email);
return new ResponseEntity<User>(user, HttpStatus.OK);
} catch (HttpClientErrorException e) {
if (e.getStatusCode() == HttpStatus.NOT_FOUND)
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
throw e;
} }
target.setName(json.get("name"));
target.setEmail(json.get("email"));
return userRepository.save(target);
} }
@PatchMapping("/{id}") @PatchMapping("/{id}")
public User updateUserState(@PathVariable int id, @RequestBody Map<String, String> json) { public ResponseEntity<?> updateUserState(@PathVariable int id, @RequestBody Map<String, String> json) {
Client target = clientRepository.findById(id).orElseThrow();
String strStatus = json.get("status"); String strStatus = json.get("status");
if (strStatus == null) { if (strStatus == null) {
// TODO cambiar manejo return new ResponseEntity<String>("Missing required fields", HttpStatus.BAD_REQUEST);
throw new RuntimeException("Missing required fields");
} }
try {
UserStatus userStatus = UserStatus.valueOf(strStatus); UserStatus userStatus = UserStatus.valueOf(strStatus);
return ResponseEntity.ok(userService.updateUserStatus(id, userStatus));
boolean activeBookings = target.getBookings().stream() } catch (IllegalArgumentException e) {
.anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); // reserva >= ahora return new ResponseEntity<String>("Unknown user state", HttpStatus.BAD_REQUEST);
boolean inactiveBookings = target.getBookings().stream() } catch (HttpClientErrorException e) {
.anyMatch(booking -> booking.getStartDate().isBefore(LocalDate.now())); // reserva < ahora if (e.getStatusCode() == HttpStatus.NOT_FOUND)
return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
switch (userStatus) { throw e;
// TODO Buscar como validar las (in)active bookings
case NO_BOOKINGS:
if (!target.getBookings().isEmpty())
throw new IllegalArgumentException("Invalid State: The user has at least one booking");
break;
case WITH_ACTIVE_BOOKINGS:
if (target.getBookings().isEmpty())
throw new IllegalArgumentException("Invalid State: The user don't has bookings");
if (!activeBookings)
throw new IllegalArgumentException("Invalid State: The user don't has active bookings");
break;
case WITH_INACTIVE_BOOKINGS:
if (target.getBookings().isEmpty())
throw new IllegalArgumentException("Invalid State: The user don't has bookings");
if (!inactiveBookings)
throw new IllegalArgumentException("Invalid State: The user don't has inactive bookings");
break;
default:
break;
} }
target.setStatus(userStatus);
return userRepository.save(target);
} }
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
public User deleteUser(@PathVariable Integer id) { public ResponseEntity<?> deleteUser(@PathVariable Integer id) {
User target; try {
if ((target = userRepository.findById(id).orElseThrow()) != null) { return ResponseEntity.ok(userService.deleteUserById(id));
userRepository.deleteById(id); } catch (HttpClientErrorException e) {
} if (e.getStatusCode() == HttpStatus.NOT_FOUND)
return target; return new ResponseEntity<String>(HttpStatus.NOT_FOUND);
throw e;
} }
@GetMapping("/{id}/bookings")
public List<Booking> getUserBookingsById(@PathVariable int id) {
Client user = clientRepository.findById(id).orElseThrow();
return user.getBookings();
} }
} }
package com.uva.monolith.services.users.services;
import java.time.LocalDate;
import java.util.List;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.client.HttpClientErrorException;
import com.uva.monolith.services.users.models.User;
import com.uva.monolith.services.users.models.UserRol;
import com.uva.monolith.services.users.models.UserStatus;
import com.uva.monolith.services.users.repositories.UserRepository;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
public List<User> getAllUsers() {
return userRepository.findAll();
}
private User assertUser(Optional<User> opUser) {
return opUser.orElseThrow(() -> new HttpClientErrorException(HttpStatus.NOT_FOUND));
}
public User getUserById(int id) {
return assertUser(userRepository.findById(id));
}
public User getUserByEmail(String email) {
return assertUser(userRepository.findByEmail(email));
}
public User addUser(User user) {
// TODO Introducir medidas de seguridad?
// Establecemos valores por defecto
user.setStatus(UserStatus.NO_BOOKINGS);
if (user.getRol() == null) // Rol por defecto
user.setRol(UserRol.CONSUMER);
// Guardamos
return userRepository.save(user);
}
public User updateUserData(int id, String name, String email) {
User user = getUserById(id);
user.setName(name);
user.setEmail(email);
return userRepository.save(user);
}
public User updateUserStatus(int id, UserStatus status) {
User user = getUserById(id);
boolean activeBookings = user.getBookings().stream()
.anyMatch(booking -> !booking.getEndDate().isBefore(LocalDate.now())); // reserva >= ahora
boolean inactiveBookings = user.getBookings().stream()
.anyMatch(booking -> booking.getStartDate().isBefore(LocalDate.now())); // reserva < ahora
switch (status) {
// TODO Buscar como validar las (in)active bookings
case NO_BOOKINGS:
if (!user.getBookings().isEmpty())
throw new IllegalArgumentException("Invalid State: The user has at least one booking");
break;
case WITH_ACTIVE_BOOKINGS:
if (user.getBookings().isEmpty())
throw new IllegalArgumentException("Invalid State: The user don't has bookings");
if (!activeBookings)
throw new IllegalArgumentException("Invalid State: The user don't has active bookings");
break;
case WITH_INACTIVE_BOOKINGS:
if (user.getBookings().isEmpty())
throw new IllegalArgumentException("Invalid State: The user don't has bookings");
if (!inactiveBookings)
throw new IllegalArgumentException("Invalid State: The user don't has inactive bookings");
break;
default:
break;
}
user.setStatus(status);
return userRepository.save(user);
}
public User deleteUserById(int id) {
User user = getUserById(id);
// TODO eliminar reservas de usuario ahora mismo no por el modo cascada pero a
// futuro sí, después de la disgregación en microservicios
userRepository.deleteById(id);
return user;
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment