174 lines
2.9 KiB
Markdown
174 lines
2.9 KiB
Markdown
# Wymiana walut
|
|
|
|
Prosty mikroserwis stworzony na potrzeby rekrutacji
|
|
|
|
## Założenia
|
|
|
|
- PESEL jedynym identyfikatorem
|
|
- Jedno konto na PESEL
|
|
- Użytkownik pełnoletni
|
|
- Wymiana walut na podstawie tabeli NBP
|
|
- Baza danych in-memory
|
|
|
|
## Interfejsy
|
|
|
|
- stworzenie konta
|
|
|
|
⇒ POST `/api/user`
|
|
```json
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"surname": {
|
|
"type": "string"
|
|
},
|
|
"pesel": {
|
|
"type": "string"
|
|
},
|
|
"pln": {
|
|
"type": "number",
|
|
"description": "początkowy stan konta w złotówkach"
|
|
}
|
|
},
|
|
"required": [
|
|
"name",
|
|
"surname",
|
|
"pesel",
|
|
"pln"
|
|
]
|
|
}
|
|
```
|
|
⇐ 204/400/409/500
|
|
|
|
- pobranie informacji o koncie
|
|
|
|
⇒ GET `/api/user/{pesel}`
|
|
|
|
⇐ 200/400/404/500
|
|
```json
|
|
{
|
|
"type": "object",
|
|
"def": {
|
|
"currency": {
|
|
"type": "object",
|
|
"properties": {
|
|
"symbol": {
|
|
"type": "string"
|
|
},
|
|
"amount": {
|
|
"type": "number"
|
|
}
|
|
},
|
|
"required": [
|
|
"symbol",
|
|
"amount"
|
|
]
|
|
}
|
|
},
|
|
"properties": {
|
|
"name": {
|
|
"type": "string"
|
|
},
|
|
"surname": {
|
|
"type": "string"
|
|
},
|
|
"pesel": {
|
|
"type": "string"
|
|
},
|
|
"currencies": {
|
|
"$comment": "TODO: Map -> List",
|
|
"type": "array",
|
|
"items": {
|
|
"$ref": "#/def/currency"
|
|
}
|
|
}
|
|
},
|
|
"required": [
|
|
"name",
|
|
"surname",
|
|
"pesel",
|
|
"currencies"
|
|
]
|
|
}
|
|
```
|
|
- zlecenie wymiany walut
|
|
|
|
⇒ POST `/api/exchange/{pesel}`
|
|
```json
|
|
{
|
|
"type": "object",
|
|
"properties": {
|
|
"pesel": {
|
|
"type": "string"
|
|
},
|
|
"from": {
|
|
"type": "string",
|
|
"description": "waluta źródłowa"
|
|
},
|
|
"to": {
|
|
"type": "string",
|
|
"description": "waluta docelowa"
|
|
},
|
|
"toBuy": {
|
|
"type": "number",
|
|
"description": "ilość do zakupu"
|
|
},
|
|
"toSell": {
|
|
"type": "number",
|
|
"description": "ilość do sprzedaży"
|
|
}
|
|
},
|
|
"oneOf": [
|
|
{
|
|
"required": [
|
|
"pesel",
|
|
"from",
|
|
"to",
|
|
"toBuy"
|
|
]
|
|
},
|
|
{
|
|
"required": [
|
|
"pesel",
|
|
"from",
|
|
"to",
|
|
"toSell"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
⇐ 200/400/404/500
|
|
|
|
patrz: pobranie informacji o koncie
|
|
|
|
## Architektura
|
|
|
|
```mermaid
|
|
flowchart LR
|
|
actor["fa:fa-person"]
|
|
subgraph NBP
|
|
tabC["Tabela C"]
|
|
end
|
|
subgraph proces
|
|
subgraph spring-boot
|
|
core
|
|
subgraph endpoint
|
|
user
|
|
exchange
|
|
end
|
|
end
|
|
hsqldb
|
|
end
|
|
|
|
actor <--> user
|
|
actor <--> exchange
|
|
endpoint <--> core
|
|
core <--> tabC
|
|
core <-- ${hsql.port} --> hsqldb
|
|
|
|
```
|