# 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",
      "initial"
    ]
  }
  ```
  ⇐ 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": {
        "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

```