Накопительная система лояльности «Гофермарт» должна предоставлять следующие HTTP-хендлеры:
| Метод | Путь | Описание |
|---|---|---|
| POST | /api/user/register | Регистрация пользователя |
| POST | /api/user/login | Аутентификация пользователя |
| POST | /api/user/orders | Загрузка пользователем номера заказа для расчёта |
| GET | /api/user/orders | Получение списка загруженных пользователем номеров заказов, их статусов и информации о начислениях |
| GET | /api/user/balance | Получение текущего баланса счёта баллов лояльности пользователя |
| POST | /api/user/balance/withdraw | Запрос на списание баллов с накопительного счёта в счёт оплаты нового заказа |
| GET | /api/user/withdrawals | Получение информации о выводе средств с накопительного счёта пользователем |
Хендлер: POST /api/user/register.
Регистрация производится по паре логин/пароль. Каждый логин должен быть уникальным. После успешной регистрации должна происходить автоматическая аутентификация пользователя.
Формат запроса:
POST /api/user/register HTTP/1.1
Content-Type: application/json
...
{
"login": "<login>",
"password": "<password>"
}
Возможные коды ответа:
200— пользователь успешно зарегистрирован и аутентифицирован;400— неверный формат запроса;409— логин уже занят;500— внутренняя ошибка сервера.
Хендлер: POST /api/user/login.
Аутентификация производится по паре логин/пароль.
Формат запроса:
POST /api/user/login HTTP/1.1
Content-Type: application/json
...
{
"login": "<login>",
"password": "<password>"
}
Возможные коды ответа:
200— пользователь успешно аутентифицирован;400— неверный формат запроса;401— неверная пара логин/пароль;500— внутренняя ошибка сервера.
Хендлер: POST /api/user/orders.
Хендлер доступен только аутентифицированным пользователям. Номером заказа является последовательность цифр произвольной длины.
Номер заказа может быть проверен на корректность ввода с помощью алгоритма Луна{target="_blank"}.
Формат запроса:
POST /api/user/orders HTTP/1.1
Content-Type: text/plain
...
12345678903
Возможные коды ответа:
200— номер заказа уже был загружен этим пользователем;202— новый номер заказа принят в обработку;400— неверный формат запроса;401— пользователь не аутентифицирован;409— номер заказа уже был загружен другим пользователем;422— неверный формат номера заказа;500— внутренняя ошибка сервера.
Хендлер: GET /api/user/orders.
Хендлер доступен только авторизованному пользователю. Номера заказа в выдаче должны быть отсортированы по времени загрузки от самых старых к самым новым. Формат даты — 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.
Хендлер доступен только авторизованному пользователю. В ответе должны содержаться данные о текущей сумме баллов лояльности, а также сумме использованных за весь период регистрации баллов.
Формат запроса:
GET /api/user/balance HTTP/1.1
Content-Length: 0
Возможные коды ответа:
-
200— успешная обработка запроса.Формат ответа:
200 OK HTTP/1.1 Content-Type: application/json ... { "current": 500.5, "withdrawn": 42 } -
401— пользователь не авторизован. -
500— внутренняя ошибка сервера.
Хендлер: POST /api/user/balance/withdraw
Хендлер доступен только авторизованному пользователю. Номер заказа представляет собой гипотетический номер нового заказа пользователя в счет оплаты которого списываются баллы.
Примечание: для успешного списания достаточно успешной регистрации запроса, никаких внешних систем начисления не предусмотрено и не требуется реализовывать.
Формат запроса:
POST /api/user/balance/withdraw HTTP/1.1
Content-Type: application/json
{
"order": "2377225624",
"sum": 751
}
Здесь order — номер заказа, а sum — сумма баллов к списанию в счёт оплаты.
Возможные коды ответа:
200— успешная обработка запроса;401— пользователь не авторизован;402— на счету недостаточно средств;422— неверный номер заказа;500— внутренняя ошибка сервера.
Хендлер: GET /api/user/balance/withdrawals.
Хендлер доступен только авторизованному пользователю. Факты выводов в выдаче должны быть отсортированы по времени вывода от самых старых к самым новым. Формат даты — RFC3339.
Формат запроса:
GET /api/user/withdrawals HTTP/1.1
Content-Length: 0
Возможные коды ответа:
-
200— успешная обработка запроса.Формат ответа:
200 OK HTTP/1.1 Content-Type: application/json ... [ { "order": "2377225624", "sum": 500, "processed_at": "2020-12-09T16:09:57+03:00" } ] -
204- нет ни одного списания. -
401— пользователь не авторизован. -
500— внутренняя ошибка сервера.
Для взаимодействия с системой доступен один хендлер:
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— рассчитанные баллы к начислению, при отсутствии начисления — поле отсутствует в ответе.
-
-
204- заказ не зарегистрирован в системе расчета. -
429— превышено количество запросов к сервису.Формат ответа:
429 Too Many Requests HTTP/1.1 Content-Type: text/plain Retry-After: 60 No more than N requests per minute allowed -
500— внутренняя ошибка сервера.