API REST para la gestión de intercambio de criptodivisas, cuenta tanto con operaciones CRUD de usuarios, carteras, criptodivisas y otras como intercambio de criptodivisas entre usuarios y seguimiento de saldo. Programado en Java y Spring Boot. Se ha utilizado Hibernate como ORM para el mapeo de objetos - relacional. Se aplicaron patrones de diseño como DAO, DTO, Inyección de dependencias.
Para configurar, instalar y ejecutar la aplicación seguí estos pasos. Debes tener Java 17 y MySQL instalados.
Primero, cloná este repositorio en tu máquina local usando el siguiente comando en tu terminal: git clone https://github.com/gipage/sis-cripto.git
Abrí tu entorno de desarrollo (IntelliJ IDEA, NetBeans, Eclipse, Spring Tool Suite) y seleccioná "Open Project" (Abrir Proyecto) o su equivalente. Navegá hasta la carpeta del proyecto que acabas de clonar y ábrilo.
En el archivo application.properties, que se encuentra en la carpeta de recursos del proyecto (src/main/resources/application.properties), realizá los siguientes cambios:
#configuracion bd spring.datasource.username= tu-nombre-de-usuario
spring.datasource.password= tu-contraseña
spring.datasource.url=jdbc:mysql://localhost/nombre-de-tu-bd?useUnicode=true&characterEncoding=UTF-8
Abrí tu cliente de MySQL y crea la base de datos con el nombre que especificaste en la URL anterior. Utilizá el script de creación de base de datos que se proporciona en src/main/resources/scripts/creacion_bd.sql
Abrí tu cliente de MySQL y abrí el archivo que se encuentra en scripts/datos_prueba_bd.sql seleccioná la base de datos y ejecutá el archivo.
Important
La carga de datos de prueba contiene algunas criptodivisas y la wallet de la empresa, por lo tanto, si no se cargan estos datos deberás cargar a mano las criptodivisas y no podrás realizar depósitos por no existir la wallet de la empresa que cobra comisión.
Una vez que hayas configurado la base de datos y guardado los cambios en application.properties, podes ejecutar la aplicación. Busca la clase principal "SisCriptoApplication" (etiquetada como @SpringBootApplication) y dale al botón run (ejecutar) de tu entorno de desarrollo.
A través de Postman podes probar los diferentes endpoints de la API. Abrí Postman y cargá en tu workspace la colleción que se encuentra en src/main/resources/scripts/API REST- Cripto.postman_collection.json Por último probá los diferentes endpoints siguiendo las instrucciones en la misma docu.
A continuación se adjunta el modelo entidad relación correspondiente a la base de datos.
Operaciones Create, Read, Update, Delete de un usuario.
POST localhost:8080/api/v1/usuarios
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
dni | String |
Requerido por body. | 44913425 |
name | String |
Requerido por body. | Juan |
surname | String |
Requerido por body. | Pérez |
gender | String |
Requerido por body. | Masculino |
String |
Requerido por body. | juan@gmail.com | |
tel | String |
2664123456 |
-
URL: localhost:8080/api/v1/usuarios
-
Método: POST
-
Respuesta:
201 - CREATED: dni,name,surname,gender,email,tel
409 - CONFLICT: El usuario a dar de alta ya existe. + Excepción personalizada (UserAlreadyExist)
Note
Al crear un usuario, se creará una billetera asociada a él.
Ejemplo en POSTMAN
GET localhost:8080/api/v1/usuarios/{dni}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
dni | String |
Requerido por url. | 44913425 |
-
URL: localhost:8080/api/v1/usuarios/{id}
-
Método: GET
-
Respuesta:
200 - OK: dni,name,surname,gender,email,tel (UserDTO)
404 - NOT FOUND: El usuario a buscar no existe + Excepción personalizada (UserDoesNotExist)
Ejemplo en POSTMAN
GET localhost:8080/api/v1/usuarios
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
No se requieren parametros. |
-
URL: localhost:8080/api/v1/usuarios
-
Método: GET
-
Respuesta:
200 - OK: Array JSON con objetos UserDTO. De no existir usuarios, se retorna un array vacío.
Ejemplo en POSTMAN
PUT localhost:8080/api/v1/usuarios/{dni}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
dni | String |
Requerido por url. | 44913425 |
name | String |
Requerido por body. | Juan |
surname | String |
Requerido por body. | Pérez |
gender | String |
Requerido por body. | Masculino |
String |
Requerido por body. | juan@gmail.com | |
tel | String |
Requerido por body. | 2664123456 |
-
URL: localhost:8080/api/v1/usuarios{dni}
-
Método: PUT
-
Respuesta:
200 - OK: dni,name,surname,gender,email,tel (UserDTO)
404 - NOT FOUND: El usuario a actualizar no existe. + Excepción personalizada (UserDoesNotExist)
Ejemplo en POSTMAN
DELETE localhost:8080/api/v1/usuarios/{dni}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
dni | String |
Requerido por url. | 44913425 |
-
URL: localhost:8080/api/v1/usuarios/{dni}
-
Método: DELETE
-
Respuesta:
200 - OK: dni,name,surname,gender,email,tel (UserDTO)
404 - NOT FOUND: El usuario a actualizar no existe. + Excepción personalizada (UserDoesNotExist)
Ejemplo en POSTMAN
Operaciones Create, Read, Update, Delete, GetBalance, GetAllBalance de una billetera.
POST localhost:8080/api/v1/wallets
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
dni | String |
Requerido por body. | 44913425 |
balance | BigDecimal |
Requerido por body. | 6500.00 |
-
URL: localhost:8080/api/v1/wallets
-
Método: POST
-
Respuesta:
201 - CREATED: id, dni, balance. (WalletDTO)
404 - NOT FOUND: El usuario asociado a la billetera no existe + Excepción personalizada (UserDoesNotExist)
Note
Al crear una billetera, el id de la misma se generará automaticamente. El tipo es UUID.
Ejemplo en POSTMAN
GET localhost:8080/api/v1/wallets/{id}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
id | UUID |
Requerido por url. | c0a80067-8ba6-169e-818b-a6d684c70003 |
-
URL: localhost:8080/api/v1/wallets/{id}
-
Método: GET
-
Respuesta:
200 - OK: id, dni, balance. (WalletDTO)
404 - NOT FOUND: La billetera a buscar no existe + Excepción personalizada (WalletDoesNotExist)
Ejemplo en POSTMAN
GET localhost:8080/api/v1/wallets/user/{dni}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
dni | String |
Requerido por url. | 44913425 |
-
URL: localhost:8080/api/v1/wallets/user/{dni}
-
Método: GET
-
Respuesta:
200 - OK: Array JSON con objetos WalletDTO o vacío.
404 - NOT FOUND: El usuario asociado a la billetera no existe + Excepción personalizada (UserDoesNotExist)
Ejemplo en POSTMAN
PUT localhost:8080/api/v1/wallets/{id}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
id | UUID |
Requerido por url. | c0a80067-8ba6-169e-818b-a6d684c70003 |
dni | String |
Requerido por body. | 44913425 |
balance | BigDecimal |
Requerido por body. | 4000.00 |
-
URL: localhost:8080/api/v1/wallets/{id}
-
Método: PUT
-
Respuesta:
200 - OK: id, dni, balance. (WalletDTO)
404 - NOT FOUND: La billetera a actualizar no existe + Excepción personalizada (WalletDoesNotExist)
Ejemplo en POSTMAN
DELETE localhost:8080/api/v1/wallets/{id}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
id | UUID |
Requerido por url. | c0a80067-8ba6-169e-818b-a6d684c70003 |
-
URL: localhost:8080/api/v1/wallets/{id}
-
Método: DELETE
-
Respuesta:
200 - OK: id, dni, balance. (WalletDTO)
404 - NOT FOUND: La billetera a eliminar no existe + Excepción personalizada (WalletDoesNotExist)
Ejemplo en POSTMAN
GET localhost:8080/api/v1/wallets/balance/{id}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
id | UUID |
Requerido por url. | c0a80067-8ba6-169e-818b-a6d53ea40001 |
-
URL: localhost:8080/api/v1/wallets/balance/{id}
-
Método: GET
-
Respuesta:
200 - OK: balance.
404 - NOT FOUND: La billetera a consultar su saldo no existe + Excepción personalizada (WalletDoesNotExist)
Ejemplo en POSTMAN
GET localhost:8080/api/v1/wallets/user/balance/{dni}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
dni | String |
Requerido por url. | 44913425 |
-
URL: localhost:8080/api/v1/wallets/user/balance/{dni}
-
Método: GET
-
Respuesta:
200 - OK: balance.
404 - NOT FOUND: El usuario asociado a la billetera no existe + Excepción personalizada (UserDoesNotExist)
Ejemplo en POSTMAN
Operaciones Create, Update y Delete de una criptodivisa.
POST localhost:8080/api/v1/currencies
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
ticker | String |
Requerido por body. | BTC |
name | String |
Requerido por body. | Bitcoin |
value | BigDecimal |
Requerido por body. | 100.00 |
-
URL: localhost:8080/api/v1/currencies
-
Método: POST
-
Respuesta:
201 - CREATED: ticker, name, value. (CurrencyDTO)
409 - CONFLICT: La criptodivisa ya existe + Excepcion personalizada (CurrencyAlreadyExist)
Note
La divisa ARS está presente en la base de datos con valor igual a 1, el valor de todas las criptodivisas es en ARS
Ejemplo en POSTMAN
PUT localhost:8080/api/v1/currencies/{ticker}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
ticker | String |
Requerido por url. | BTC |
ticker | String |
Requerido por body. | BTC2 |
name | String |
Requerido por body. | Bitcoin2 |
value | BigDecimal |
Requerido por body. | 200.00 |
-
URL: localhost:8080/api/v1/currencies/{ticker}
-
Método: PUT
-
Respuesta:
200 - OK: ticker, name, value. (CurrencyDTO)
404 - NOT FOUND: La criptodivisa a actualizar no existe + Excepcion personalizada (CurrencyDoesNotExist)
Ejemplo en POSTMAN
DELETE localhost:8080/api/v1/currencies/{ticker}
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
ticker | String |
Requerido por url. | BTC |
-
URL: localhost:8080/api/v1/currencies/{ticker}
-
Método: DELETE
-
Respuesta:
200 - OK: ticker, name, value. (CurrencyDTO)
404 - NOT FOUND: La criptodivisa a eliminar no existe + Excepcion personalizada (CurrencyDoesNotExist)
Ejemplo en POSTMAN
Operaciones: Depósito de criptodivisa e intercambio de criptodivisas.
POST localhost:8080/api/v1/transactions
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
type | String |
Requerido por body. | Intercambio |
origin_currency_ticker | String |
Requerido por body. | BTC |
destination_currency_ticker | String |
Requerido por body. | ETH |
origin_wallet_id | UUID |
Requerido por body. | c0a80067-8ba6-169e-818b-a6a6b11e0000 |
destination_wallet_id | UUID |
Requerido por body. | c0a80067-8ba6-169e-818b-a6d53ea40001 |
origin_amount | BigDecimal |
Requerido por body. | 1 |
-
URL: localhost:8080/api/v1/transactions
-
Método: POST
-
Respuesta:
200 - OK: idtransaction, date_transaction, type, origen_wallet_id, destination_wallet_id (TransactionSuccesfullyDTO). varias excepciones personalizadas:
- CurrencyDoesNotExist: Una criptodivisa a intercambiar/depositar no existe.
- WalletDoesNotExist: Una billetera no existe.
- HoldingDoesNotExist: Una billetera no posee tenencias de cripto.
- NotEnoughFunds: Una billetera no posee los sufiencientes fondos para realizar un intercambio. Ejemplo en Postman
Billetera de origen:
Billetera de destino:
Tenencias:
Intercambio:
Se intercambia 1 BTC por el equivalente en ETH, en este caso, 5 ETH.
Veamos las tenencias de ambas billeteras luego del intercambio.
Parámetro | Tipo | Descripción | Ejemplo |
---|---|---|---|
type | String |
Requerido por body. | Deposito |
destination_currency_ticker | String |
Requerido por body. | BTC |
destination_wallet_id | UUID |
Requerido por body. | c0a80067-8ba6-169e-818b-a6f3ed790004 |
destination_amount | BigDecimal |
Requerido por body. | 5 |
-
URL: localhost:8080/api/v1/transactions
-
Método: POST
-
Respuesta:
200 - OK: idtransaction, date_transaction, type, origen_wallet_id, destination_wallet_id (TransactionSuccesfullyDTO).
varias excepciones personalizadas:
- CurrencyDoesNotExist: Una criptodivisa a intercambiar/depositar no existe.
- WalletDoesNotExist: Una billetera no existe.
- HoldingDoesNotExist: Una billetera no posee tenencias de cripto.
- NotEnoughFunds: Una billetera no posee los sufiencientes fondos para realizar un intercambio.
La transacción depósito tiene una comision del 0.25% de la cantidad a depositar.
Billetera destino:
Depósito
Billetera destino luego del depósito:
Note
El 0.25% de la cantidad depositada va a la cuenta de la empresa. (Ya tiene varias transacciones cobradas, es el 0.25% de 1 BTC multiplicado por el valor de BTC (100 ARS))