Code Monkey home page Code Monkey logo

currencyexchanger's Introduction

A lot of money

Проект "Обмен валют"

Суть проекта заключается в создании REST API для описания валют и обменных курсов. Данный интерфейс позволяет просматривать и редактировать списки валют и обменных курсов, совершать расчёт конвертации произвольных сумм из одной валюты в другую. Веб-интерфейс для проекта не подразумевается.

Мотивация проекта

  • правильное создание REST API,
  • грамотное наименование ресурсов,
  • использование правильных HTTP кодов ответа,
  • взаимодействие с базами данных посредством использования SQL запросов,
  • знакомство с JDBC,
  • знакомство с Java Servlet,
  • получение опыта развертывания приложения на реальном сервере.

Использованные технологии и инструменты

  • Java Servlets
  • JDBC
  • SQLite
  • Postman
  • Maven
  • Git
  • Tomcat

База данных

В качестве базы данных в приложении использована SQLite, так как она позволяет встраивать файл базы непосредственно в структуру проекта. Это позволит немного упростить деплой проекта на сервере. Диаграмма базы данных (для SQLite) изображена на рисунке:

CurrencyExchanger Database diagram

REST API

Манипуляции с валютами

GET /currencies

Получение списка валют. Пример ответа:

[
    {
        "id": 0,
        "name": "United States dollar",
        "code": "USD",
        "sign": "$"
    },
    {
        "id": 0,
        "name": "Euro",
        "code": "EUR",
        "sign": ""
    }
]

HTTP коды ответов:

  • Успех - 200
  • Ошибка (например, база данных недоступна) - 500.

GET /currency/EUR

Получение конкретной валюты. Пример ответа:

{
    "id": 0,
    "name": "Euro",
    "code": "EUR",
    "sign": ""
}

HTTP коды ответов:

  • Успех - 200
  • Код валюты отсутствует в адресе - 400
  • Валюта не найдена - 404
  • Ошибка (например, база данных недоступна) - 500

POST /currencies

Добавление новой валюты в базу данных. Данные передаются в теле запроса в виде полей формы (x-www-form-urlencoded).

Поля формы - name, code, sign.

Пример ответа: JSON представление вставленной в базу записи, включая ее ID:

{
    "id": 0,
    "name": "Euro",
    "code": "EUR",
    "sign": ""
}

HTTP коды ответов:

  • Успех - 200
  • Отсутствует нужное поле формы - 400
  • Валюта с таким кодом уже существует - 409
  • Ошибка (например, база данных недоступна) - 500

Манипуляции с обменными курсами

GET /exchangeRates

Получение списка всех обменных курсов. Пример ответа:

[
    {
        "id": 0,
        "baseCurrency": {
            "id": 0,
            "name": "United States dollar",
            "code": "USD",
            "sign": "$"
        },
        "targetCurrency": {
            "id": 1,
            "name": "Euro",
            "code": "EUR",
            "sign": ""
        },
        "rate": 0.99
    }
]

HTTP коды ответов:

  • Успех - 200
  • Ошибка (например, база данных недоступна) - 500

GET /exchangeRate/USDRUB/

Получение конкретного обменного курса. Валютная пара задается идущими подряд кодами валют в адресе запроса. Пример ответа:

{
    "id": 0,
    "baseCurrency": {
        "id": 0,
        "name": "United States dollar",
        "code": "USD",
        "sign": "$"
    },
    "targetCurrency": {
        "id": 1,
        "name": "Euro",
        "code": "EUR",
        "sign": ""
    },
    "rate": 0.99
}

HTTP коды ответа:

  • Успех - 200
  • Коды валют пары отсутствуют в адресе - 400
  • Обменный курс для пары не найден - 404
  • Ошибка (например, база данных недоступна) - 500

POST /exchangeRates

Добавление нового обменного курса в базу. Данные передаются в теле запроса в виде полей формы (x-www-form-urlencoded). Поля формы: baseCurrencyCode, targetCurrencyCode, rate.

