Commit d6a805f2 by Antonio Rueda

Revisión y actualización usando records de Java para los DTOs.

parent 14aed9e0
...@@ -7,14 +7,14 @@ ...@@ -7,14 +7,14 @@
<packaging>jar</packaging> <packaging>jar</packaging>
<properties> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source> <maven.compiler.source>16</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target> <maven.compiler.target>16</maven.compiler.target>
</properties> </properties>
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.1</version> <version>2.7.5</version>
</parent> </parent>
<dependencies> <dependencies>
......
...@@ -13,7 +13,7 @@ import org.springframework.cache.annotation.EnableCaching; ...@@ -13,7 +13,7 @@ import org.springframework.cache.annotation.EnableCaching;
@SpringBootApplication(scanBasePackages = { @SpringBootApplication(scanBasePackages = {
"es.ujaen.dae.ujacoin.servicios", "es.ujaen.dae.ujacoin.servicios",
"es.ujaen.dae.ujacoin.repositorios", "es.ujaen.dae.ujacoin.repositorios",
"es.ujaen.dae.ujacoin.controladoresREST", "es.ujaen.dae.ujacoin.rest",
"es.ujaen.dae.ujacoin.seguridad" "es.ujaen.dae.ujacoin.seguridad"
}) })
@EntityScan(basePackages = "es.ujaen.dae.ujacoin.entidades") @EntityScan(basePackages = "es.ujaen.dae.ujacoin.entidades")
......
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.controladoresREST.DTO;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import java.time.LocalDate;
/**
* DTO para recopilación de datos de cliente
* @author ajrueda
*/
public class DTOCliente {
/** DNI del cliente*/
String dni;
/** Nombre completo */
String nombre;
/** Fecha de nacimiento */
LocalDate fNacimiento;
/** Dirección del domicilio */
String direccion;
/** Teléfono */
String tlf;
/** Email */
String email;
/** Clave de acceso al sistema */
String clave;
public DTOCliente(String dni, String nombre, LocalDate fNacimiento, String direccion, String tlf, String email, String clave) {
this.dni = dni;
this.nombre = nombre;
this.fNacimiento = fNacimiento;
this.direccion = direccion;
this.tlf = tlf;
this.email = email;
this.clave = clave;
}
public DTOCliente(Cliente cliente) {
this.dni = cliente.getDni();
this.nombre = cliente.getNombre();
this.fNacimiento = cliente.getfNacimiento();
this.direccion = cliente.getDireccion();
this.tlf = cliente.getTlf();
this.email = cliente.getEmail();
this.clave = "";
}
public String getDni() {
return dni;
}
public String getNombre() {
return nombre;
}
public LocalDate getfNacimiento() {
return fNacimiento;
}
public String getDireccion() {
return direccion;
}
public String getTlf() {
return tlf;
}
public String getEmail() {
return email;
}
public String getClave() {
return clave;
}
public Cliente aCliente() {
return new Cliente(dni, nombre, fNacimiento, direccion, tlf, email, clave);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.controladoresREST.DTO;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
/**
* DTO para información de cuentas bancarias en UJACoin
* @author ajrueda
*/
public class DTOCuenta {
/** Número de cuenta */
String num;
/** Saldo de la cuenta en Ujacoins */
float saldo;
/** Titular de la cuenta */
String titular;
public DTOCuenta(String num, float saldo, String titular) {
this.num = num;
this.saldo = saldo;
this.titular = titular;
}
public DTOCuenta(Cuenta cuenta) {
this.num = cuenta.getNum();
this.saldo = cuenta.getSaldo();
this.titular = cuenta.getTitular().getDni();
}
public String getNum() {
return num;
}
public float getSaldo() {
return saldo;
}
public String getTitular() {
return titular;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.controladoresREST.DTO;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import es.ujaen.dae.ujacoin.entidades.movimientos.Ingreso;
import es.ujaen.dae.ujacoin.entidades.movimientos.Movimiento;
import es.ujaen.dae.ujacoin.entidades.movimientos.Reintegro;
import es.ujaen.dae.ujacoin.entidades.movimientos.TransferenciaEmitida;
import es.ujaen.dae.ujacoin.entidades.movimientos.TransferenciaRecibida;
import java.util.List;
import java.util.Optional;
/**
*
* @author ajrueda
*/
public class DTOMovimiento {
public static final String INGRESO = "ingreso";
public static final String REINTEGRO = "reintegro";
public static final String TRANSFERENCIA_EMITIDA = "transferenciaEmitida";
public static final String TRANSFERENCIA_RECIBIDA = "transferenciaRecibida";
/** Tipo del movimiento: ingreso, reintegro, transferencia */
String tipo;
/** Número de tarjeta para ingreso/reintegro */
String numTarjeta;
/** Cuenta destino para transferencia */
String numCuenta;
/** Importe de la operación */
float importe;
public DTOMovimiento(String tipo, String numTarjeta, String numCuenta, float importe) {
this.tipo = tipo;
this.numTarjeta = numTarjeta;
this.numCuenta = numCuenta;
this.importe = importe;
}
public static DTOMovimiento ingreso(String numTarjeta, float importe) {
return new DTOMovimiento(INGRESO, numTarjeta, null, importe);
}
public static DTOMovimiento reintegro(String numTarjeta, float importe) {
return new DTOMovimiento(REINTEGRO, numTarjeta, null, importe);
}
public static DTOMovimiento transferencia(String numCuentaDestino, float importe) {
return new DTOMovimiento(TRANSFERENCIA_EMITIDA, null, numCuentaDestino, importe);
}
public DTOMovimiento(Movimiento movimiento) {
this.importe = movimiento.getImporte();
if (movimiento instanceof Ingreso) {
this.tipo = INGRESO;
this.numTarjeta = ((Ingreso) movimiento).getTarjeta().getNum();
}
else if (movimiento instanceof Reintegro) {
this.tipo = REINTEGRO;
this.numTarjeta = ((Reintegro) movimiento).getTarjeta().getNum();
}
else if (movimiento instanceof TransferenciaEmitida) {
this.tipo = TRANSFERENCIA_EMITIDA;
this.numCuenta = ((TransferenciaEmitida) movimiento).getCuentaDestino().getNum();
}
else if (movimiento instanceof TransferenciaRecibida) {
this.tipo = TRANSFERENCIA_RECIBIDA;
this.numCuenta = ((TransferenciaRecibida) movimiento).getCuentaOrigen().getNum();
}
}
public String getTipo() {
return tipo;
}
public String getNumTarjeta() {
return numTarjeta;
}
public String getNumCuenta() {
return numCuenta;
}
public float getImporte() {
return importe;
}
public Optional<Movimiento> aMovimiento(List<Tarjeta> tarjetas, List<Cuenta> cuentas) {
if (tipo == null) {
return Optional.empty();
}
switch(tipo) {
case INGRESO:
if (numTarjeta == null) {
return Optional.empty();
}
return tarjetas.stream()
.filter(t -> t.getNum().equals(numTarjeta))
.findAny()
.map(t -> new Ingreso(t, importe));
case REINTEGRO:
if (numTarjeta == null) {
return Optional.empty();
}
return tarjetas.stream()
.filter(t -> t.getNum().equals(numTarjeta))
.findAny()
.map(t -> new Reintegro(t, importe));
case TRANSFERENCIA_EMITIDA:
if (numCuenta == null) {
return Optional.empty();
}
return cuentas.stream()
.filter(c -> c.getNum().equals(numCuenta))
.findAny()
.map(c -> new TransferenciaEmitida(c, importe));
default:
return Optional.empty();
}
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.controladoresREST.DTO;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import java.time.LocalDate;
/**
* DTO para información de tarjetas bancarias
* @author ajrueda
*/
public class DTOTarjeta {
/** Número de tarjeta */
String num;
/** Titular de la tarjeta (puede ser diferente al cliente que la usa */
String titular;
/** Fecha de caducidad */
LocalDate fechaCaducidad;
/** Código de seguridad (CVC) */
String cvc;
public DTOTarjeta(String num, String titular, LocalDate fechaCaducidad, String cvc) {
this.num = num;
this.titular = titular;
this.fechaCaducidad = fechaCaducidad;
this.cvc = cvc;
}
public DTOTarjeta(Tarjeta tarjeta) {
this.num = tarjeta.getNum();
this.titular = tarjeta.getTitular();
this.fechaCaducidad = tarjeta.getFechaCaducidad();
this.cvc = tarjeta.getCvc();
}
public String getNum() {
return num;
}
public String getTitular() {
return titular;
}
public LocalDate getFechaCaducidad() {
return fechaCaducidad;
}
public String getCvc() {
return cvc;
}
public Tarjeta aTarjeta() {
return new Tarjeta(num, titular, fechaCaducidad, cvc);
}
}
...@@ -3,12 +3,12 @@ ...@@ -3,12 +3,12 @@
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package es.ujaen.dae.ujacoin.controladoresREST; package es.ujaen.dae.ujacoin.rest;
import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOCliente; import es.ujaen.dae.ujacoin.rest.dto.DTOCliente;
import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOCuenta; import es.ujaen.dae.ujacoin.rest.dto.DTOCuenta;
import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOMovimiento; import es.ujaen.dae.ujacoin.rest.dto.DTOMovimiento;
import es.ujaen.dae.ujacoin.controladoresREST.DTO.DTOTarjeta; import es.ujaen.dae.ujacoin.rest.dto.DTOTarjeta;
import es.ujaen.dae.ujacoin.entidades.Cliente; import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta; import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.movimientos.Movimiento; import es.ujaen.dae.ujacoin.entidades.movimientos.Movimiento;
...@@ -146,22 +146,22 @@ public class ControladorREST { ...@@ -146,22 +146,22 @@ public class ControladorREST {
/** Registrar un nuevo movimiento en la cuenta */ /** Registrar un nuevo movimiento en la cuenta */
@PostMapping("/clientes/{dni}/cuentas/{numCuenta}/movimientos") @PostMapping("/clientes/{dni}/cuentas/{numCuenta}/movimientos")
ResponseEntity<Void> registrarMovimiento(@PathVariable String dni, @PathVariable String numCuenta, @RequestBody DTOMovimiento movimiento) { ResponseEntity<Void> registrarMovimiento(@PathVariable String dni, @PathVariable String numCuenta, @RequestBody DTOMovimiento movimiento) {
if (movimiento.getTipo() == null) { if (movimiento.tipo() == null) {
return ResponseEntity.badRequest().build(); return ResponseEntity.badRequest().build();
} }
try { try {
switch(movimiento.getTipo()) { switch(movimiento.tipo()) {
case DTOMovimiento.INGRESO: case DTOMovimiento.INGRESO:
servicios.ingreso(numCuenta, movimiento.getNumTarjeta(), movimiento.getImporte()); servicios.ingreso(numCuenta, movimiento.numTarjeta(), movimiento.importe());
break; break;
case DTOMovimiento.REINTEGRO: case DTOMovimiento.REINTEGRO:
servicios.reintegro(numCuenta, movimiento.getNumTarjeta(), movimiento.getImporte()); servicios.reintegro(numCuenta, movimiento.numTarjeta(), movimiento.importe());
break; break;
case DTOMovimiento.TRANSFERENCIA_EMITIDA: case DTOMovimiento.TRANSFERENCIA_EMITIDA:
servicios.transferencia(numCuenta, movimiento.getNumCuenta(), movimiento.getImporte()); servicios.transferencia(numCuenta, movimiento.numCuenta(), movimiento.importe());
break; break;
default: default:
...@@ -203,7 +203,7 @@ public class ControladorREST { ...@@ -203,7 +203,7 @@ public class ControladorREST {
return ResponseEntity.ok(movimientos.stream() return ResponseEntity.ok(movimientos.stream()
.skip((pag - 1) * num) .skip((pag - 1) * num)
.limit(num) .limit(num)
.map(m -> new DTOMovimiento(m)) .map(m -> DTOMovimiento.dtoMovimiento(m))
.collect(Collectors.toList())); .collect(Collectors.toList()));
} }
} }
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.rest.dto;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import java.time.LocalDate;
/**
* DTO para recopilación de datos de cliente
* @author ajrueda
*/
public record DTOCliente(
String dni,
String nombre,
LocalDate fNacimiento,
String direccion,
String tlf,
String email,
String clave) {
public DTOCliente(Cliente cliente) {
this(cliente.getDni(),
cliente.getNombre(),
cliente.getfNacimiento(),
cliente.getDireccion(),
cliente.getTlf(),
cliente.getEmail(),
"");
}
public Cliente aCliente() {
return new Cliente(dni, nombre, fNacimiento, direccion, tlf, email, clave);
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.rest.dto;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
/**
* DTO para información de cuentas bancarias en UJACoin
* @author ajrueda
*/
public record DTOCuenta(
String num,
float saldo,
String titular) {
public DTOCuenta(Cuenta cuenta) {
this(cuenta.getNum(), cuenta.getSaldo(), cuenta.getTitular().getDni());
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.rest.dto;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import es.ujaen.dae.ujacoin.entidades.movimientos.Ingreso;
import es.ujaen.dae.ujacoin.entidades.movimientos.Movimiento;
import es.ujaen.dae.ujacoin.entidades.movimientos.Reintegro;
import es.ujaen.dae.ujacoin.entidades.movimientos.TransferenciaEmitida;
import es.ujaen.dae.ujacoin.entidades.movimientos.TransferenciaRecibida;
import java.util.List;
import java.util.Optional;
/**
* DTO para codificación de movimientos
* @author ajrueda
*/
public record DTOMovimiento(
String tipo,
String numTarjeta,
String numCuenta,
float importe) {
public static final String INGRESO = "ingreso";
public static final String REINTEGRO = "reintegro";
public static final String TRANSFERENCIA_EMITIDA = "transferenciaEmitida";
public static final String TRANSFERENCIA_RECIBIDA = "transferenciaRecibida";
public static DTOMovimiento dtoIngreso(String numTarjeta, float importe) {
return new DTOMovimiento(INGRESO, numTarjeta, null, importe);
}
public static DTOMovimiento dtoReintegro(String numTarjeta, float importe) {
return new DTOMovimiento(REINTEGRO, numTarjeta, null, importe);
}
public static DTOMovimiento dtoTransferenciaEmitida(String numCuentaDestino, float importe) {
return new DTOMovimiento(TRANSFERENCIA_EMITIDA, null, numCuentaDestino, importe);
}
public static DTOMovimiento dtoTransferenciaRecibida(String numCuentaOrigen, float importe) {
return new DTOMovimiento(TRANSFERENCIA_RECIBIDA, null, numCuentaOrigen, importe);
}
public static DTOMovimiento dtoMovimiento(Movimiento movimiento) {
DTOMovimiento dto = null;
if (movimiento instanceof Ingreso ingreso) {
dto = dtoIngreso(ingreso.getTarjeta().getNum(), movimiento.getImporte());
}
else if (movimiento instanceof Reintegro reintegro) {
dto = dtoReintegro(reintegro.getTarjeta().getNum(), movimiento.getImporte());
}
else if (movimiento instanceof TransferenciaEmitida transferencia) {
dto = dtoTransferenciaEmitida(transferencia.getCuentaDestino().getNum(), movimiento.getImporte());
}
else if (movimiento instanceof TransferenciaRecibida transferencia) {
dto = dtoTransferenciaRecibida(transferencia.getCuentaOrigen().getNum(), movimiento.getImporte());
}
return dto;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package es.ujaen.dae.ujacoin.rest.dto;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import java.time.LocalDate;
/**
* DTO para información de tarjetas bancarias
* @author ajrueda
*/
public record DTOTarjeta(
String num,
String titular,
LocalDate fechaCaducidad,
String cvc) {
public DTOTarjeta(Tarjeta tarjeta) {
this(tarjeta.getNum(), tarjeta.getTitular(), tarjeta.getFechaCaducidad(), tarjeta.getCvc());
}
public Tarjeta aTarjeta() {
return new Tarjeta(num, titular, fechaCaducidad, cvc);
}
}
...@@ -7,8 +7,6 @@ package es.ujaen.dae.ujacoin.seguridad; ...@@ -7,8 +7,6 @@ package es.ujaen.dae.ujacoin.seguridad;
import es.ujaen.dae.ujacoin.entidades.Cliente; import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.servicios.ServicioUjaCoin; import es.ujaen.dae.ujacoin.servicios.ServicioUjaCoin;
import java.util.Optional;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetails;
......
...@@ -5,7 +5,6 @@ ...@@ -5,7 +5,6 @@
*/ */
package es.ujaen.dae.ujacoin.seguridad; package es.ujaen.dae.ujacoin.seguridad;
import es.ujaen.dae.ujacoin.util.CachedBCryptPasswordEncoder;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager; import org.springframework.cache.CacheManager;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -14,6 +13,7 @@ import org.springframework.security.config.annotation.authentication.builders.Au ...@@ -14,6 +13,7 @@ import org.springframework.security.config.annotation.authentication.builders.Au
import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
/** /**
* Proveedor de datos de seguridad de UJaCoin * Proveedor de datos de seguridad de UJaCoin
...@@ -25,15 +25,15 @@ public class ServicioSeguridadUjaCoin extends WebSecurityConfigurerAdapter { ...@@ -25,15 +25,15 @@ public class ServicioSeguridadUjaCoin extends WebSecurityConfigurerAdapter {
@Autowired @Autowired
ServicioDatosCliente servicioDatosCliente; ServicioDatosCliente servicioDatosCliente;
@Autowired //@Autowired
CacheManager cacheManager; //CacheManager cacheManager;
@Override @Override
public void configure(AuthenticationManagerBuilder auth) throws Exception { public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(servicioDatosCliente) auth.userDetailsService(servicioDatosCliente)
.passwordEncoder(new CachedBCryptPasswordEncoder(cacheManager.getCache("claves"))); .passwordEncoder(new BCryptPasswordEncoder());
//.passwordEncoder(new BCryptPasswordEncoder()); //.passwordEncoder(new CachedBCryptPasswordEncoder(cacheManager.getCache("claves")));
//auth.inMemoryAuthentication() //auth.inMemoryAuthentication()
// .withUser("ujacoin").roles("CLIENTE").password("{noop}secret"); // .withUser("ujacoin").roles("CLIENTE").password("{noop}secret");
} }
...@@ -47,7 +47,7 @@ public class ServicioSeguridadUjaCoin extends WebSecurityConfigurerAdapter { ...@@ -47,7 +47,7 @@ public class ServicioSeguridadUjaCoin extends WebSecurityConfigurerAdapter {
// Activar seguridad HTTP Basic // Activar seguridad HTTP Basic
httpSecurity.httpBasic(); httpSecurity.httpBasic();
// httpSecurity.authorizeRequests().antMatchers("/ujacoin/**").permitAll(); //httpSecurity.authorizeRequests().antMatchers("/ujacoin/**").permitAll();
// Definir protección por URL // Definir protección por URL
httpSecurity.authorizeRequests().antMatchers(HttpMethod.POST, "/ujacoin/clientes").permitAll(); httpSecurity.authorizeRequests().antMatchers(HttpMethod.POST, "/ujacoin/clientes").permitAll();
......
...@@ -18,11 +18,9 @@ import java.util.concurrent.Executors; ...@@ -18,11 +18,9 @@ import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
import javax.validation.ConstraintViolationException; import javax.validation.ConstraintViolationException;
import org.assertj.core.api.Assertions; import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cache.CacheManager;
import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.MethodMode; import org.springframework.test.annotation.DirtiesContext.MethodMode;
import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.ActiveProfiles;
......
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