
Тестовое задание
Запуск
- Общие данные(для базы данных указаны postgres postgres postgres основные поля) берутся из файла конфигураций /configs/main.yml
- создание таблиц происходит на стороне сервера в соответствии с схемой
- ниже представленные запросы выполнялись в Postman
- не совсем механизм миграций, инициализация бд с пустыми таблицами в соответствии с схемой происходит на стороне сервера при инициализации бд
POSTGRES_PASSWORD=
API_KEY=
host=db
Локально
- для локального запуска
make run
(go run cmd/main.go -local флаг позволяет отличить хост и его источник)
Docker
make up
(docker-compose up --build backend-test) для запуска докера
Тесты
Написаны тесты для
- хендлеров (и middleware)
- сервисов
- базы (проблема с тестом надстройки sqlx selectContext)
- кеша
Описание, вопросы и решения
- в качестве id использован uuid ради уникальности, хоть и оверкил
- decimal и float64 в бд и структурах соответственно
начисление средств
- POST
http://localhost:8090/api/v1/operation/transaction
- на входе обязательные id ,сумма (десятичная дробь), вариативно описание(до 20 символов)
- хедер Idempotency-Key (uuid)
{
"id":"a8887f18-b68e-4999-9c33-cc8ecbdf8c2c",
"sum":100.5,
"description":"tests"
}
- так как в базе данных не должно быть данных изначально, при отсутствии id запись создается
- возвращает сообщение об успехе операции
{
"message": "удачная транзакция"
}
- если ключ был скеширован, то код 409 и
{
"message": "повторный запрос"
}
перевод
- POST
http://localhost:8090/api/v1/operation/remittance
- на входе обязательные id отправителя и получателя (uuid),сумма (положительная), вариативно описание до 20 символов
- хедер Idempotency-Key (uuid)
{
"id_from":"a8887f18-b68e-4999-9c33-cc8ecbdf8c2c",
"id_to":"bc5f99f1-6808-4631-9eb0-e99f51e69bc8",
"sum":200000,
"description":"tests"
}
- создается только получатель, при отсутствии отправителя выдается ошибка об уходе в минус
- возвращает сообщение об успехе операции
{
"message": "недостаточно средств"
}
баланс
- GET
http://localhost:8090/api/v1/operation/balance
- GET
http://localhost:8090/api/v1/operation/balance?currency=USD
- на входе обязательно id(uuid), в параметрах указывается валюта(по умолчанию рубли)
{
"id":"a8887f18-b68e-4999-9c33-cc8ecbdf8c2c"
}
- возвращает баланс и валюту
- так как https://exchangeratesapi.io/ в качестве бесплатной базовой валюты предоставляет только евро, перевод в курсы к рублям осуществлен отношением ЕВРО-НЕОБХОДИМАЯ/ЕВРО-РУБЛИ
{
"balanceResponse": "₽520.50",
"cur": "RUB"
}
{
"balanceResponse": "$7.10",
"cur": "USD"
}
транзакции
- GET
http://localhost:8090/api/v1/operation/transactionsList
- GET
http://localhost:8090/api/v1/operation/transactionsList?sort=sum&dir=asc&page=1
- на входе обязательно id(uuid), в параметрах указывается поле сортировки, направление и страница(по умолчанию дата по возрастанию, страница включает в себя до 5 записей в json)
{
"id":"a8887f18-b68e-4999-9c33-cc8ecbdf8c2c"
}
- возвращает список транзакций
[
{
"id": "a8887f18-b68e-4999-9c33-cc8ecbdf8c2c",
"operation": "transaction",
"sum": -110,
"date": "2021-09-08T17:28:32.033618Z"
},
{
"id": "a8887f18-b68e-4999-9c33-cc8ecbdf8c2c",
"operation": "transaction",
"sum": 10,
"date": "2021-09-08T17:28:25.044972Z"
},
{
"id": "a8887f18-b68e-4999-9c33-cc8ecbdf8c2c",
"operation": "remittance",
"sum": 10,
"date": "2021-09-08T17:29:03.243682Z",
"id_to": "bc5f99f1-6808-4631-9eb0-e99f51e69bc8"
},
{
"id": "a8887f18-b68e-4999-9c33-cc8ecbdf8c2c",
"operation": "transaction",
"sum": 45,
"date": "2021-09-08T17:40:11.272648Z",
"description": "test"
},
{
"id": "a8887f18-b68e-4999-9c33-cc8ecbdf8c2c",
"operation": "transaction",
"sum": 110,
"date": "2021-09-08T17:28:28.052397Z"
}
]
структура папок
создана моей программой https://github.com/CookieNyanCloud/dirtree

схема

Для связи