README
¶
Payment REST API
Скачивание и настройка проекта
$ git clone https://github.com/Arcady1/go-rest-api.git
$ cd go-rest-api/
$ mv .env.dev .env
Docker
Запуск:
$ docker-compose up --build
Остановка:
$ docker-compose down
Настройка базы данных
Для создания необходимых таблиц, нужно запустить SQL скрипт /sql/init.sql.
API
Базовый URL:
http://<HOST>:<PORT>
Значения HOST и PORT устанавливаются в .env файле.
Заголовки в каждом запросе:
'Content-Type: application/json'
Метод начисления средств на баланс
Запрос:
HTTP PUT /api/v1/user/refill
Пример запроса:
HTTP PUT /api/v1/user/refill
Body {
"userId": "<ID пользователя>",
"amount": <Сумма зачисления>
}
Параметры запроса:
| Параметр | Описание | Тип | Формат | Обязательный |
|---|---|---|---|---|
| userId | ID пользователя, на чей счёт зачисляются деньги. | String | Любая непустая строка. | Да |
| amount | Сумма зачисления. | Float | Число типа Float. Мин: 0.01, шаг: 0.01. | Да |
Пример ответа:
{
"status": 201,
"message": "success",
"data": null
}
Параметры ответа:
| Свойство | Описание | Тип |
|---|---|---|
| status | Статус ответа. | Int |
| message | Сообщение ответа. | String |
| data | Данные ответа. | None |
Возможные ошибки
Пример ответа с ошибкой:
{
"status": 400,
"message": "Wrong data",
"data": null
}
| Код | Описание |
|---|---|
| 500 | Ошибка на стороне сервера. |
| 400 | Ошибка в переданных данных. |
Описание метода
- Метод позволяет начислить деньги на счёт пользователя.
- Если указанный пользователь не существует, то создаются новый пользователь и счёт. Деньги зачисляются на счёт сразу же.
- Если пользователь существует, то указанная сумма зачисляется ему на счёт, и баланс увеличивается.
Метод получения баланса пользователя
Запрос:
HTTP POST /api/v1/user/balance
Пример запроса:
HTTP POST /api/v1/user/balance
Body {
"userId": "<ID пользователя>",
}
Параметры запроса:
| Параметр | Описание | Тип | Формат | Обязательный |
|---|---|---|---|---|
| userId | ID пользователя, баланс счёта которого надо узнать. | String | Любая непустая строка. | Да |
Пример ответа:
{
"status": 200,
"message": "success",
"data": {
"balance": 10.55
}
}
Параметры ответа:
| Свойство | Описание | Тип |
|---|---|---|
| status | Статус ответа. | Int |
| message | Сообщение ответа. | String |
| data | Информация о балансе. | Object |
| data -> balance | Баланс пользователя. | Float |
Возможные ошибки
Пример ответа с ошибкой:
{
"status": 404,
"message": "The user with ID '1' is not found",
"data": null
}
| Код | Описание |
|---|---|
| 500 | Ошибка на стороне сервера. |
| 400 | Ошибка в переданных данных. |
| 404 | Пользователь не найден. |
Описание метода
- Метод позволяет узнать баланс пользователя.
- Если указанный пользователь существует, вернётся информация о его балансе, иначе - ошибка.
Метод резервирования средств с основного баланса на отдельном счете
Запрос:
HTTP POST /api/v1/payments/reserve
Пример запроса:
HTTP POST /api/v1/payments/reserve
Body {
"userId": "<ID пользователя>",
"serviceId": "<ID услуги>",
"orderId": "<ID заказа>",
"cost": <Стоимость>
}
Параметры запроса:
| Параметр | Описание | Тип | Формат | Обязательный |
|---|---|---|---|---|
| userId | ID пользователя, с чьего счёта резервируются деньги. | String | Любая непустая строка. | Да |
| serviceId | ID предоставляемой услуги. | String | Любая непустая строка. | Да |
| orderId | ID заказа. | String | Любая непустая строка. | Да |
| cost | Стоимость услуги. | Float | Число типа Float. Мин: 0.01, шаг: 0.01. | Да |
Пример ответа:
{
"status": 200,
"message": "success",
"data": null
}
Параметры ответа:
| Свойство | Описание | Тип |
|---|---|---|
| status | Статус ответа. | Int |
| message | Сообщение ответа. | String |
| data | Данные ответа. | None |
Возможные ошибки
Пример ответа с ошибкой:
{
"status": 400,
"message": "The order already exists",
"data": null
}
| Код | Описание |
|---|---|
| 500 | Ошибка на стороне сервера. |
| 400 | Ошибка в переданных данных. |
| 404 | Пользователь не найден. |
| 406 | Стоимость услуги превышает баланс счёта пользователя. |
Описание метода
- Метод позволяет зарезервировать деньги пользователя за заказ на отдельном счёте.
- У одного пользователя может быть неограниченное количество заказов.
- В одном заказе (
orderId) услуги (serviceId) повторяться не могут. - Чтобы повторно заказать услугу, необходимо создать заказ с уникальным
orderId. - Если у пользователя на счёте недостаточно средств, то резерв средств произвести невозможно - вернётся ошибка.
- В случае успешного резервирования денег, статус заказка меняется на
reserved.
Метод признания выручки
Запрос:
HTTP PUT /api/v1/payments/accept
Пример запроса:
HTTP PUT /api/v1/payments/accept
Body {
"userId": "<ID пользователя>",
"serviceId": "<ID услуги>",
"orderId": "<ID заказа>",
"amount": <Сумма списания>
}
Параметры запроса:
| Параметр | Описание | Тип | Формат | Обязательный |
|---|---|---|---|---|
| userId | ID пользователя, с чьего счёта резервируются деньги. | String | Любая непустая строка. | Да |
| serviceId | ID предоставляемой услуги. | String | Любая непустая строка. | Да |
| orderId | ID заказа. | String | Любая непустая строка. | Да |
| amount | Сумма списания. | Float | Число типа Float. Мин: 0.01, шаг: 0.01. | Да |
Пример ответа:
{
"status": 201,
"message": "success",
"data": null
}
Параметры ответа:
| Свойство | Описание | Тип |
|---|---|---|
| status | Статус ответа. | Int |
| message | Сообщение ответа. | String |
| data | Данные ответа. | None |
Возможные ошибки
Пример ответа с ошибкой:
{
"status": 406,
"message": "The order is not reserved. The order status is 'succeed'",
"data": null
}
| Код | Описание |
|---|---|
| 500 | Ошибка на стороне сервера. |
| 400 | Ошибка в переданных данных. |
| 404 | Пользователь или заказ не найден. |
| 406 | Статус заказа не 'reserved'. |
Описание метода
- Метод позволяет признать зарезервированную сумму.
- Если указанная сумма больше, чем зарезервированная, то происходит разрезервирование денег:
- Статус заказа меняется на
canceled. - Сумма заказа возвращается на счёт пользователя.
- Статус заказа меняется на
- Если указанная сумма меньше или равна зарезервированной, то происходит списание денег:
- Статус заказа меняется на
succeed. - Стоимость заказа становится равной переданной сумме.
- Разница между исходной стоимостью заказа и переданной суммой возвращается на счёт пользователя.
- Статус заказа меняется на
Схема базы данных Postgres
users
| Поле | Тип | Свойства |
|---|---|---|
| user_id | VARCHAR | PRIMARY KEY NOT NULL |
| account_id | VARCHAR | NOT NULL |
accounts
| Поле | Тип | Свойства |
|---|---|---|
| account_id | VARCHAR | PRIMARY KEY NOT NULL |
| balance | FLOAT | NOT NULL |
orders
| Поле | Тип | Свойства |
|---|---|---|
| id | VARCHAR | PRIMARY KEY NOT NULL |
| order_id | VARCHAR | NOT NULL |
| account_id | VARCHAR | NOT NULL |
| service_id | VARCHAR | NOT NULL |
| cost | FLOAT | NOT NULL |
| status | VARCHAR | NOT NULL |
License
MIT
Click to show internal directories.
Click to hide internal directories.