# Currenstore

Сервис хранения курса валют (по данным ЦБРФ)

## Функциональные требования к сервису

- [x] Сервис должен уметь собирать из [Веб-службы ЦБРФ][cbrf-webservice] данные о курсах валют и хранить их в базе данных. 
- [x] Сервис должен быть конфигурируемым. В настройках конфигурации должны быть:
    - [x] Настраиваемое подключение к БД
    - [x] Конфигурируемый порт по которому приложение доступно
    - [x] Параметры логирования
- [x] Сервис должен уметь проверять целостность схемы БД для хранения данных о курсах валют, и предупреждать если что-то пошло не так
- [x] Сервис должен уметь возвращать данные о курсах валют для выбранной пары на дату
- [x] Сервис должен уметь восстанавливать данные о курсах валют для выбранного диапазона дат
- [x] Сервис должен уметь возвращать данные о курсах валют для выбранной пары на диапазон дат
- [x] Сервис должен уметь возвращать данные о курсах валют для выбранной пары на набор дат
- [x] Сервис должен быть совместим с компилятором golang версии 1.17+

## Сборка и Запуск приложения

Для сборки приложения выполните команду:

```
go build -o currenstore app.go 
```

Затем, для запуска приложения с определенным файлом конфигурации необходимо выполнить команду:

```
./currenstore -config=config.toml
```
где `config.toml` - ссылка на файл конфигурации для приложения.

## Методы доступные в сервисе

### Получение данных о курсе валюты на определённую дату

Для получения курса валюты на определённую дату используется метод `[GET] /api/v1/currency/:charcode/ondate/:ondate/`, где:

`:charcode` - код валюты, например **USD**

`:ondate` - дата на которую требуется получить курс в формате **YYYY-MM-DD**

Запрос обрабатывается в "ручке" `GetCurrencyOnDate` находящейся в файле `./handlers/currency.go`

### Получение данных о курсе валюты за определенный период

Для получения курса валюты за определённый период используется метод `[GET] /api/v1//currency/:charcode/:startdate/to/:enddate`, где:

`:charcode` - код валюты, например **USD**

`:startdate` - дата с которой требуется получить курс в формате **YYYY-MM-DD**

`:enddate` - дата до которой требуется получить курс в формате **YYYY-MM-DD**

Запрос обрабатывается в "ручке" `GetCurrencyOnDateInterval` находящейся в файле `./handlers/currency.go`

### Получение данных о курсе валюты за определенный период

Для получения курса валюты за определённый период используется метод `[GET] /api/v1//currency/:charcode/indate`, где:

`:charcode` - код валюты, например **USD**

Даты  на которые требуется получить курс передаем в теле запроса через запятую в формате **YYYY-MM-DD,YYYY-MM-DD,YYYY-MM-DD**

Запрос обрабатывается в "ручке" `GetCurrencyOnDateInterval` находящейся в файле `./handlers/currency.go`

### Восстановление данных о курсах валют за определённый диапазон дат

Для получения курса валюты на определённую дату используется метод `[GET] /api/v1/currency/restore/:startdate/to/:enddate/`, где:

`:startdate` и `:enddate` - начальная и конечная даты периода в формате **YYYY-MM-DD**, за который необходимо восстановить данные о курсах валют.

Запрос обрабатывается в "ручке" `RestoreCurrencyData` находящейся в файле `./handlers/currency.go`

> При проверке диапазона дат, в итоговый запрос к ЦБРФ попадают только те даты, для которых не получено ни одного значения курса валют из БД. То есть, если для определённой даты есть хотя бы одна запись с курсом валют, то новые данные для такой даты запрашиваться не будут.

## Конфигурационный файл

Файл конфигурации описан в формате [TOML](https://toml.io/en/) и содержит следующие разделы и параметры:

### Раздел database

В разделе `database` сейчас доступны три параметра:

- `engine` - движок БД. Пока без альтернативных вариантов, значение может быть равно только лишь `sqlite`.
- `dbfile` - путь к файлу БД для SQLite.
- `tablename` - имя таблицы в которой хранятся записи о курсах валют в БД.

### Раздел server

В разделе `server` сейчас доступны два параметра:

- `port` - порт по которому будет доступен http сервер приложения.
- `applogpath` - путь к лог-файлу приложения.

### Раздел settings

В разделе `settings` (общие настройки) сейчас доступен один параметр:

- `initdate` - минимальна дата от которой будут собираться исторические данные курсов валют. Для уже накопленной базы уже бесполезный параметр.

### Раздел crontab

В разделе `crontab` (график запуска функций приложения) сейчас доступен один параметр:

- `exchangerateonday` - частота получения курса валют на текущую дату.

В этом разделе все значения задаются в формате [CRONTAB](https://crontab.guru/), и функции могут выполнятся не чаще чем раз в минуту.

## Справочная информация используемая в сервисе

На сайте ЦБРФ есть [описание и примеры](https://cbr.ru/development/SXML/) использования

Полезный [справочник по кодам валют](https://cbr.ru/scripts/XML_val.asp?d=0)

[cbrf-webservice]: https://cbr.ru/development/DWS/

