Commit 7fac43cc by María Hidalgo

Finalizada persistencia

parent bb34dd1b
......@@ -24,16 +24,16 @@
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- <dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency> -->
</dependency>
<!-- <dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.7.Final</version>
</dependency> -->
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
......
......@@ -2,15 +2,17 @@ package es.ujaen.dae.carpoolingdae.app;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.boot.autoconfigure.domain.EntityScan;
@SpringBootApplication(scanBasePackages = "es.ujaen.dae.carpooling.servicios")
@EntityScan(basePackages="es.ujaen.dae.ujacoin.entidades")
public class CarpoolingDaeApplication {
public static void main(String[] args) throws Exception {
// Creación de servidor
SpringApplication servidor = new SpringApplication(CarpoolingDaeApplication.class);
ApplicationContext context = servidor.run(args);
SpringApplication.run(CarpoolingDaeApplication.class, args);
//ApplicationContext context = servidor.run(args);
// SpringApplication.run(CarpoolingDaeApplication.class, args);
}
......
package es.ujaen.dae.carpoolingdae.entidades;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.ArrayList;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import java.util.List;
import es.ujaen.dae.carpoolingdae.excepciones.PlazaNoDisponible;
import es.ujaen.dae.carpoolingdae.excepciones.NoAceptaConductor;
import es.ujaen.dae.carpoolingdae.utils.CodificadorMd5;
//import org.hibernate.mapping.List;
import es.ujaen.dae.carpoolingdae.utils.ExprReg;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
/**
* Usuario a la app de carpooling
*
* @author maria
*/
@Data
@NoArgsConstructor
public class Usuario {
// Lista de viajes como conductor
List<Viaje> viajesComoConductor;
// Lista de viajes como pasajero
List<Viaje> viajesComoPasajero;
@Entity
public class Usuario implements Serializable {
@NotBlank
@Id
@NotNull
@Size(min = 9, max = 9)
@Pattern(regexp = ExprReg.DNI)
String dni;
......@@ -47,18 +48,27 @@ public class Usuario {
@NotBlank
String apellidos;
@NotNull
@Past
LocalDate fecha_nac;
@NotNull
@Size(min = 9, max = 13)
@Pattern(regexp = ExprReg.TLF)
String telef;
@NotBlank
@Email
String email;
@NotBlank
String clave;
// Viajes creados por el conductor
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name = "usuario_dni")
List<Viaje> viajesComoConductor;
public Usuario(String dni, String nombre, String apellidos, LocalDate fecha_nac, String telef, String email,
String clave) {
this.dni = dni;
......@@ -67,10 +77,9 @@ public class Usuario {
this.fecha_nac = fecha_nac;
this.telef = telef;
this.email = email;
this.clave = CodificadorMd5.codificar(clave);
// reservas = new ArrayList<>();
this.clave = (clave != null ? CodificadorMd5.codificar(clave) : null);
viajesComoConductor = new ArrayList<>();
viajesComoPasajero = new ArrayList<>();
}
......@@ -98,7 +107,6 @@ public class Usuario {
return email;
}
/**
* Compara la clave con la del usuario, codificándola en Md5
*
......@@ -109,29 +117,34 @@ public class Usuario {
public boolean claveValida(String clave) {
return clave.equals(clave);
}
public void agregarViajeComoConductor(Viaje viaje) {
/**
* Agregar viaje a la lista de viajes creados por el conductor
*
* @param viaje
*/
public void agregarViajeComoConductor(@NotNull @Valid Viaje viaje) {
// Agregar el viaje a la lista de viajes del usuario como conductor
viajesComoConductor.add(viaje);
}
public void enviarSolicitudParaSerPasajero(Viaje viaje) {
if (!viaje.usuariosSolicitantes.contains(this) && viaje.getPlazas() > 0) {
viaje.usuariosSolicitantes.add(this);
} else {
throw new PlazaNoDisponible();
}
}
/**
* Aceptar pasajero en un viaje
*
* @param conductor que puede aceptar al pasajero
* @param viaje
* @param pasajero que es aceptado en el viaje
*/
/* public void confirmarPasajero(Viaje viaje) {
if (viajesComoConductor.contains(viaje) && viaje.usuariosSolicitantes.contains(this)) {
viaje.usuariosSolicitantes.remove(this);
viaje.usuariosConfirmados.add(this);
} else {
public void aceptarPasajero(@NotNull @Valid Usuario conductor, @NotNull @Valid Viaje viaje,
@NotNull @Valid Usuario pasajero) {
// Verifica si el viaje está en la lista de viajes del conductor
if (!viajesComoConductor.contains(viaje)) {
throw new NoAceptaConductor();
}
} */
// Llamar a la función en Viaje para confirmar al pasajero
viaje.confirmarPasajero(pasajero, conductor);
}
}
......@@ -4,24 +4,26 @@ import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import es.ujaen.dae.carpoolingdae.excepciones.PlazaNoDisponible;
import es.ujaen.dae.carpoolingdae.excepciones.NoAceptaConductor;
@Entity
public class Viaje {
// Lista de usuarios que solicitan unirse a un viaje
List<Usuario> usuariosSolicitantes = new ArrayList<>();
// Lista de usuarios que son confirmados en un viaje
List<Usuario> usuariosConfirmados = new ArrayList<>();
//@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@NotNull
@GeneratedValue(strategy = GenerationType.IDENTITY)
int id;
@NotBlank
......@@ -30,26 +32,38 @@ public class Viaje {
@NotBlank
String origen;
@NotNull
@Past
LocalDateTime fecha_hora;
LocalDateTime fechaHora;
@NotBlank
@NotNull
int plazasDisponibles;
@NotBlank
Double precioAsiento;
private Usuario conductor;
// Lista de usuarios que solicitan unirse a un viaje
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "solicitantes_viaje")
List<Usuario> usuariosSolicitantes;
public Viaje(int id, String destino, String origen, LocalDateTime fecha_hora, int plazasDisponibles,
// Lista de usuarios que son confirmados en un viaje
@OneToMany(cascade = CascadeType.ALL)
@JoinColumn(name = "confirmados_viaje")
List<Usuario> usuariosConfirmados;
public Viaje(int id, String destino, String origen, LocalDateTime fechaHora, int plazasDisponibles,
Double precioAsiento) {
this.id = id;
this.origen = origen;
this.destino = destino;
this.fecha_hora = fecha_hora;
this.fechaHora = fechaHora;
this.plazasDisponibles = plazasDisponibles;
this.precioAsiento = precioAsiento;
// reservas = new ArrayList<>();
usuariosSolicitantes = new ArrayList<>();
usuariosConfirmados = new ArrayList<>();
}
public int getId() {
......@@ -64,8 +78,8 @@ public class Viaje {
return origen;
}
public LocalDateTime getFecha_hora() {
return fecha_hora;
public LocalDateTime getfechaHora() {
return fechaHora;
}
public int getPlazas() {
......@@ -76,53 +90,27 @@ public class Viaje {
return precioAsiento;
}
// Método para obtener el conductor del viaje
public Usuario getConductor() {
return conductor;
}
public void setConductor(Usuario conductor) {
this.conductor = conductor;
}
public List<Usuario> getUsuariosConfirmados(){
return usuariosConfirmados;
}
public List<Usuario> getUsuariosSolicitantes(){
return usuariosSolicitantes;
}
/* public void addPasajero(Usuario pasajero) {
if (plazasDisponibles > 0) {
usuariosConfirmados.add(pasajero);
plazasDisponibles--;
public void enviarSolicitudParaSerPasajero(@NotNull @Valid Viaje viaje, @NotNull @Valid Usuario pasajero) {
if (!usuariosSolicitantes.contains(pasajero) && getPlazas() > 0) { // Sino quedan plazas no puede solicitar unirse
usuariosSolicitantes.add(pasajero);
} else {
throw new PlazaNoDisponible();
}
} */
public void reducePlazasDisponibles(@NotNull @Valid Viaje viaje) {
if (plazasDisponibles > 0) {
plazasDisponibles--;
}
}
public void confirmarPasajero(@NotNull @Valid Usuario pasajero) {
// Verificar si el usuario que acepta es el conductor del viaje
if (!this.getConductor().equals(conductor)) {
throw new NoAceptaConductor();
}
public void confirmarPasajero(@NotNull @Valid Usuario pasajero, @NotNull @Valid Usuario conductor) {
// Verificar si el pasajero está en la lista de solicitantes
if (usuariosSolicitantes.contains(pasajero)) {
// Mover al pasajero de la lista de solicitantes a la lista de confirmados
usuariosSolicitantes.remove(pasajero);
usuariosConfirmados.add(pasajero);
// Verificar si el pasajero está en la lista de solicitantes
if (usuariosSolicitantes.contains(pasajero)) {
// Mover al pasajero de la lista de solicitantes a la lista de confirmados
usuariosSolicitantes.remove(pasajero);
usuariosConfirmados.add(pasajero);
}
}
// Al añadir al pasajero a la lista de confirmados reduzco el número de plazas disponibles
if (plazasDisponibles > 0) {
plazasDisponibles--;
}
}
}
}
package es.ujaen.dae.carpoolingdae.repositorios;
import java.util.Optional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.springframework.transaction.annotation.Transactional;
import es.ujaen.dae.carpoolingdae.entidades.Usuario;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
@Repository
@Transactional(propagation = Propagation.REQUIRED)
public class RepositorioUsuarios {
@PersistenceContext
EntityManager em;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public Optional<Usuario> buscar(String dni) {
return Optional.ofNullable(em.find(Usuario.class, dni));
}
public void guardar(Usuario usuario) {
em.persist(usuario);
}
}
package es.ujaen.dae.carpoolingdae.repositorios;
import java.util.List;
import java.util.Optional;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.TypedQuery;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import es.ujaen.dae.carpoolingdae.entidades.Viaje;
@Repository
@Transactional(propagation = Propagation.REQUIRED)
public class RepositorioViajes {
@PersistenceContext
EntityManager em;
@Transactional(propagation = Propagation.SUPPORTS, readOnly = true)
public Optional<Viaje> buscarViajePorId(int id) {
return Optional.ofNullable(em.find(Viaje.class, id));
}
public void guardarViaje(Viaje viaje) {
em.persist(viaje);
}
public List<Viaje> buscarViajes() {
TypedQuery<Viaje> query = em.createQuery("SELECT v FROM Viaje v", Viaje.class);
return query.getResultList();
}
public void actualizarViajes(Viaje viaje) {
em.merge(viaje);
}
}
## Fichero de configuración para UjaCoin durante testing
# spring.datasource.url: jdbc:mysql://localhost:33060/ujacoin_test
spring.datasource.url: jdbc:h2:mem:ujacoin_test;MODE=MYSQL;DATABASE_TO_LOWER=TRUE;DB_CLOSE_DELAY=-1
spring.jpa.properties.javax.persistence.schema-generation.database.action: drop-and-create
## Fichero de configuración para UjaCoin
spring.datasource.url: jdbc:mysql://localhost:33060/ujacoin
spring.datasource.username: ujacoin
spring.datasource.password: secret
spring.jpa.properties.javax.persistence.schema-generation.database.action: none
spring.data.jpa.repositories.bootstrap-mode: default
package es.ujaen.dae.carpoolingdae.servicios;
import java.util.TreeMap;
import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Map;
import java.util.Optional;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import es.ujaen.dae.carpoolingdae.entidades.Usuario;
import es.ujaen.dae.carpoolingdae.entidades.Viaje;
import es.ujaen.dae.carpoolingdae.excepciones.NoAceptaConductor;
import es.ujaen.dae.carpoolingdae.excepciones.UsuarioNoRegistrado;
import es.ujaen.dae.carpoolingdae.excepciones.UsuarioYaRegistrado;
import es.ujaen.dae.carpoolingdae.excepciones.ViajeNoExistente;
import es.ujaen.dae.carpoolingdae.repositorios.RepositorioUsuarios;
import es.ujaen.dae.carpoolingdae.repositorios.RepositorioViajes;
@Service
@Validated
public class SistemaCarpooling {
/** Mapa con la lista de Usuarios */
Map<String, Usuario> usuarios;
/** Mapa con la lista de Viajes */
Map<String, Viaje> viajes;
@Autowired
RepositorioUsuarios repositorioUsuarios;
@Autowired
RepositorioViajes repositorioViajes;
public SistemaCarpooling() {
usuarios = new TreeMap<>();
viajes = new TreeMap<>();
}
/**
......@@ -43,12 +43,12 @@ public class SistemaCarpooling {
*/
public void altaUsuario(@NotNull @Valid Usuario usuario) {
if (usuarios.containsKey(usuario.getDni())) {
if (repositorioUsuarios.buscar(usuario.getDni()).isPresent()) {
throw new UsuarioYaRegistrado();
}
// Registrar usuario
usuarios.put(usuario.getDni(), usuario);
repositorioUsuarios.guardar(usuario);
}
......@@ -59,11 +59,22 @@ public class SistemaCarpooling {
* @param clave la clave de acceso
* @return el objeto de la clase Viaje asociado
*/
public Usuario loginUsuario(@NotBlank String email, @NotBlank String clave) {
return Optional.ofNullable(usuarios.get(email))
.filter(cliente -> cliente.claveValida(clave))
.orElseThrow(UsuarioNoRegistrado::new);
@Transactional
public Optional<Usuario> loginUsuario(@NotBlank String dni, @NotBlank String clave) {
Optional<Usuario> usuarioLogin = repositorioUsuarios.buscar(dni)
.filter((cliente) -> cliente.claveValida(clave));
return usuarioLogin;
}
public void agregarViaje(@NotNull @Valid Usuario conductor, @NotNull @Valid Viaje viaje) {
// Llamar a la función en Usuario para agregar el viaje como conductor
conductor.agregarViajeComoConductor(viaje);
// Agregar el viaje al repositorio de viajes
repositorioViajes.guardarViaje(viaje);
}
/**
......@@ -77,9 +88,10 @@ public class SistemaCarpooling {
public List<Viaje> buscarViajes(@NotBlank String origen, @NotBlank String destino, @NotBlank LocalDate fecha) {
List<Viaje> viajesEncontrados = new ArrayList<>();
for (Viaje viaje : viajes.values()) { // Iterar sobre la colección de viajes
List<Viaje> listaViajes = repositorioViajes.buscarViajes();
for (Viaje viaje : listaViajes) { // Iterar sobre la colección de viajes
if (viaje.getOrigen().equals(origen) && viaje.getDestino().equals(destino)
&& viaje.getFecha_hora().toLocalDate().equals(fecha)) {
&& viaje.getfechaHora().toLocalDate().equals(fecha)) { // Busco todos los viajes de esa fecha
viajesEncontrados.add(viaje);
} else {
throw new ViajeNoExistente();
......@@ -89,55 +101,21 @@ public class SistemaCarpooling {
}
public void agregarViaje(@NotNull @Valid Usuario conductor, @NotNull @Valid Viaje viaje) {
// Asignar el conductor al viaje
viaje.setConductor(conductor);
// Llamar a la función en Usuario para agregar el viaje como conductor
conductor.agregarViajeComoConductor(viaje);
// Agregar el viaje al mapa de viajes
viajes.put(String.valueOf(viaje.getId()), viaje);
}
/**
* Enviar solicitud para ser pasajero de un viaje
*
* @param viaje al que se envía la solicitud
*/
public void enviarSolicitudViaje(@NotNull @Valid Viaje viaje, @NotNull @Valid Usuario pasajero) {
// Llamar a la función en Usuario para enviar la solicitud
pasajero.enviarSolicitudParaSerPasajero(viaje);
// Llamar a la función en viaje para enviar la solicitud
viaje.enviarSolicitudParaSerPasajero(viaje, pasajero);
}
public void aceptarPasajeroViaje(@NotNull @Valid Viaje viaje, @NotNull @Valid Usuario pasajero,
@NotNull @Valid Usuario conductor) {
/**
* Aceptar pasajero en un viaje
*
* @param viaje
* @param pasajero que es aceptado en el viaje
*/
/* public void aceptarPasajero(@NotNull @Valid Viaje viaje, @NotNull @Valid Usuario pasajero) {
// Llamar a la función en Usuario para confirmar al pasajero
viaje.confirmarPasajero(pasajero);
// Reducir el número de plazas disponibles en el viaje
viaje.reducePlazasDisponibles(viaje);
} */
public void aceptarPasajero(@NotNull @Valid Usuario conductor, @NotNull @Valid Viaje viaje,
@NotNull @Valid Usuario pasajero) {
// Verifica si el viaje está en la lista de viajes del conductor
if (!conductor.getViajesComoConductor().contains(viaje)) {
throw new NoAceptaConductor();
}
// Llamar a la función en Viaje para confirmar al pasajero
viaje.confirmarPasajero(pasajero);
viaje.confirmarPasajero(pasajero, conductor);
repositorioViajes.actualizarViajes(viaje);
}
}
\ No newline at end of file
......@@ -20,31 +20,6 @@ public class ViajeTest {
}
/* //private Viaje viaje;
@Test
void testAddPasajero() {
Usuario pasajero = new Usuario("12345678A",
"Conductor",
"Apellido",
LocalDate.of(1990, 1, 1),
"123456789",
"conductor@example.com",
"clave");
Viaje viaje = new Viaje(
12345,
"Origen",
"Destino",
LocalDateTime.of(2023, 9, 30, 8, 0),
2,
50.0);
viaje.addPasajero(pasajero);
assertTrue(viaje.getUsuariosConfirmados().contains(pasajero));
} */
@Test
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
......@@ -77,7 +52,7 @@ public class ViajeTest {
LocalDateTime.of(2023, 9, 30, 8, 0),
2,
50.0);
viaje.setConductor(conductor);
// Agregar el viaje al sistema
sistemaCarpooling.agregarViaje(conductor, viaje);
......@@ -87,7 +62,7 @@ public class ViajeTest {
// Aceptar al pasajero en el viaje llamando a la función en Viaje
try {
viaje.confirmarPasajero(pasajero);
viaje.confirmarPasajero(pasajero, conductor);
} catch (NoAceptaConductor e) {
// Manejar la excepción si el conductor no es el correcto (opcional)
e.printStackTrace();
......
......@@ -93,11 +93,11 @@ public class SistemaCarpoolingTest {
"mhm@red.ujaen.es",
clave);
// Cuenta cuenta = servicioUjaCoin.altaCliente(cliente);
List <Usuario> usuarioLogin = sistemaCarpooling.loginUsuario(usuario.getEmail(), "clave");
sistemaCarpooling.altaUsuario(usuario);
Optional<Usuario> usuarioLogin = sistemaCarpooling.loginUsuario(usuario.getEmail(), "clave");
Assertions.assertThat(usuarioLogin.isPresent()).isTrue();
Assertions.assertThat(usuarioLogin.get()).isEqualTo(usuario);
Assertions.assertThat(usuarioLogin.get().getDni()).isEqualTo(usuario.getDni());
}
@DirtiesContext(methodMode = MethodMode.AFTER_METHOD)
......@@ -122,7 +122,7 @@ public class SistemaCarpoolingTest {
clave);
// Agregar el viaje al sistema
sistemaCarpooling.agregarViaje(usuario.getDni(), nuevoViaje);
sistemaCarpooling.agregarViaje(usuario,nuevoViaje);
// Buscar el viaje paraver si ha sido añadido
String origenBusqueda = "Origen";
......@@ -162,9 +162,9 @@ public class SistemaCarpoolingTest {
30.0);
// Realizar la búsqueda de viajes
String origenBusqueda2 = "Origen2";
/* String origenBusqueda2 = "Origen2";
String destinoBusqueda2 = "Destino2";
LocalDate fechaBusqueda2 = LocalDate.of(2023, 9, 30);
LocalDate fechaBusqueda2 = LocalDate.of(2023, 9, 30); */
List<Viaje> viajesEncontrados = sistemaCarpooling.buscarViajes(origenBusqueda, destinoBusqueda, fechaBusqueda);
......@@ -204,16 +204,15 @@ public class SistemaCarpoolingTest {
LocalDateTime.of(2023, 9, 30, 8, 0),
2,
50.0);
viaje.setConductor(conductor);
// Agregar el viaje al sistema
sistemaCarpooling.agregarViaje(conductor.getDni(), viaje);
sistemaCarpooling.agregarViaje(conductor,viaje);
// Enviar solicitud de viaje
sistemaCarpooling.enviarSolicitudViaje(viaje, pasajero);
// Verificar que el pasajero está en la lista de solicitantes del viaje
assertTrue(viaje.getUsuariosSolicitantes().contains(pasajero));
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment