*image from practicum.yandex.ru
- Пользователь регистрируется в системе лояльности «Go-market».
- Пользователь совершает покупку в интернет-магазине «Go-market».
- Заказ попадает в систему расчёта баллов лояльности.
- Пользователь передаёт номер совершённого заказа в систему лояльности.
- Система связывает номер заказа с пользователем и сверяет номер с системой расчёта баллов лояльности.
- При наличии положительного расчёта баллов лояльности производится начисление баллов лояльности на счёт пользователя.
- ользователь списывает доступные баллы лояльности для частичной или полной оплаты последующих заказов в интернет-магазине «Гофермарт».
Хендлер: POST /api/user/register.
Регистрация производится по паре логин/пароль. Каждый логин должен быть уникальным. После успешной регистрации происходит автоматическая аутентификация пользователя. Для передачи аутентификационных данных используется HTTP-заголовок Authorization с JWT-токеном, в ветке develop - механизм cookies
POST /api/user/register HTTP/1.1 Content-Type: application/json ...
{ "login": "", "password": "" }
200 — пользователь успешно зарегистрирован и аутентифицирован; 400 — неверный формат запроса; 409 — логин уже занят; 500 — внутренняя ошибка сервера.
Аутентификация производится по паре логин/пароль. Для передачи аутентификационных данных используетсяHTTP-заголовок Authorization с JWT-токеном, в ветке develop - механизм cookies
POST /api/user/login HTTP/1.1 Content-Type: application/json ...
{ "login": "", "password": "" }
200 — пользователь успешно аутентифицирован; 400 — неверный формат запроса; 401 — неверная пара логин/пароль; 500 — внутренняя ошибка сервера.
Хендлер доступен только аутентифицированным пользователям. Номером заказа является последовательность цифр произвольной длины. Номер заказа проверяется на корректность ввода с помощью алгоритма Луна.
POST /api/user/orders HTTP/1.1 Content-Type: text/plain ...
12345678903
200 — номер заказа уже был загружен этим пользователем; 202 — новый номер заказа принят в обработку; 400 — неверный формат запроса; 401 — пользователь не аутентифицирован; 409 — номер заказа уже был загружен другим пользователем; 422 — неверный формат номера заказа; 500 — внутренняя ошибка сервера.
Хендлер доступен только авторизованному пользователю. Номера заказа в выдаче отсортированы по времени загрузки от самых старых к самым новым. Формат даты — RFC3339.
NEW — заказ загружен в систему, но не попал в обработку; PROCESSING — вознаграждение за заказ рассчитывается; INVALID — система расчёта вознаграждений отказала в расчёте; PROCESSED — данные по заказу проверены и информация о расчёте успешно получена.
GET /api/user/orders HTTP/1.1 Content-Length: 0
200 — успешная обработка запроса. Формат ответа: 200 OK HTTP/1.1 Content-Type: application/json ...
[ { "number": "9278923470", "status": "PROCESSED", "accrual": 500, "uploaded_at": "2020-12-10T15:15:45+03:00" }, { "number": "12345678903", "status": "PROCESSING", "uploaded_at": "2020-12-10T15:12:01+03:00" }, { "number": "346436439", "status": "INVALID", "uploaded_at": "2020-12-09T16:09:53+03:00" } ]
204 — нет данных для ответа. 401 — пользователь не авторизован. 500 — внутренняя ошибка сервера.
Хендлер доступен только авторизованному пользователю. В ответе содержатся данные о текущей сумме баллов лояльности, а также сумме использованных за весь период регистрации баллов.
GET /api/user/balance HTTP/1.1 Content-Length: 0
200 — успешная обработка запроса. 401 — пользователь не авторизован. 500 — внутренняя ошибка сервера.
200 OK HTTP/1.1 Content-Type: application/json ...
{ "current": 500.5, "withdrawn": 42 }
Хендлер доступен только авторизованному пользователю. Номер заказа представляет собой гипотетический номер нового заказа пользователя, в счёт оплаты которого списываются баллы. Примечание: для успешного списания достаточно успешной регистрации запроса, никаких внешних систем начисления не предусмотрено.
POST /api/user/balance/withdraw HTTP/1.1 Content-Type: application/json
{ "order": "2377225624", "sum": 751 }
Здесь order — номер заказа, а sum — сумма баллов к списанию в счёт оплаты.
200 — успешная обработка запроса; 401 — пользователь не авторизован; 402 — на счету недостаточно средств; 422 — неверный номер заказа; 500 — внутренняя ошибка сервера.
Хендлер доступен только авторизованному пользователю. Факты выводов в выдаче отсортированы по времени вывода от самых старых к самым новым. Формат даты — RFC3339.
GET /api/user/withdrawals HTTP/1.1 Content-Length: 0
200 — успешная обработка запроса. 204 — нет ни одного списания. 401 — пользователь не авторизован. 500 — внутренняя ошибка сервера.
200 OK HTTP/1.1 Content-Type: application/json ...
[ { "order": "2377225624", "sum": 500, "processed_at": "2020-12-09T16:09:57+03:00" } ]
GET /api/orders/{number} — получение информации о расчёте начислений баллов лояльности.
GET /api/orders/{number} HTTP/1.1 Content-Length: 0
200 — успешная обработка запроса. Формат ответа: 200 OK HTTP/1.1 Content-Type: application/json ...
{ "order": "<number>", "status": "PROCESSED", "accrual": 500 }
order — номер заказа; status — статус расчёта начисления: REGISTERED — заказ зарегистрирован, но не начисление не рассчитано; INVALID — заказ не принят к расчёту, и вознаграждение не будет начислено; PROCESSING — расчёт начисления в процессе; PROCESSED — расчёт начисления окончен; accrual — рассчитанные баллы к начислению, при отсутствии начисления — поле отсутствует в ответе.
429 — превышено количество запросов к сервису. 500 — внутренняя ошибка сервера.
429 Too Many Requests HTTP/1.1 Content-Type: text/plain Retry-After: 60
No more than N requests per minute allowed
Заказ может быть взят в расчёт в любой момент после его совершения. Время выполнения расчёта системой не регламентировано. Статусы INVALID и PROCESSED являются окончательными. Общее количество запросов информации о начислении не ограничено.
адрес и порт запуска сервиса: переменная окружения ОС RUN_ADDRESS или флаг -a; адрес подключения к базе данных: переменная окружения ОС DATABASE_URI или флаг -d; адрес системы расчёта начислений: переменная окружения ОС ACCRUAL_SYSTEM_ADDRESS или флаг -r.