link: Аргументация выбора пакетов для реализации проекта
- Использование go fmt и goimports ✔
- Следование Effective Go ✔| TODO: Отрефакторить проект
- Go актуальной версии ✔
- Использование JSON-RPC ✔
- PostgreSQL или MySQL в качестве хранилища данных ✔
- Добиться работоспособности API. Реализация выполнения основных функций, с учетом пограничных кейсов ✔
- Реализовать грамотную организацию и читаемость кода ✔
- Добавить в проект обработку ошибок ✔
- Использовать Makefile для запуска проекта ✔
- Покрытие кода unit или функциональными тестами TODO: Будет реализовано
- Запуск проекта в docker-контейнере через docker-compose up ✔| TODO
- Наличие файлов миграции базы данных и cli команда для их применения ✔
- Аргументация выбора пакетов в go.mod (находится в файле packages.md) ✔
Необходимо реализовать API методы для работы с товарами на одном складе. Учесть, что вызов API может быть одновременно из разных систем и они могут работать с одинаковыми параметрами ✔
Реализован механизм блокировок на уровне базы данных. Суть данного метода, заключается в том, что PostgreSQL закрывает доступ к информации для других систем, когда кто-то делает запрос на изменение, обновление или удаление. Для этого я использовал механизм транзакций, который позволяет блокировать записи в таблице при выполнении операции.
API Метод | Функционал | Работает |
---|---|---|
CreateNewGood | Создать новый тип товара | ✔ |
CreateNewStock | Создать новый склад | ✔ |
AddGood | Добавить товар | ✔ |
ReservationGood | Резервация товара | ✔ |
CancelGoodReservation | Отмена резервации | ✔ |
GetAllGoods | Получить список всех товаров со всех складов | ✔ |
GetGoodByCode | Получить конкретный товар по уникальному коду | ✔ |
GetGoodsCountByStockId | Вариативный метод. Если код товара не передан в POST запросе - Вы получите количество всего товара на складе, если код указан - метод вернет количество именно этого товара. | ✔ |
Для корректного подключения к PostgreSQL необходимо в корневой папке проекта создать файл .env, который будет содержать следющие переменные окружения.
HOST=localhost
PORT=5432
USER=postgres
PASSWD=5218521111
DBNAME=postgres
SSLMODE=required
Для того, чтобы взаимодествовать с активным сервисом, можно использовать сторонние программы, которые имеют функционал отпраки http запросов. В своей работе я использую thunder client/postman. Ниже будет пример как отправить запрос в postman:
Добавим товар на склад
- Задаем тип http запроса == POST
- Указываем json body запроса к севреру:
{
"method": "Service.AddGood",
"params": [{"Code": "1", "StockId": "bba9fd25-fe55-4076-add0-57f4661e9819", "Value": 5, "Dynamic": true}],
"id": 2
}
Получаем ответ:
{
"result": {
"Message": "done"
},
"error": null,
"id": 2
}
Выполняется на данный момент командами:
make build
make run
Либо запускается с помощью Docker (todo: возможна доработка).
Возвращать информативные JSON'ы, после отработки функций RPC. Доработка Dockerfile, написать docker-compose. Расширить фунционал Makefile. Переписать на именованные аргументы запросы, которые получают и используют данные от пользователя (дабы избежать sql инъекций). Также написать моки или юнит тесты
Как создать Docker контейнер?
docker run --name=warehouse-of-goods -e POSTGRES_PASSWORD='5218521111' -p 5436:5432 -d --rm postgres
Как посмотреть список контейнеров из командной строки?
docker ps
Как сделать миграцию?
migrate -path ./migrations -database 'postgres://postgres:5218521111@localhost:5436/postgres?sslmode=disable' up
make up_migrate
or
make down_migrate
Как подключиться к Docker контейнеру?
docker exec -it 837929f7557b /bin/bash
Как внутри контейнера запустить утилиту psql?
psql -U postgres