$ git clone https://github.com/Arcady1/go-rest-api.git
$ cd go-rest-api/
$ mv .env.dev .env
Запуск:
$ docker-compose up --build
Остановка:
$ docker-compose down
Для создания необходимых таблиц, нужно запустить SQL скрипт /sql/init.sql
.
Базовый 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
. - Стоимость заказа становится равной переданной сумме.
- Разница между исходной стоимостью заказа и переданной суммой возвращается на счёт пользователя.
- Статус заказа меняется на
Поле | Тип | Свойства |
---|---|---|
user_id | VARCHAR | PRIMARY KEY NOT NULL |
account_id | VARCHAR | NOT NULL |
Поле | Тип | Свойства |
---|---|---|
account_id | VARCHAR | PRIMARY KEY NOT NULL |
balance | FLOAT | NOT NULL |
Поле | Тип | Свойства |
---|---|---|
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 |
MIT