Система лояльности «Гофермарт» представляет собой HTTP API, позволяющее пользователям регистрироваться, загружать номера заказов, накапливать бонусные баллы и использовать их для последующих покупок. Бонусы рассчитываются с использованием внешней системы расчёта баллов.
- Регистрация и аутентификация пользователей
- Приём номеров заказов
- Учёт списка заказов пользователя
- Начисление бонусных баллов
- Запрос текущего баланса
- Списание баллов на новые заказы
- Просмотр истории списаний
- Язык программирования: Go
- База данных: PostgreSQL
- Взаимодействие: REST API
- Аутентификация: JWT (или иной метод по усмотрению)
- Хранилище данных сжатых HTTP-запросов: поддерживается
-
Клонируйте репозиторий:
git clone https://github.com/apetsko/gophermart.git cd gophermart
-
Установите зависимости:
go mod tidy
-
Настройка конфигурации
Приложение получает параметры из флагов командной строки или переменных окружения (флаги имеют приоритет, если указаны оба варианта).Список параметров:
RUN_ADDRESS
(-a
) — адрес и порт, на котором будет запущен сервер.DATABASE_URI
(-d
) — строка подключения к базе данных PostgreSQL.ACCRUAL_SYSTEM_ADDRESS
(-r
) — адрес системы начислений.SECRET
(-s
) — секретный ключ для подписи токенов.
Если указаны одновременно флаг и переменная окружения, используется значение из флага. 4. Запустите приложение:
docker compose up -d
или
task dockerup
- POST
/api/user/register
- Формат запроса:
{ "login": "user123", "password": "securepassword" }
- Ответы:
200 OK
— успешная регистрация400 Bad Request
— неверный формат запроса409 Conflict
— логин уже используется
- POST
/api/user/login
- Формат запроса:
{ "login": "user123", "password": "securepassword" }
- Ответы:
200 OK
— успешная аутентификация400 Bad Request
— неверный формат401 Unauthorized
— неверный логин или пароль
- POST
/api/user/orders
- Формат запроса:
12345678903
- Ответы:
202 Accepted
— заказ принят в обработку409 Conflict
— заказ уже загружен422 Unprocessable Entity
— неверный формат номера заказа
- GET
/api/user/orders
- Ответ:
[ { "number": "9278923470", "status": "PROCESSED", "accrual": 500, "uploaded_at": "2020-12-10T15:15:45+03:00" } ]
- GET
/api/user/balance
- Ответ:
{ "current": 500.5, "withdrawn": 42 }
- POST
/api/user/balance/withdraw
- Формат запроса:
{ "order": "2377225624", "sum": 751 }
- Ответы:
200 OK
— списание успешно402 Payment Required
— недостаточно баллов
- GET
/api/user/withdrawals
- Ответ:
[ { "order": "2377225624", "sum": 500, "processed_at": "2020-12-10T15:15:45+03:00" } ]
Проект распространяется под лицензией MIT.