🔧 Status: Deployed and currently in development/testing phase.
Use the following users to authenticate and test the API:
| Username | Password |
|---|---|
| alice | password123 |
| bob | securePass! |
| eve | mySecret# |
https://resulting-rattlesnake-matiasnm-db6f89e2.koyeb.app
Full Swagger UI is available here:
Swagger UI
- Java 17+
- Spring Boot
- Spring Security (JWT)
- PostgreSQL (hosted on Neon)
- RESTful APIs with OpenAPI 3.1
- Deployed on Koyeb
All protected endpoints require a Bearer JWT token.
Use /login to authenticate and receive your token.
POST /login– Authenticate and receive JWT token.
GET /users/mePUT /users/updatePUT /users/update-avatar?avatar={url}DELETE /users/deactivate
POST /portfolio/tradeGET /portfolio/overviewGET /portfolio/performanceGET /portfolio/historyGET /portfolio/assets/{asset}
GET /coinsGET /rates
| Column | Type | Constraints |
|---|---|---|
| id | bigint | PK, auto-increment |
| username | varchar(255) | NOT NULL |
| varchar(255) | NOT NULL | |
| phone | varchar(255) | |
| password | varchar(255) | NOT NULL (BCrypt encoded) |
| avatar | varchar(255) | |
| active | boolean |
| Column | Type | Constraints |
|---|---|---|
| id | bigint | PK, auto-increment |
| balance | double | |
| user_id | bigint | UNIQUE, FK → users(id) |
| Column | Type | Constraints |
|---|---|---|
| id | bigint | PK, auto-increment |
| price_at_transaction | double | NOT NULL |
| quantity | double | NOT NULL |
| timestamp | timestamp | NOT NULL |
| type | varchar(255) | CHECK ["BUY", "SELL"] |
| asset | varchar(255) | CHECK ["BTC", ..., "DOT"] |
| portfolio_id | bigint | FK → portfolios(id) |
| exchange_rate_id | bigint | FK → exchange_rates(id), nullable |
| Column | Type | Constraints |
|---|---|---|
| id | bigint | PK, auto-increment |
| date | date | UNIQUE, NOT NULL |
| Column | Type | Constraints |
|---|---|---|
| exchange_rate_id | bigint | FK → exchange_rates(id), part of composite PK |
| rates_key | varchar(255) | ENUM: ARS, BRL, MXN, COP (part of PK) |
| rate | double | NOT NULL |
users
│
├──< portfolios (1:1)
│
├──< transactions (1:N)
└─── exchange_rates (0..1:1)
└──< exchange_rate_details (1:N)
