Skip to content

Rtuty/warehouse-of-goods

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

link: Аргументация выбора пакетов для реализации проекта

Общие требования к продукту:

  • Использование go fmt и goimports ✔
  • Следование Effective Go ✔| TODO: Отрефакторить проект
  • Go актуальной версии ✔
  • Использование JSON-RPC ✔
  • PostgreSQL или MySQL в качестве хранилища данных ✔

Основные задачи:

  1. Добиться работоспособности API. Реализация выполнения основных функций, с учетом пограничных кейсов ✔
  2. Реализовать грамотную организацию и читаемость кода ✔
  3. Добавить в проект обработку ошибок ✔

Дополнительные задачи:

  1. Использовать Makefile для запуска проекта ✔
  2. Покрытие кода unit или функциональными тестами TODO: Будет реализовано
  3. Запуск проекта в docker-контейнере через docker-compose up ✔| TODO
  4. Наличие файлов миграции базы данных и cli команда для их применения ✔
  5. Аргументация выбора пакетов в go.mod (находится в файле packages.md) ✔

Цель проекта

Необходимо реализовать API методы для работы с товарами на одном складе. Учесть, что вызов API может быть одновременно из разных систем и они могут работать с одинаковыми параметрами ✔

Логика реализации отказоустойчивости одновременных вызовов

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

Инструкция по запуску сервиса:

API Методы сервиса:

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:

Добавим товар на склад

  1. Задаем тип http запроса == POST
  2. Указываем 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: возможна доработка).

TODO:

Возвращать информативные JSON'ы, после отработки функций RPC. Доработка Dockerfile, написать docker-compose. Расширить фунционал Makefile. Переписать на именованные аргументы запросы, которые получают и используют данные от пользователя (дабы избежать sql инъекций). Также написать моки или юнит тесты

FAQ

Devops, docker

Как создать 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

About

Json RPC API for working with goods in warehouses

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published