Skip to content

t1mon-ggg/gophermart

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

72 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

gophermart

Сводное HTTP API

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/balance/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.

Хендлер доступен только аутентифицированным пользователям. Номером заказа является последовательность цифр произвольной длины.
Номер заказа может быть проверен на корректность ввода с помощью алгоритма Луна.

Формат запроса:

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` — рассчитанные баллы к начислению, при отсутствии начисления — поле отсутствует в ответе.  

429 — превышено количество запросов к сервису.
Формат ответа:

  429 Too Many Requests HTTP/1.1  
  Content-Type: text/plain  
  Retry-After: 60  
    
  No more than N requests per minute allowed  

500 — внутренняя ошибка сервера.

Заказ может быть взят в расчёт в любой момент после его совершения. Время выполнения расчёта системой не регламентировано. Статусы INVALID и PROCESSED являются окончательными.
Общее количество запросов информации о начислении не ограничено.
Конфигурирование сервиса накопительной системы лояльности

Сервис должен поддерживать конфигурирование следующими методами:
адрес и порт запуска сервиса: переменная окружения ОС RUN_ADDRESS или флаг -a;
адрес подключения к базе данных: переменная окружения ОС DATABASE_URI или флаг -d;
адрес системы расчёта начислений: переменная окружения ОС ACCRUAL_SYSTEM_ADDRESS или флаг -r.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages