Commit 68ee1644 by Adrian

APIRest Primera Parte

parent d557b8c9
POST /ujacoin/clientes -> Alta de clientes (Se le crea cuenta por defecto)
GET /ujacoin/clientes/{dni} -> Validar y devolver cliente. (temporal hasta que se explique Spring Security)
PUT /ujacoin/clientes/{dni} -> Actualizar cliente.
POST /ujacoin/clientes/{dni}/tarjetas -> Registrar tarjeta
GET /ujacoin/clientes/{dni}/tarjetas-> Obtener listado de cuentas del usuario
GET /ujacoin/clientes/{dni}/tarjetas/{num} -> Obtener información de tarjeta
DELETE /ujacoin/clientes/{dni}/tarjetas/{num} -> Borrar tarjeta
POST /ujacoin/clientes/{dni}/cuentas -> Creación de cuenta adicional
GET /ujacoin/clientes/{dni}/cuentas-> Obtener listado de cuentas del usuario
GET /ujacoin/clientes/{dni}/cuentas/{num} -> Obtener información de cuenta
DELETE /ujacoin/clientes/{dni}/cuentas/{num} -> Borrar cuenta
POST /ujacoin/clientes/{dni}/cuentas/{num}/movimientos -> Añadir movimiento
GET /ujacoin/clientes/{dni}/cuentas/{num}/movimientos -> Listado de movimientos en la cuenta (se pueden acotar las fechas con parámetros de consulta, y debería devolverse paginado)
\ No newline at end of file
...@@ -34,10 +34,20 @@ ...@@ -34,10 +34,20 @@
<artifactId>sqlite-jdbc</artifactId> <artifactId>sqlite-jdbc</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency> </dependency>
<dependency> <dependency>
......
/*
* 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.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import es.ujaen.dae.ujacoin.entidadesDTO.ClienteDTO;
import es.ujaen.dae.ujacoin.entidadesDTO.CuentaDTO;
import es.ujaen.dae.ujacoin.entidadesDTO.TarjetaDTO;
import java.time.LocalDate;
import org.springframework.hateoas.Link;
import org.springframework.hateoas.server.mvc.ControllerLinkBuilder;
import org.springframework.stereotype.Service;
/**
*
* @author adria
*/
@Service
public class Mapeador {
public ClienteDTO aClienteDTO(Cliente cliente) {
ClienteDTO clienteDTO = new ClienteDTO(cliente.getDni(),
cliente.getNombre(),
cliente.getFechaNacimiento(),
cliente.getDireccion(),
cliente.getTelefono(),
cliente.getEmail(),
cliente.getClave());
for (String cuenta : cliente.getCuentasAsociadas().keySet()) {
clienteDTO.añadirCuenta(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(ServicioRestAPI.class).detalleCuenta(cliente.getDni(), cuenta, cliente.getClave())).withSelfRel());
}
for (Tarjeta tarjeta : cliente.getTarjetasAsociadas().values()) {
clienteDTO.añadirCuenta(ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(ServicioRestAPI.class).detalleTarjeta(cliente.getDni(), tarjeta.getIdentificador(), cliente.getClave())).withSelfRel());
}
return clienteDTO;
}
public Cliente deClienteDTO(ClienteDTO clienteDTO) {
Cliente cliente = new Cliente(clienteDTO.getDni(),
clienteDTO.getNombre(),
clienteDTO.getFechaNacimiento(),
clienteDTO.getDireccion(),
clienteDTO.getTelefono(),
clienteDTO.getEmail(),
clienteDTO.getClave());
return cliente;
}
public CuentaDTO aCuentaDTO(Cuenta cuenta){
return new CuentaDTO(cuenta.getNumero(), cuenta.getSaldo());
}
public TarjetaDTO aTarjetaDTO (Tarjeta tarjeta){
return new TarjetaDTO(tarjeta.getNumero(), tarjeta.getTitular(), tarjeta.getCvc(), tarjeta.getFechaCaducidad());
}
public Tarjeta deTarjetaDTO (TarjetaDTO tarjetaDTO){
return new Tarjeta(tarjetaDTO.getNumero(), tarjetaDTO.getTitular(), tarjetaDTO.getCvc(), tarjetaDTO.getFechaCaducidad());
}
}
/*
* 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.beans;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.entidades.Cuenta;
import es.ujaen.dae.ujacoin.entidades.Tarjeta;
import es.ujaen.dae.ujacoin.entidadesDTO.ClienteDTO;
import es.ujaen.dae.ujacoin.entidadesDTO.CuentaDTO;
import es.ujaen.dae.ujacoin.entidadesDTO.TarjetaDTO;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/ujacoin")
public class ServicioRestAPI {
@Autowired
ServicioUjaBankImpl ujaBank;
@Autowired
Mapeador mapper;
////////TESTING
@GetMapping("/enteros/{entero}")
public ResponseEntity<Integer> testEntero(@PathVariable int entero) {
if (entero < 0) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
} else {
return new ResponseEntity<>(entero - 1, HttpStatus.OK);
}
}
@GetMapping("/clientes/{dni}")
public ResponseEntity<ClienteDTO> loginCliente(@PathVariable String dni, @RequestParam(defaultValue = "") String pass) {
if (dni != null && "".equals(dni) && pass != null && "".equals(pass)) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
Cliente cliente = ujaBank.loginCliente(dni, pass);
if (cliente == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<>(mapper.aClienteDTO(cliente), HttpStatus.OK);
}
@GetMapping("/ujacoin/clientes/{dni}/cuentas/{num}}")
public ResponseEntity<CuentaDTO> detalleCuenta(@PathVariable String dni, @PathVariable String num, @RequestParam(defaultValue = "") String pass) {
if (dni != null && "".equals(dni) && num != null && "".equals(num) && pass != null && "".equals(pass)) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
Cliente cliente = ujaBank.loginCliente(dni, pass);
if (cliente == null) {
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
}
Cuenta cuenta = null;
List<Cuenta> listaCuentas = ujaBank.listaCuentas(cliente);
for (Cuenta c : listaCuentas) {
if (c.getNumero().equals(num)) {
cuenta = c;
break;
}
}
if (cuenta == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<>(mapper.aCuentaDTO(cuenta), HttpStatus.OK);
}
@GetMapping("/ujacoin/clientes/{dni}/tarjetas/{num}}")
public ResponseEntity<TarjetaDTO> detalleTarjeta(@PathVariable String dni, @PathVariable int num, @RequestParam(defaultValue = "") String pass) {
if (dni != null && "".equals(dni) && pass != null && "".equals(pass)) {
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
Cliente cliente = ujaBank.loginCliente(dni, pass);
if (cliente == null) {
return new ResponseEntity<>(HttpStatus.FORBIDDEN);
}
Tarjeta tarjeta = null;
List<Tarjeta> listaTarjetas = ujaBank.listaTarjetas(cliente);
for (Tarjeta t : listaTarjetas) {
if (t.getIdentificador() == num) {
tarjeta = t;
break;
}
}
if (tarjeta == null) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
return new ResponseEntity<>(mapper.aTarjetaDTO(tarjeta), HttpStatus.OK);
}
}
...@@ -26,7 +26,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -26,7 +26,7 @@ import org.springframework.transaction.annotation.Transactional;
@Component @Component
public class ServicioUjaBankImpl implements ServicioUjaBank { public class ServicioUjaBankImpl implements ServicioUjaBank {
private Random rand = new Random(); public static Random rand = new Random();
@Autowired @Autowired
private RepositorioClientes repoClientes; private RepositorioClientes repoClientes;
...@@ -159,6 +159,14 @@ public class ServicioUjaBankImpl implements ServicioUjaBank { ...@@ -159,6 +159,14 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
} }
//SOLO PARA TESTS
public void asignarSaldoManual(Cuenta cuenta, float saldo){
cuenta.setSaldo(saldo);
repoCuentas.actualizar(cuenta);
}
private String generadorCuentasNuevas() { private String generadorCuentasNuevas() {
boolean numeroValido = false; boolean numeroValido = false;
...@@ -196,12 +204,4 @@ public class ServicioUjaBankImpl implements ServicioUjaBank { ...@@ -196,12 +204,4 @@ public class ServicioUjaBankImpl implements ServicioUjaBank {
} }
//SOLO PARA TESTS
public void asignarSaldoManual(Cuenta cuenta, float saldo){
cuenta.setSaldo(saldo);
repoCuentas.actualizar(cuenta);
}
} }
/*
* 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.entidadesDTO;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import org.springframework.hateoas.Link;
/**
* Clase cliente de UjaBank
*
* @author Adrian
*/
public class ClienteDTO {
private String dni;
private String nombre;
private LocalDate fechaNacimiento;
private String direccion;
private String telefono;
private String email;
private String clave;
private List<Link> cuentasAsociadas;
private List<Link> tarjetasAsociadas;
public ClienteDTO() {
}
public ClienteDTO(String dni, String nombre, LocalDate fechaNacimiento, String direccion, String telefono, String email, String clave) {
this.dni = dni;
this.nombre = nombre;
this.fechaNacimiento = fechaNacimiento;
this.direccion = direccion;
this.telefono = telefono;
this.email = email;
this.clave = clave;
this.cuentasAsociadas = new ArrayList<>();
this.tarjetasAsociadas = new ArrayList<>();
}
public String getDni() {
return dni;
}
public String getNombre() {
return nombre;
}
public LocalDate getFechaNacimiento() {
return fechaNacimiento;
}
public String getDireccion() {
return direccion;
}
public String getTelefono() {
return telefono;
}
public String getEmail() {
return email;
}
public String getClave() {
return clave;
}
public List<Link> getCuentasAsociadas() {
return cuentasAsociadas;
}
public List<Link> getTarjetasAsociadas() {
return tarjetasAsociadas;
}
public void añadirCuenta(Link cuenta){
cuentasAsociadas.add(cuenta);
}
public void añadirTarjeta(Link tarjeta){
cuentasAsociadas.add(tarjeta);
}
}
/*
* 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.entidadesDTO;
import es.ujaen.dae.ujacoin.entidades.Cliente;
import es.ujaen.dae.ujacoin.excepciones.CuentaNoValida;
import org.springframework.hateoas.Link;
/**
* Cuenta de UjaCoins
*
* @author Adrian
*/
public class CuentaDTO {
private String numero;
private float saldo;
public CuentaDTO() {
}
public CuentaDTO(String numero, float saldo) {
if (!checkNumeroCuenta(numero)) {
throw new CuentaNoValida();
}
this.numero = numero;
this.saldo = saldo;
}
public String getNumero() {
return numero;
}
public float getSaldo() {
return saldo;
}
/**
* Comprueba que el número de cuenta es válido, 12 dígitos numéricos, los
* dos últimos dígitos son la suma de los anteriores modulo 100.
*
* @param numero Numero de cuenta a comprobar
* @return True si el número es válido, false en otro caso
*/
public static boolean checkNumeroCuenta(String numero) {
if (numero.matches("[0-9]+") && numero.length() == 10) {
int suma = 0;
int codigoSeguridad = Integer.parseInt(numero.substring(8, 10));
for (int i = 0; i < 8; i++) {
suma += Integer.parseInt(numero.substring(i, i + 1));
}
if (suma % 100 == codigoSeguridad) {
return true;
}
}
return false;
}
}
/*
* 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.entidadesDTO;
import es.ujaen.dae.ujacoin.util.TipoMovimiento;
import java.time.LocalDateTime;
/**
* Movimientos asociados a las cuentas
*
* @author Adrian
*/
public class MovimientoDTO {
private int identificador;
private TipoMovimiento tipo;
private float importe;
private LocalDateTime fechaHora;
private String tarjetaCuenta;
public MovimientoDTO() {
}
public MovimientoDTO(int identificador, TipoMovimiento tipo, float importe, LocalDateTime fechaHora, String tarjetaCuenta) {
this.identificador = identificador;
this.tipo = tipo;
this.importe = importe;
this.fechaHora = fechaHora;
this.tarjetaCuenta = tarjetaCuenta;
}
public MovimientoDTO(TipoMovimiento tipo, float importe, LocalDateTime fechaHora, String tarjetaCuenta) {
this.tipo = tipo;
this.importe = importe;
this.fechaHora = fechaHora;
}
public TipoMovimiento getTipo() {
return tipo;
}
public float getImporte() {
return importe;
}
public String getTarjetaCuenta() {
return tarjetaCuenta;
}
public int getIdentificador() {
return identificador;
}
public LocalDateTime getFechaHora() {
return fechaHora;
}
}
/*
* 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.entidadesDTO;
import java.time.LocalDate;
import java.util.Random;
/**
* Tarjetas de crédito asociadas a clientes
*
* @author Adrian
*/
public class TarjetaDTO {
private String numero;
private String titular;
private String cvc;
private LocalDate fechaCaducidad;
public TarjetaDTO() {
}
private static Random rand = new Random();
public TarjetaDTO(String numero, String titular, String cvc, LocalDate fechaCaducidad) {
this.numero = numero;
this.titular = titular;
this.cvc = cvc;
this.fechaCaducidad = fechaCaducidad;
}
public String getNumero() {
return numero;
}
public String getTitular() {
return titular;
}
public String getCvc() {
return cvc;
}
public LocalDate getFechaCaducidad() {
return fechaCaducidad;
}
/**
* Comprueba que el número de tarjeta es válido, 8 dígitos numéricos, la
* suma de los dígitos tiene que ser multiplo de 4.
*
* @param numero Numero de tarjeta a comprobar
* @return True si el número es válido, false en otro caso
*/
public static boolean checkNumeroTarjeta(String numero) {
if (numero.matches("[0-9]+") && numero.length() == 8) {
int suma = 0;
for (int i = 0; i < numero.length(); i++) {
suma += Integer.parseInt(numero.substring(i, i + 1));
}
if (suma % 4 == 0) {
return true;
}
}
return false;
}
public static String generadorTarjetasNuevas() {
boolean numeroValido = false;
String numeroCadena;
do {
int numero = rand.nextInt(99999999);
numeroCadena = String.valueOf(numero);
for (int i = numeroCadena.length(); i < 8; i++) {
numeroCadena = "0".concat(numeroCadena);
}
int codigo = 0;
for (int i = 0; i < 8; i++) {
codigo += Integer.parseInt(numeroCadena.substring(i, i + 1));
}
codigo = codigo % 4;
if ((numero % 10) > 5) {
numero -= codigo;
} else {
numero += 4 - codigo;
}
numeroCadena = String.valueOf(numero);
for (int i = numeroCadena.length(); i < 8; i++) {
numeroCadena = "0".concat(numeroCadena);
}
} while (!numeroValido);
return numeroCadena;
}
}
#SQLite spring.jpa.database-platform = org.hibernate.dialect.MySQL55Dialect
spring.jpa.database-platform=com.springboot.sqlite.SQLDialect spring.jpa.hibernate.ddl-auto= update
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url = jdbc:sqlite:sqlitesample.db spring.datasource.url = jdbc:mysql://176.31.162.158:3306/DAE2020G9
spring.datasource.driver-class-name = org.sqlite.JDBC spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
spring.datasource.username = spring.datasource.username = DAE2020G9
spring.datasource.password = spring.datasource.password = DAE2020G9
#MySQL
#spring.jpa.hibernate.ddl-auto= update
#spring.datasource.url = jdbc:mysql://176.31.162.158:3306/DAE2020GX
#spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
#spring.datasource.username = DAE2020GX
#spring.datasource.password = DAE2020GX
\ No newline at end of file
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