Encrypt passwords, Controller+DAO & db bash script

This commit is contained in:
devfzn 2023-09-03 16:06:35 -03:00
parent 96961bb1e5
commit 545f36dc02
Signed by: devfzn
GPG Key ID: E070ECF4A754FDB1
23 changed files with 804 additions and 118 deletions

1
.gitignore vendored
View File

@ -4,3 +4,4 @@
.settings/
bin/
target/*/
*.bak

View File

@ -63,6 +63,7 @@ DBADDR=address
DBNAME=database
DBUSER=user
DBPASS=password
PEPPER=random-string
```
#### Modelo entidad relación
@ -73,26 +74,26 @@ DBPASS=password
```mermaid
erDiagram
HUESPED ||..o{ RESERVA : tiene
HUESPED {
id int PK "NN"
nombre varchar
apellido varchar
fecha_nacimiento date "AAAA-MM-DD"
nacionalidad varchar
telefono varchar "+00 123456789"
}
RESERVA {
Id int PK "NN"
fecha_entrada date "AAAA-MM-DD"
fecha_salida date "AAAA-MM-DD"
valor int "Costo total de la reserva"
forma_pago varchar "debito, credito, efectivo, cheque"
id_huesped int FK "Huesped a quien pertenece la reserva"
}
HUESPED {
id int PK
usuario varchar UK
nombre varchar
varchar apellido
fecha_nacimiento date "AAAA-MM-DD"
nacionalidad varchar
telefono varchar
password varchar
}
RESERVA {
id int PK
fecha_entrada date "AAAA-MM-DD"
fecha_salida date "AAAA-MM-DD"
valor double
forma_pago varchar "Débito, Crédito, Efectivo"
id_huesped int FK
}
```
<details>
<summary markdown="span">Database creation statement</summary>
@ -100,32 +101,39 @@ erDiagram
[SQL script](./database/creation_stmnt.sql)
```sql
CREATE DATABASE IF NOT EXISTS `hotel_alura` DEFAULT CHARACTER SET utf8mb4
COLLATE utf8mb4_general_ci;
CREATE DATABASE IF NOT EXISTS `hotel_alura`
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `hotel_alura`;
DELETE FROM `hotel_alura`.`huesped`;
DROP TABLE IF EXISTS `hotel_alura`.`reserva`;
DROP TABLE IF EXISTS `hotel_alura`.`huesped`;
CREATE TABLE IF NOT EXISTS `huesped` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`usuario` varchar(20) NOT NULL UNIQUE,
`nombre` varchar(20) NOT NULL,
`apellido` varchar(20) NOT NULL,
`fecha_nacimiento` date DEFAULT NULL,
`nacionalidad` varchar(20) DEFAULT NULL,
`fecha_nacimiento` date DEFAULT '1000-01-01',
`nacionalidad` varchar(20) DEFAULT 'chilena',
`telefono` varchar(20) NOT NULL,
`password` varchar(60) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `reserva` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`fecha_entrada` date NOT NULL,
`fecha_salida` date NOT NULL,
`valor` double NOT NULL,
`forma_pago` varchar(20) NOT NULL,
`id_huesped` int(11) NOT NULL,
`id_huesped` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `id_huesped_idx` (`id_huesped`),
CONSTRAINT `id_huesped` FOREIGN KEY (`id_huesped`) REFERENCES `huesped` (`id`)
CONSTRAINT `id_huesped` FOREIGN KEY (`id_huesped`)
REFERENCES `huesped` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_general_ci;
@ -147,4 +155,3 @@ etiqueta **challengeonehotelaluralatam4** ¿5?
:blue_heart: <strong>Alura Latam</strong></br>
[<img src="https://img.shields.io/badge/-LinkedIn-%230077B5?style=for-the-badge&logo=linkedin&logoColor=white" target="_blank">](https://www.linkedin.com/company/alura-latam/mycompany/)

17
createdb.sh Executable file
View File

@ -0,0 +1,17 @@
#!/usr/bin/env bash
VersionStr='2023-09-02'
rutaprgrm=$(dirname $(realpath -s $0))
while read line; do
declare "$line" 2>/dev/null
done < $rutaprgrm/.env
mysql -u ${DBUSER} \
-p${DBPASS} \
-h ${DBADDR%%:*} ${DBNAME} \
-P ${DBADDR##*:} < ./database/create_populate.sql &>/dev/null && \
echo "DB creada y poblada" || \
echo "Ocurrio un error al intentar crear y/o poblar la DB"
unset DBNAME DBUSER DBPASS DBADDR

View File

@ -0,0 +1,57 @@
-- Creación de base de datos para hotel alura
CREATE DATABASE IF NOT EXISTS `hotel_alura`
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `hotel_alura`;
DELETE FROM `hotel_alura`.`huesped`;
DROP TABLE IF EXISTS `hotel_alura`.`reserva`;
DROP TABLE IF EXISTS `hotel_alura`.`huesped`;
CREATE TABLE IF NOT EXISTS `huesped` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`usuario` varchar(20) NOT NULL UNIQUE,
`nombre` varchar(20) NOT NULL,
`apellido` varchar(20) NOT NULL,
`fecha_nacimiento` date DEFAULT '1000-01-01',
`nacionalidad` varchar(20) DEFAULT 'chilena',
`telefono` varchar(20) NOT NULL,
`password` varchar(60) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `reserva` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`fecha_entrada` date NOT NULL,
`fecha_salida` date NOT NULL,
`valor` double NOT NULL,
`forma_pago` varchar(20) NOT NULL,
`id_huesped` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `id_huesped_idx` (`id_huesped`),
CONSTRAINT `id_huesped` FOREIGN KEY (`id_huesped`) REFERENCES `huesped` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
-- Borrado de registros
DELETE FROM `hotel_alura`.`huesped`;
-- Creación de usuarios y reservas de prueba
INSERT INTO `hotel_alura`.`huesped`(usuario, nombre, apellido, telefono, password)
VALUES('Usuario1', 'Primer', 'Huesped', '+56 123456789',
'$2a$12$Pt7d9sZxHMZHfGivVgrVvergqz.VBNFY5.oJa8g9CK3lst7/Pqeuu');
INSERT INTO `hotel_alura`.`huesped`(usuario, nombre, apellido, telefono, password)
VALUES('Usuario2', 'Segundo', 'Huesped', '+56 123456789',
'$2a$12$Pt7d9sZxHMZHfGivVgrVvergqz.VBNFY5.oJa8g9CK3lst7/Pqeuu');
INSERT INTO `hotel_alura`.`huesped`(usuario, nombre, apellido, telefono, password)
VALUES('Usuario3', 'Tercer', 'Huesped', '+56 123456789',
'$2a$12$Pt7d9sZxHMZHfGivVgrVvergqz.VBNFY5.oJa8g9CK3lst7/Pqeuu');
INSERT INTO `hotel_alura`.`reserva`(fecha_entrada, fecha_salida, valor, forma_pago, id_huesped)
VALUES('2023-09-01', '2023-09-03', 90000.00, 'efectivo', 1);
INSERT INTO `hotel_alura`.`reserva`(fecha_entrada, fecha_salida, valor, forma_pago, id_huesped)
VALUES('2023-09-04', '2023-09-05', 60000.00, 'crédito', 2);
INSERT INTO `hotel_alura`.`reserva`(fecha_entrada, fecha_salida, valor, forma_pago, id_huesped)
VALUES('2023-09-07', '2023-09-10', 120000.00, 'débito', 3);
INSERT INTO `hotel_alura`.`reserva`(fecha_entrada, fecha_salida, valor, forma_pago, id_huesped)
VALUES('2023-09-11', '2023-09-21', 330000.00, 'crédito', 1);

View File

@ -1,25 +1,35 @@
CREATE DATABASE IF NOT EXISTS `hotel_alura` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
-- Creación de base de datos para hotel alura
CREATE DATABASE IF NOT EXISTS `hotel_alura`
DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
USE `hotel_alura`;
DELETE FROM `hotel_alura`.`huesped`;
DROP TABLE IF EXISTS `hotel_alura`.`reserva`;
DROP TABLE IF EXISTS `hotel_alura`.`huesped`;
CREATE TABLE IF NOT EXISTS `huesped` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`usuario` varchar(20) NOT NULL UNIQUE,
`nombre` varchar(20) NOT NULL,
`apellido` varchar(20) NOT NULL,
`fecha_nacimiento` date DEFAULT NULL,
`nacionalidad` varchar(20) DEFAULT NULL,
`fecha_nacimiento` date DEFAULT '1000-01-01',
`nacionalidad` varchar(20) DEFAULT 'chilena',
`telefono` varchar(20) NOT NULL,
`password` varchar(60) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
CREATE TABLE IF NOT EXISTS `reserva` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`fecha_entrada` date NOT NULL,
`fecha_salida` date NOT NULL,
`valor` double NOT NULL,
`forma_pago` varchar(20) NOT NULL,
`id_huesped` int(11) NOT NULL,
`id_huesped` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `id_huesped_idx` (`id_huesped`),
CONSTRAINT `id_huesped` FOREIGN KEY (`id_huesped`) REFERENCES `huesped` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
CONSTRAINT `id_huesped` FOREIGN KEY (`id_huesped`) REFERENCES `huesped` (`id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

Binary file not shown.

View File

@ -47,6 +47,11 @@
<artifactId>dotenv-java</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.4</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src</sourceDirectory>

View File

@ -0,0 +1,26 @@
package cl.com.alura.hotel.controller;
import java.util.List;
import cl.com.alura.hotel.dao.HuespedDAO;
import cl.com.alura.hotel.factory.ConnectionFactory;
import cl.com.alura.hotel.modelo.Huesped;
public class HuespedController {
private HuespedDAO huespedDAO;
public HuespedController() {
ConnectionFactory factory = new ConnectionFactory();
this.huespedDAO = new HuespedDAO(factory.getConexion());
}
public List<Huesped> listar(Huesped huesped) {
return huespedDAO.listar(huesped.getId());
}
// public List<Huesped> cargaReporte() {
// return this.huespedDAO.listarConReservas();
// }
}

View File

@ -0,0 +1,39 @@
package cl.com.alura.hotel.controller;
import java.util.List;
import cl.com.alura.hotel.factory.ConnectionFactory;
import cl.com.alura.hotel.dao.ReservaDAO;
import cl.com.alura.hotel.modelo.Huesped;
import cl.com.alura.hotel.modelo.Reserva;
public class ReservaController {
private ReservaDAO reservaDAO;
public ReservaController() {
this.reservaDAO = new ReservaDAO(new ConnectionFactory().getConexion());
}
public int modificar(Reserva reserva) {
return reservaDAO.modificar(reserva);
}
public int eliminar(Integer id) {
return reservaDAO.eliminar(id);
}
public List<Reserva> listar() {
return reservaDAO.listar(0);
}
public List<Reserva> listar(Huesped huesped) {
return reservaDAO.listar(huesped.getId());
}
public void guardar(Reserva reserva, Integer huespedId) {
reserva.setIdHuesped(huespedId);
reservaDAO.guardar(reserva);
}
}

View File

@ -0,0 +1,60 @@
package cl.com.alura.hotel.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import cl.com.alura.hotel.modelo.Huesped;
public class HuespedDAO {
private final Connection con;
public HuespedDAO(Connection conexion) {
this.con = conexion;
}
public List<Huesped> listar(Integer huesped_id) {
final String query;
if (huesped_id != 0) {
query = "SELECT * FROM huesped WHERE id=?;";
} else {
query = "SELECT * FROM huesped;";
}
List<Huesped> resultado = new ArrayList<>();
try {
final PreparedStatement statement;
if (huesped_id != 0) {
statement = con.prepareStatement(query);
statement.setInt(1, huesped_id);
System.out.println(statement.toString());
} else {
statement = con.prepareStatement(query);
System.out.println(statement.toString());
}
try (statement) {
statement.execute();
ResultSet resultSet = statement.getResultSet();
while (resultSet.next()) {
Huesped fila = new Huesped(
resultSet.getInt("id"),
resultSet.getString("usuario"),
resultSet.getString("nombre"),
resultSet.getString("apellido"),
resultSet.getDate("fecha_nacimiento"),
resultSet.getString("nacionalidad"),
resultSet.getString("telefono")
);
resultado.add(fila);
}
return resultado;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,156 @@
package cl.com.alura.hotel.dao;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import cl.com.alura.hotel.modelo.Reserva;
//import cl.com.alura.hotel.modelo.Huesped;
public class ReservaDAO {
private final Connection con;
public ReservaDAO(Connection conexion) {
this.con = conexion;
}
public void guardar(Reserva reserva) {
final String query = "INSERT INTO reserva(huesped_id,checkin,checkout,valor,pago)"
+ "VALUES(?,?,?,?)";
try {
final PreparedStatement statement = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
try (statement) {
ejecutaRegistro(reserva, statement);
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
private void ejecutaRegistro(Reserva reserva, PreparedStatement statement)
throws SQLException {
statement.setInt(1, reserva.getIdHuesped());
statement.setDate(2, (Date) reserva.getFechaEntrada());
statement.setDate(3, (Date) reserva.getFechaSalida());
statement.setDouble(4, reserva.getValor());
statement.setString(5, reserva.getFormaPago());
statement.execute();
final ResultSet resultSet = statement.getGeneratedKeys();
try (resultSet) {
while (resultSet.next()) {
reserva.setId(resultSet.getInt(1));
System.out.println(String.format("Reserva agregada %s: ", reserva));
}
}
}
public List<Reserva> listar(Integer huesped_id) {
final String query;
if (huesped_id != 0) {
query = "SELECT * FROM reserva WHERE id_huesped=?;";
} else {
query = "SELECT * FROM reserva;";
}
List<Reserva> resultado = new ArrayList<>();
try {
final PreparedStatement statement;
if (huesped_id != 0) {
statement = con.prepareStatement(query);
statement.setInt(1, huesped_id);
System.out.println(statement.toString());
} else {
statement = con.prepareStatement(query);
System.out.println(statement.toString());
}
try (statement) {
statement.execute();
ResultSet resultSet = statement.getResultSet();
while (resultSet.next()) {
Reserva fila = new Reserva(
resultSet.getInt("id"),
resultSet.getDate("fecha_entrada"),
resultSet.getDate("fecha_salida"),
resultSet.getDouble("valor"),
resultSet.getString("forma_pago"),
resultSet.getInt("id_huesped")
);
resultado.add(fila);
}
return resultado;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public int modificar(Reserva reserva) {
try {
final String query = "UPDATE categoria SET valor=? WHERE id=?;";
final PreparedStatement statement = con.prepareStatement(query);
try (statement) {
statement.setInt(1, reserva.getId());
statement.setDouble(2, reserva.getValor());
statement.execute();
int resultado = statement.getUpdateCount();
return resultado;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
public int eliminar(Integer id) {
try {
final PreparedStatement statement = con.prepareStatement("DELETE FROM reserva WHERE id=?;");
try (statement) {
statement.setInt(1, id);
statement.execute();
int resultado = statement.getUpdateCount();
return resultado;
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
// public List<Reserva> listarConProductos() {
// List<Reserva> resultado = new ArrayList<>();
// final String query = "SELECT C.ID, C.NOMBRE, P.ID, P.NOMBRE, P.CANTIDAD FROM categoria C "
// + "INNER JOIN producto P ON C.ID = P.CATEGORIA_ID ";
// System.out.println(query);
// try {
// final PreparedStatement statement = con.prepareStatement(query);
// try (statement) {
// statement.execute();
// final ResultSet resultSet = statement.getResultSet();
// try (resultSet){
// while (resultSet.next()) {
// Integer categoriaId = resultSet.getInt("C.ID");
// String categoriaNombre = resultSet.getString("C.NOMBRE");
// var categoria = resultado
// .stream()
// .filter(cat -> cat.getId().equals(categoriaId))
// .findAny().orElseGet(() -> {
// Categoria cat = new Categoria(categoriaId, categoriaNombre);
// resultado.add(cat);
// return cat;
// });
// Reserva producto = new Reserva(resultSet.getInt("P.ID"),
// resultSet.getString("P.NOMBRE"),
// resultSet.getInt("P.CANTIDAD"));
// categoria.agregar(producto);
// }
// };
// }
// } catch (SQLException e) {
// throw new RuntimeException(e);
// }
// return resultado;
// }
}

View File

@ -4,7 +4,8 @@ import java.sql.Connection;
import javax.sql.DataSource;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import io.github.cdimascio.dotenv.Dotenv;
import cl.com.alura.hotel.utils.GetEnvVars;
public class ConnectionFactory {
@ -15,14 +16,13 @@ public class ConnectionFactory {
private DataSource datasource;
public ConnectionFactory() {
Dotenv dotenv = Dotenv.load();
dbname = dotenv.get("DBNAME");
dbaddr = dotenv.get("DBADDR");
dbname = GetEnvVars.getDbname();
dbaddr = GetEnvVars.getDbaddr();
final String dburl = driver + dbaddr +"/"+ dbname + params;
var pooledDataSource = new ComboPooledDataSource();
pooledDataSource.setJdbcUrl(dburl);
pooledDataSource.setUser(dotenv.get("DBUSER"));
pooledDataSource.setPassword(dotenv.get("DBPASS"));
pooledDataSource.setUser(GetEnvVars.getDbuser());
pooledDataSource.setPassword(GetEnvVars.getDbpass());
pooledDataSource.setMaxPoolSize(500);
this.datasource = pooledDataSource;
}

View File

@ -7,16 +7,31 @@ import java.util.List;
public class Huesped {
private Integer id;
private Integer nombre;
private Integer apellido;
private String usuario;
private String nombre;
private String apellido;
private Date fechaNacimiento;
private String nacionalidad;
private String telefono;
private String password;
private List<Reserva> reservas;
public Huesped(Integer id, Integer nombre, Integer apellido, Date fechaNacimiento,
String nacionalidad, String telefono) {
public Huesped(Integer id, String usuario, String nombre, String apellido,
Date fechaNacimiento, String nacionalidad, String telefono,
String password) {
this.id = id;
this.usuario = usuario;
this.nombre = nombre;
this.apellido = apellido;
this.fechaNacimiento = fechaNacimiento;
this.nacionalidad = nacionalidad;
this.telefono = telefono;
this.password = password;
}
public Huesped(String usuario, String nombre, String apellido,
Date fechaNacimiento, String nacionalidad, String telefono) {
this.usuario = usuario;
this.nombre = nombre;
this.apellido = apellido;
this.fechaNacimiento = fechaNacimiento;
@ -24,6 +39,38 @@ public class Huesped {
this.telefono = telefono;
}
public Huesped(String usuario, String nombre, String apellido,
String nacionalidad, String telefono, String password) {
this.usuario = usuario;
this.nombre = nombre;
this.apellido = apellido;
this.nacionalidad = nacionalidad;
this.telefono = telefono;
this.password = password;
}
public Huesped(Integer id, String usuario, String nombre, String apellido,
Date fechaNacimiento, String password, String telefono) {
this.id = id;
this.usuario = usuario;
this.nombre = nombre;
this.apellido = apellido;
this.fechaNacimiento = fechaNacimiento;
this.telefono = telefono;
this.password = password;
}
public Huesped(String usuario, String nombre, String apellido,
String telefono, String password) {
this.usuario = usuario;
this.nombre = nombre;
this.apellido = apellido;
this.telefono = telefono;
this.password = password;
}
public Huesped() {}
public Integer getId() {
return id;
}
@ -32,22 +79,38 @@ public class Huesped {
this.id = id;
}
public Integer getNombre() {
public String getUsuario() {
return usuario;
}
public void setUsuario(String usuario) {
this.usuario = usuario;
}
public String getNombre() {
return nombre;
}
public void setNombre(Integer nombre) {
public void setNombre(String nombre) {
this.nombre = nombre;
}
public Integer getApellido() {
public String getApellido() {
return apellido;
}
public void setApellido(Integer apellido) {
public void setApellido(String apellido) {
this.apellido = apellido;
}
public void setPassword(String password) {
this.password = password;
}
public String getPassword() {
return this.password;
}
public Date getFechaNacimiento() {
return fechaNacimiento;
}
@ -83,5 +146,15 @@ public class Huesped {
this.reservas.add(reserva);
}
// TODO toString();
@Override
public String toString() {
return "Huesped [" + (id != null ? "id=" + id + ", " : "")
+ (usuario != null ? "usuario=" + usuario + ", " : "")
+ (nombre != null ? "nombre=" + nombre + ", " : "")
+ (apellido != null ? "apellido=" + apellido + ", " : "")
+ (fechaNacimiento != null ? "fechaNacimiento=" + fechaNacimiento + ", " : "")
+ (nacionalidad != null ? "nacionalidad=" + nacionalidad + ", " : "")
+ (telefono != null ? "telefono=" + telefono : "") + "]";
}
}

View File

@ -20,6 +20,8 @@ public class Reserva {
this.idHuesped = idHuesped;
}
public Reserva() {}
public Integer getId() {
return id;
}
@ -68,5 +70,13 @@ public class Reserva {
this.idHuesped = idHuesped;
}
// TODO toString();
@Override
public String toString() {
return "Reserva [" + (idHuesped != null ? "idHuesped=" + idHuesped + ", " : "")
+ (id != null ? "id=" + id + ", " : "")
+ (fechaEntrada != null ? "fechaEntrada=" + fechaEntrada + ", " : "")
+ (fechaSalida != null ? "fechaSalida=" + fechaSalida + ", " : "")
+ (valor != null ? "valor=" + valor + ", " : "") + (formaPago != null ? "formaPago=" + formaPago : "")
+ "]";
}
}

View File

@ -0,0 +1,21 @@
package cl.com.alura.hotel.pruebas;
import cl.com.alura.hotel.utils.PassEncrypt;
public class PruebaEncryptPass {
public static void main(String[] args) {
String password = "ést@ és 1 pru3ba!";
String password2 = "ést@";
String hashed = PassEncrypt.passEncrypt(password);
String hashed2 = PassEncrypt.passEncrypt(password2);
String hashed3 = PassEncrypt.passEncrypt("test");
System.out.println(PassEncrypt.passMatch(password, hashed)); // true
System.out.println(PassEncrypt.passMatch(password, hashed2)); // false
System.out.println(PassEncrypt.passMatch("test", hashed3)); // true
}
}

View File

@ -0,0 +1,42 @@
package cl.com.alura.hotel.pruebas;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import cl.com.alura.hotel.factory.ConnectionFactory;
import cl.com.alura.hotel.modelo.Huesped;
import cl.com.alura.hotel.utils.PassEncrypt;
public class PruebaQueryInsert {
public static void main(String[] args) {
Huesped huesped = new Huesped("UsuarioTest", "NombreTest", "ApellidoTest",
"+56 987654321", "test");
String query = "INSERT INTO huesped(usuario, nombre, apellido, telefono, password)"
+ " VALUES(?,?,?,?,?);";
try {
Connection con = new ConnectionFactory().getConexion();
final PreparedStatement stmnt = con.prepareStatement(query);
stmnt.setString(1, huesped.getUsuario());
stmnt.setString(2, huesped.getNombre());
stmnt.setString(3, huesped.getApellido());
stmnt.setString(4, huesped.getTelefono());
stmnt.setString(5, PassEncrypt.passEncrypt(huesped.getPassword()));
System.out.println(stmnt.toString());
stmnt.execute();
int resultado = stmnt.getUpdateCount();
System.out.println(resultado+" huesped registrado");
} catch (SQLException e) {
if (e.getSQLState().startsWith("23")) {
System.out.println("Usuario ya existe");
} else {
e.printStackTrace();
//throw new RuntimeException(e);
}
}
}
}

View File

@ -0,0 +1,57 @@
package cl.com.alura.hotel.pruebas;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import com.mysql.cj.jdbc.result.ResultSetMetaData;
import cl.com.alura.hotel.factory.ConnectionFactory;
public class PruebaQueryJoin {
public static void main(String[] args) throws SQLException {
Connection con = new ConnectionFactory().getConexion();
String query = "SELECT H.id, H.usuario, R.valor, R.forma_pago,"
+ " DATEDIFF(R.fecha_salida, R.fecha_entrada)+1 AS estadia"
+ " FROM huesped H INNER JOIN reserva R on R.id_huesped = H.id"
+ " ORDER BY id;";
System.out.println(query);
final PreparedStatement stmnt = con.prepareStatement(query);
stmnt.execute();
final ResultSet resultSet = stmnt.getResultSet();
printResult(resultSet);
}
public static void printResult(ResultSet result) throws SQLException {
ResultSetMetaData rsmd = (ResultSetMetaData) result.getMetaData();
int colsNum = rsmd.getColumnCount();
for (int i = 1; i <= colsNum; i++) {
if (i > 1) System.out.print(" ");
String header = "| "+rsmd.getColumnName(i);
System.out.print(padRight(header.toUpperCase(), 12));
if (i == colsNum) System.out.println(" |");
}
while (result.next()) {
for (int i = 1; i <= colsNum; i++) {
if (i > 1) System.out.print(" ");
String columnValue = result.getString(i);
System.out.print("| "+ padLeft(columnValue, 10));
if (i == colsNum) System.out.print(" |");
}
System.out.println("");
}
}
public static String padRight(String s, int n) {
return String.format("%-" + n + "s", s);
}
public static String padLeft(String s, int n) {
return String.format("%" + n + "s", s);
}
}

View File

@ -0,0 +1,46 @@
package cl.com.alura.hotel.pruebas;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import cl.com.alura.hotel.factory.ConnectionFactory;
import cl.com.alura.hotel.modelo.Huesped;
import cl.com.alura.hotel.utils.PassEncrypt;
public class PruebaQuerySelect {
@SuppressWarnings("static-access")
public static void main(String[] args) {
new PruebaQueryInsert().main(null);;
String query = "SELECT * FROM huesped WHERE usuario=?;";
try {
Connection con = new ConnectionFactory().getConexion();
final PreparedStatement stmnt = con.prepareStatement(query);
stmnt.setString(1, "UsuarioTest");
System.out.println(stmnt.toString());
stmnt.execute();
final ResultSet resultSet = stmnt.getResultSet();
Huesped huesped = new Huesped();
while (resultSet.next()) {
if (PassEncrypt.passMatch("test",resultSet.getString("password"))) {
huesped.setId(resultSet.getInt("id"));
huesped.setNombre(resultSet.getString("usuario"));
huesped.setNombre(resultSet.getString("nombre"));
huesped.setApellido(resultSet.getString("apellido"));
huesped.setFechaNacimiento(resultSet.getDate("fecha_nacimiento"));
huesped.setNacionalidad(resultSet.getString("nacionalidad"));
huesped.setTelefono(resultSet.getString("telefono"));
System.out.println(huesped.toString());
} else {
System.out.println("Verifica el nombre y/o contraseña");
}
}
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}

View File

@ -0,0 +1,28 @@
package cl.com.alura.hotel.pruebas;
import cl.com.alura.hotel.controller.HuespedController;
import cl.com.alura.hotel.controller.ReservaController;
import cl.com.alura.hotel.modelo.Huesped;
public class PruebasDao {
public static void main(String[] args) {
HuespedController huespedControler = new HuespedController();
Huesped huesped = new Huesped();
huesped.setId(0);
var huesped_list = huespedControler.listar(huesped);
huesped_list.forEach(huesped_ -> System.out.println(huesped_));
huesped.setId(1);
var huesped_info = huespedControler.listar(huesped);
huesped_info.forEach(huesped_ -> System.out.println(huesped_));
ReservaController reservaController = new ReservaController();
var reservas = reservaController.listar();
reservas.forEach(reserva_ -> System.out.println(reserva_));
var reserva_huesped = reservaController.listar(huesped);
reserva_huesped.forEach(reserva_ -> System.out.println(reserva_));
}
}

View File

@ -0,0 +1,33 @@
package cl.com.alura.hotel.utils;
import io.github.cdimascio.dotenv.Dotenv;
public abstract class GetEnvVars {
private final static Dotenv dotenv = Dotenv.load();
private final static String dbname = dotenv.get("DBNAME");
private final static String dbaddr = dotenv.get("DBADDR");
private final static String dbuser = dotenv.get("DBUSER");
private final static String dbpass = dotenv.get("DBPASS");
private final static String pepper = dotenv.get("PEPPER");
public static String getDbname() {
return dbname;
}
public static String getDbaddr() {
return dbaddr;
}
public static String getDbuser() {
return dbuser;
}
public static String getDbpass() {
return dbpass;
}
public static String getPepper() {
return pepper;
}
}

View File

@ -0,0 +1,16 @@
package cl.com.alura.hotel.utils;
import org.mindrot.jbcrypt.BCrypt;
public abstract class PassEncrypt {
private final static String pepper = GetEnvVars.getPepper();
public final static String passEncrypt(String password) {
return BCrypt.hashpw(password, BCrypt.gensalt(12) + pepper);
}
public final static Boolean passMatch(String candidate, String password) {
return BCrypt.checkpw(candidate, password);
}
}

View File

@ -32,7 +32,7 @@ public class RegistroHuesped extends JFrame {
private JTextField txtNombre;
private JTextField txtApellido;
private JTextField txtTelefono;
private JTextField txtNreserva;
private JTextField txtNombreUsuario;
private JDateChooser txtFechaN;
private JComboBox<Format> txtNacionalidad;
private JLabel labelExit;
@ -128,7 +128,7 @@ public class RegistroHuesped extends JFrame {
txtNombre = new JTextField();
txtNombre.setFont(new Font("Roboto", Font.PLAIN, 16));
txtNombre.setBounds(560, 135, 285, 33);
txtNombre.setBounds(598, 209, 243, 33);
txtNombre.setBackground(Color.WHITE);
txtNombre.setColumns(10);
txtNombre.setBorder(javax.swing.BorderFactory.createEmptyBorder());
@ -136,75 +136,72 @@ public class RegistroHuesped extends JFrame {
txtApellido = new JTextField();
txtApellido.setFont(new Font("Roboto", Font.PLAIN, 16));
txtApellido.setBounds(560, 204, 285, 33);
txtApellido.setBounds(598, 278, 243, 33);
txtApellido.setColumns(10);
txtApellido.setBackground(Color.WHITE);
txtApellido.setBorder(javax.swing.BorderFactory.createEmptyBorder());
contentPane.add(txtApellido);
txtFechaN = new JDateChooser();
txtFechaN.setBounds(560, 278, 285, 36);
txtFechaN.setBounds(558, 349, 287, 36);
txtFechaN.getCalendarButton()
.setIcon(new ImageIcon(RegistroHuesped.class.getResource("/imagenes/icon-reservas.png")));
txtFechaN.getCalendarButton().setBackground(SystemColor.textHighlight);
txtFechaN.setDateFormatString("yyyy-MM-dd");
txtFechaN.setFont(new Font("Roboto", Font.PLAIN, 18));
contentPane.add(txtFechaN);
txtNacionalidad = new JComboBox();
txtNacionalidad.setBounds(560, 350, 289, 36);
txtNacionalidad.setBounds(558, 423, 287, 36);
txtNacionalidad.setBackground(SystemColor.text);
txtNacionalidad.setFont(new Font("Roboto", Font.PLAIN, 16));
txtNacionalidad.setModel(new DefaultComboBoxModel(new String[] { "afgano-afgana", "alemán-", "alemana",
"árabe-árabe", "argentino-argentina", "australiano-australiana", "belga-belga", "boliviano-boliviana",
"brasileño-brasileña", "camboyano-camboyana", "canadiense-canadiense", "chileno-chilena", "chino-china",
"colombiano-colombiana", "coreano-coreana", "costarricense-costarricense", "cubano-cubana",
"danés-danesa", "ecuatoriano-ecuatoriana", "egipcio-egipcia", "salvadoreño-salvadoreña",
"escocés-escocesa", "español-española", "estadounidense-estadounidense", "estonio-estonia",
"etiope-etiope", "filipino-filipina", "finlandés-finlandesa", "francés-francesa", "galés-galesa",
"griego-griega", "guatemalteco-guatemalteca", "haitiano-haitiana", "holandés-holandesa",
"hondureño-hondureña", "indonés-indonesa", "inglés-inglesa", "iraquí-iraquí", "iraní-iraní",
"irlandés-irlandesa", "israelí-israelí", "italiano-italiana", "japonés-japonesa", "jordano-jordana",
"laosiano-laosiana", "letón-letona", "letonés-letonesa", "malayo-malaya", "marroquí-marroquí",
"mexicano-mexicana", "nicaragüense-nicaragüense", "noruego-noruega", "neozelandés-neozelandesa",
"panameño-panameña", "paraguayo-paraguaya", "peruano-peruana", "polaco-polaca", "portugués-portuguesa",
"puertorriqueño-puertorriqueño", "dominicano-dominicana", "rumano-rumana", "ruso-rusa", "sueco-sueca",
"suizo-suiza", "tailandés-tailandesa", "taiwanes-taiwanesa", "turco-turca", "ucraniano-ucraniana",
"uruguayo-uruguaya", "venezolano-venezolana", "vietnamita-vietnamita" }));
txtNacionalidad.setModel(new DefaultComboBoxModel(new String[] { "afgana", "alemana",
"árabe", "argentina", "australiana", "belga", "boliviana", "brasileña",
"camboyana", "canadiense", "chilena", "china", "colombiana", "coreana",
"costarricense", "cubana", "danesa", "ecuatoriana", "egipcia", "salvadoreña",
"escocesa", "española", "estadounidense", "estonia", "etiope", "filipina",
"finlandesa", "francesa", "galesa", "griega", "guatemalteca", "haitiana",
"holandesa", "hondureña", "indonesa", "inglesa", "iraquí", "iraní", "irlandesa",
"israelí", "italiana", "japonesa", "jordana", "laosiana", "letona", "letonesa",
"malaya", "marroquí", "mexicana", "nicaragüense", "noruega", "neozelandesa",
"panameña", "paraguaya", "peruana", "polaca", "portuguesa", "puertorriqueño",
"dominicana", "rumana", "rusa", "sueca", "suizo-suiza", "tailandesa", "taiwanesa",
"turca", "ucraniana", "uruguaya", "venezolana", "vietnamita" }));
contentPane.add(txtNacionalidad);
JLabel lblNombre = new JLabel("NOMBRE");
lblNombre.setBounds(562, 119, 253, 14);
lblNombre.setBounds(558, 191, 253, 14);
lblNombre.setForeground(SystemColor.textInactiveText);
lblNombre.setFont(new Font("Roboto Black", Font.PLAIN, 18));
contentPane.add(lblNombre);
JLabel lblApellido = new JLabel("APELLIDO");
lblApellido.setBounds(560, 189, 255, 14);
lblApellido.setBounds(556, 259, 255, 14);
lblApellido.setForeground(SystemColor.textInactiveText);
lblApellido.setFont(new Font("Roboto Black", Font.PLAIN, 18));
contentPane.add(lblApellido);
JLabel lblFechaN = new JLabel("FECHA DE NACIMIENTO");
lblFechaN.setBounds(560, 256, 255, 14);
lblFechaN.setBounds(556, 323, 255, 14);
lblFechaN.setForeground(SystemColor.textInactiveText);
lblFechaN.setFont(new Font("Roboto Black", Font.PLAIN, 18));
contentPane.add(lblFechaN);
JLabel lblNacionalidad = new JLabel("NACIONALIDAD");
lblNacionalidad.setBounds(560, 326, 255, 14);
lblNacionalidad.setBounds(556, 397, 255, 14);
lblNacionalidad.setForeground(SystemColor.textInactiveText);
lblNacionalidad.setFont(new Font("Roboto Black", Font.PLAIN, 18));
contentPane.add(lblNacionalidad);
JLabel lblTelefono = new JLabel("TELÉFONO");
lblTelefono.setBounds(562, 406, 253, 14);
lblTelefono.setBounds(558, 477, 253, 14);
lblTelefono.setForeground(SystemColor.textInactiveText);
lblTelefono.setFont(new Font("Roboto Black", Font.PLAIN, 18));
contentPane.add(lblTelefono);
txtTelefono = new JTextField();
txtTelefono.setFont(new Font("Roboto", Font.PLAIN, 16));
txtTelefono.setBounds(560, 424, 285, 33);
txtTelefono.setBounds(598, 497, 243, 33);
txtTelefono.setColumns(10);
txtTelefono.setBackground(Color.WHITE);
txtTelefono.setBorder(javax.swing.BorderFactory.createEmptyBorder());
@ -216,52 +213,32 @@ public class RegistroHuesped extends JFrame {
lblTitulo.setFont(new Font("Roboto Black", Font.PLAIN, 23));
contentPane.add(lblTitulo);
JLabel lblNumeroReserva = new JLabel("NÚMERO DE RESERVA");
lblNumeroReserva.setBounds(560, 474, 253, 14);
lblNumeroReserva.setForeground(SystemColor.textInactiveText);
lblNumeroReserva.setFont(new Font("Roboto Black", Font.PLAIN, 18));
contentPane.add(lblNumeroReserva);
txtNreserva = new JTextField();
txtNreserva.setFont(new Font("Roboto", Font.PLAIN, 16));
txtNreserva.setBounds(560, 495, 285, 33);
txtNreserva.setColumns(10);
txtNreserva.setBackground(Color.WHITE);
txtNreserva.setBorder(javax.swing.BorderFactory.createEmptyBorder());
contentPane.add(txtNreserva);
JSeparator separator_1_2 = new JSeparator();
separator_1_2.setBounds(560, 170, 289, 2);
separator_1_2.setBounds(556, 244, 289, 2);
separator_1_2.setForeground(new Color(12, 138, 199));
separator_1_2.setBackground(new Color(12, 138, 199));
contentPane.add(separator_1_2);
JSeparator separator_1_2_1 = new JSeparator();
separator_1_2_1.setBounds(560, 240, 289, 2);
separator_1_2_1.setBounds(556, 314, 289, 2);
separator_1_2_1.setForeground(new Color(12, 138, 199));
separator_1_2_1.setBackground(new Color(12, 138, 199));
contentPane.add(separator_1_2_1);
JSeparator separator_1_2_2 = new JSeparator();
separator_1_2_2.setBounds(560, 314, 289, 2);
separator_1_2_2.setBounds(556, 386, 289, 2);
separator_1_2_2.setForeground(new Color(12, 138, 199));
separator_1_2_2.setBackground(new Color(12, 138, 199));
contentPane.add(separator_1_2_2);
JSeparator separator_1_2_3 = new JSeparator();
separator_1_2_3.setBounds(560, 386, 289, 2);
separator_1_2_3.setBounds(556, 461, 289, 2);
separator_1_2_3.setForeground(new Color(12, 138, 199));
separator_1_2_3.setBackground(new Color(12, 138, 199));
contentPane.add(separator_1_2_3);
JSeparator separator_1_2_4 = new JSeparator();
separator_1_2_4.setBounds(560, 457, 289, 2);
separator_1_2_4.setForeground(new Color(12, 138, 199));
separator_1_2_4.setBackground(new Color(12, 138, 199));
contentPane.add(separator_1_2_4);
JSeparator separator_1_2_5 = new JSeparator();
separator_1_2_5.setBounds(560, 529, 289, 2);
separator_1_2_5.setBounds(556, 537, 289, 2);
separator_1_2_5.setForeground(new Color(12, 138, 199));
separator_1_2_5.setBackground(new Color(12, 138, 199));
contentPane.add(separator_1_2_5);
@ -333,6 +310,26 @@ public class RegistroHuesped extends JFrame {
labelExit.setHorizontalAlignment(SwingConstants.CENTER);
labelExit.setForeground(SystemColor.black);
labelExit.setFont(new Font("Roboto", Font.PLAIN, 18));
txtNombreUsuario = new JTextField();
txtNombreUsuario.setBounds(598, 143, 243, 33);
contentPane.add(txtNombreUsuario);
txtNombreUsuario.setFont(new Font("Roboto", Font.PLAIN, 16));
txtNombreUsuario.setColumns(10);
txtNombreUsuario.setBackground(Color.WHITE);
txtNombreUsuario.setBorder(javax.swing.BorderFactory.createEmptyBorder());
JLabel lblNombreUsuario = new JLabel("NOMBRE DE USUARIO");
lblNombreUsuario.setBounds(556, 121, 253, 14);
contentPane.add(lblNombreUsuario);
lblNombreUsuario.setForeground(SystemColor.textInactiveText);
lblNombreUsuario.setFont(new Font("Roboto Black", Font.PLAIN, 18));
JSeparator separator_1_2_4 = new JSeparator();
separator_1_2_4.setBounds(556, 179, 289, 2);
contentPane.add(separator_1_2_4);
separator_1_2_4.setForeground(new Color(12, 138, 199));
separator_1_2_4.setBackground(new Color(12, 138, 199));
}
// Código que permite mover la ventana por la pantalla según la posición de "x"

View File

@ -1,15 +0,0 @@
/**
*
*/
/**
*
*/
module hotel_alura {
exports cl.com.alura.hotel.pruebas;
requires io.github.cdimascio.dotenv.java;
requires java.sql;
requires java.desktop;
requires jcalendar;
requires c3p0;
}