Backend (Go + Postgres) for the Merch Shop + tests
Необходимо реализовать сервис, который позволит сотрудникам обмениваться монетками и приобретать на них мерч.
Каждый сотрудник должен иметь возможность видеть:
-
Список купленных им мерчовых товаров
-
Сгруппированную информацию о перемещении монеток в его кошельке, включая:
-
Кто ему передавал монетки и в каком количестве
-
Кому сотрудник передавал монетки и в каком количестве
-
Количество монеток не может быть отрицательным, запрещено уходить в минус при операциях с монетками.
Для того чтобы запустить проект через Docker, следуйте следующим шагам:
-
Склонируйте репозиторий:
git clone https://github.com/Optoed/merch-shop.git cd merch-shop
-
Запуск контейнеров:
docker compose up --build
Это создаст и запустит необходимые контейнеры. API будет доступно по адресу http://localhost:8080.
Если вы хотите запустить проект локально, выполните следующие шаги:
-
Убедитесь, что у вас установлен Go (версия 1.18 или выше).
-
Установите необходимые зависимости:
go mod tidy
-
Запустите приложение:
go run main.go
API будет доступно по адресу http://localhost:8080.
[Протестировать можно в Postman]
Метод: POST
URL: /api/auth
В теле запроса:
{
"username": "user",
"password": "123"
}
Ответ:
{
"description": "Успешная аутентификация.",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3Mzk4MjA0MjksInVzZXJfaWQiOjEsInVzZXJuYW1lIjoib3B0b2VkIn0.bBusn2R11h4QR5w0A9HEXDkCzmhotSlGrh3BmEhqzyQ"
}
Метод: POST
URL: /api/buy/:item
Authorization: Bearer Token
Пример:
http://localhost:8080/api/buy/cup
Ответ:
{
"description": "Успешный ответ."
}
Метод: POST
URL: /api/sendCoin
Authorization: Bearer Token
Тело запроса:
{
"toUser" : "user2",
"amount" : 100
}
Ответ:
{
"description": "Успешный ответ."
}
Метод: GET
URL: /api/info
Authorization: Bearer Token
Ответ:
{
"description": "Успешный ответ.",
"schema": {
"coinHistory": {
"received": [
{
"fromUser": "optoed2",
"amount": 101
}
],
"sent": [
{
"toUser": "optoed2",
"amount": 10
},
{
"toUser": "optoed1",
"amount": 12
},
{
"toUser": "optoed1",
"amount": 357
}
]
},
"coins": 1332,
"inventory": [
{
"type": "cup",
"quantity": 4
},
{
"type": "pen",
"quantity": 1
}
]
}
}
-
Хранение информации о мерче было реализовано посредством структуры map. Такое решение было предпринято по следующим причинам:
- всего 10 товаров, их состояние не изменяется
- map работает гораздо быстрее Postgres и даже Redis
- гораздо более простая логика, меньше накладок на систему
-
Для ускорения чтения данных из таблиц базы данных были применены hash_index.
-
Аутентификация включила в себя и регистрацию (если указанный пользователь не существует в бд) и логин (если существует). Сразу же выдается jwt token.
-
Было проведено тестирование - представлено в виде unit- и интеграционных тестов.
Также была создана база данных для тестов, интеграционные тесты работают именно с ней.
-
.golangci.yaml - файл с конфигурацией линтера.
-
Приложение способно работать локально.
-
Приложение способно работать через docker-контейнеры.