Пример полей формы:

  • baseCurrencyCode - USD
  • targetCurrencyCode - EUR
  • rate - 0.99

Пример ответа: JSON представление вставленной в базу записи, включая ее ID:

{
    "id": 0,
    "baseCurrency": {
        "id": 0,
        "name": "United States dollar",
        "code": "USD",
        "sign": "$"
    },
    "targetCurrency": {
        "id": 1,
        "name": "Euro",
        "code": "EUR",
        "sign": ""
    },
    "rate": 0.99
}

HTTP коды ответов:

  • Успех - 200
  • Отсутствует нужное поле формы - 400
  • Валютная пара с таким кодом уже существует - 409
  • Ошибка (например, база данных недоступна) - 500

PATCH /exchangeRate/USDRUB

Обновление существующего в базе обменного курса. Валютная пара задаётся идущими подряд кодами валют в адресе запроса. Данные передаются в теле запроса в виде полей формы (x-www-form-urlencoded). Единственное поле формы - rate.

Пример ответа - JSON представление обновлённой записи в базе данных, включая её ID:

{
    "id": 0,
    "baseCurrency": {
        "id": 0,
        "name": "United States dollar",
        "code": "USD",
        "sign": "$"
    },
    "targetCurrency": {
        "id": 1,
        "name": "Euro",
        "code": "EUR",
        "sign": ""
    },
    "rate": 0.99
}

HTTP коды ответов:

  • Успех - 200
  • Отсутствует нужное поле формы - 400
  • Валютная пара отсутствует в базе данных - 404
  • Ошибка (например, база данных недоступна) - 500

Обмен валюты

GET /exchange?from=BASE_CURRENCY_CODE&to=TARGET_CURRENCY_CODE&amount=$AMOUNT

Расчёт перевода определённого количества средств из одной валюты в другую.

Пример запроса - GET /exchange?from=USD&to=AUD&amount=10.

Пример ответа:

{
    "baseCurrency": {
        "id": 0,
        "name": "United States dollar",
        "code": "USD",
        "sign": "$"
    },
    "targetCurrency": {
        "id": 1,
        "name": "Australian dollar",
        "code": "AUD",
        "sign": "A€"
    },
    "rate": 1.45,
    "amount": 10.00
    "convertedAmount": 14.50
}

Получение курса для обмена может пройти по одному из трёх сценариев. Допустим, совершаем перевод из валюты A в валюту B:

  1. В таблице ExchangeRates существует валютная пара AB - берём её курс
  2. В таблице ExchangeRates существует валютная пара BA - берем её курс, и считаем обратный, чтобы получить AB
  3. В таблице ExchangeRates существуют валютные пары USD-A и USD-B - вычисляем из этих курсов курс AB Остальные возможные сценарии, для упрощения, были опущены.

Ответ в случае ошибки

Для всех запросов в случае ошибки ответ передается в виде JSON объекта следующего вида:

{
    "message": "Валюта не найдена"
}

Значение message зависит от того, какая именно ошибка произошла.

Фронтенд

Специально для данного проекта Сергеем Жуковым была написана реализация интерфейса обменника.

Развертывание приложения

Для развертывания приложения в Docker в папке проекта выполнить последовательно следующие команды:

    docker build -t currency-exchanger . 
    docker run -d -p 8080:8080 currency-exchanger 

После успешного выполнения команд можно делать запросы через браузер или Postman по адресу http://localhost:8080/CurrencyExchanger в соответствии с описанным выше REST API.

План работы над приложением

  • Создать заготовку Java бэкенд приложения с javax.servlet
  • Создать таблицы в базе данных, и вручную их заполнить начальными данными (несколько валют, обменных курсов)
  • Реализовать методы REST API для работы с валютами
  • Реализовать методы REST API для работы с обменными курсами
  • Реализовать метод REST API с подсчётом обмена валюты
  • Создание образа в Docker
  • Деплой на удалённый сервер

Проект реализован в рамках курса.

currencyexchanger's People

Contributors

ad-riaz avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.