API
- REST api представлен 4 сущностями:registrator
- регистрирует и авторизует пользователей, аппрувит заявки на регистрациюtimeliner
- отдает исторические данные по курсам валютusers
- получение, перечисление, блокировка пользователейwalleter
- добавление, списание, обмен денег. Создание, перечисление счетов. Перечисление транзакций совершенных пользователем
Exchanger
- внутренний обменник, собирает раз в 10 секунд информацию о валютном рынке, необходим для того чтобы не перегружать запросами внешний API + ускоряет работу приложения. Он предоставаляет всю информаци для API по текущему курсу и составляет исторические данные в БДQuoter
- котировщик, клиент внешнего сервиса, который предоставляет котировки из внешнего мира. В нашем случае есть пока что только мок. Обращения к нему от Exchanger ограничены по времени по причинам вышеStorager
- интерфейс для базы данных, в нашем случае Postgres. Развернуто в docker с помощью docker compose
- Для конфигурации можно использовать переменные среды:
# service
CURRENCY_API_SERVER_ADDRESS: "0.0.0.0:8000" # адрес по которому будет слушать сервис
# database
CURRENCY_API_DATABASE_HOST: "127.0.0.1" # хост от ДБ
CURRENCY_API_DATABASE_PORT: "5432" # порт от ДБ
CURRENCY_API_DATABASE_USER: "postgres"
CURRENCY_API_DATABASE_PASSWORD: "password" # пароль от ДБ
CURRENCY_API_DATABASE_CONNECTION_TIMEOUT: 2s # таймаут на коннекты к базе
# logger
CURRENCY_API_LOGGER_LOG_LEVEL: "debug"
- или конфиг файл путь которого переданн через флаг
--config
при запуске программы:
server:
address: "0.0.0.0:8000"
database:
host: "127.0.0.1"
port: "5432"
user: "postgres"
password: "pass"
connection_timeout: 2s
logger:
log_level: "debug"
Архитектура состоит из 2 компонентов - БД Postgresql и Сервис на Golang.
Весь контур поднимается командой make up
с помощью docker compose
Миграции находятся в папке migrations
и накатываются с помощью команды make migrate-up
и утилиты goose
POST /register - регистрирует нового пользователя
{
"user": {
"name" string,
"middle_name": string,
"mail": string,
"phone_number": string,
"password": string
}
}
POST /register/approve - подтверждает регистрацию пользователя
{
"user": {
"id": int64
}
}
/login - выполняет авторизацию, необходимо хотя быодно из полей phone_number или email
{
"phone_number": string,
"email": string,
"password": string
}
POST /user/block - блокирует или разблокирует пользователя в зависимости от поля "block"
{
"user": {
"id": string,
},
"block": boolean
}
POST /user/list - перечисляет всех пользователей
offset, count - параметры пагинации
{
"offset": int64,
"count": int64
}
/user/info - выводит полную информацию о пользователе
request:
{
"id": 1
}
response:
{
"user" {
"id": int64,
"name": string
"middle_name": string
"surname": string
"mail": string
"phone_number": string
"blocked" bool
"registered" bool
"admin" bool
"password" string
},
"wallets": [
{
"id" int64
"user_id" int64
"currency" Currency
"value" int64
}
]
}
POST /wallet/get - достает конкретный счет по ID
{
"id": 1
}
POST /wallet/create - создает счет
{
"wallet": {
"user_id": int64,
"currency": Currency,
"value": int64
}
}
POST /wallet/money/add - добавляет указанное кол-во денег на счет
{
"id": int64,
"value": int64
}
POST /wallet/money/pull - списывает указанное кол-во денег со счета
{
"id": int64,
"amount": int64
}
POST /wallet/list - перечисляет все счета для кокретного пользователя
{
"user_id": int64
}
POST /wallet/exchange - основной метод обмена валют, меняет валюту для user_id
с кошелька from_wallet_id на кошелек to_wallet_id с типами валют соответственно
from_currency и to_currency на сумму amount
{
"user_id": int64,
"from_wallet_id": int64,
"to_wallet_id": int64,
"from_currency": Currency,
"to_currency": Currency,
"amount": int64
}
POST /wallet/course - отдает текущий курс для USD и EUR
{
"from": Currency,
"to": Currency
}
POST /transaction/list - перечисляет все операции сделанные пользователем,
в них входят
"ADD MONEY" - попоплнение баланса (ручка /wallet/money/add)
"PULL MONEY" - вывод с баланса (ручка /wallet/money/pull)
"EXCHANGE MONEY" - обмен валют (ручка /wallet/exchange)
{
"user_id": int64
}
POST /currency/list - отдает список всех валют доступных системой
текущий список RUB, EUR, USD, GBP, JPY, CHF, CNY
{}
POST /course/list - позволяет достать исторические данные из локальной базы данных
используется для отрисовки графиков
{
"from": Currency,
"to": Currency,
"from_time": int64,
"to_time": int64
}