Categorygithub.com/Arcady1/go-rest-api
module
0.0.0-20230127064656-3d0862d35abb
Repository: https://github.com/arcady1/go-rest-api.git
Documentation: pkg.go.dev

# 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": <Сумма зачисления>
}

Параметры запроса:

ПараметрОписаниеТипФорматОбязательный
userIdID пользователя, на чей счёт зачисляются деньги.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 пользователя>",
}

Параметры запроса:

ПараметрОписаниеТипФорматОбязательный
userIdID пользователя, баланс счёта которого надо узнать.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": <Стоимость>
}

Параметры запроса:

ПараметрОписаниеТипФорматОбязательный
userIdID пользователя, с чьего счёта резервируются деньги.StringЛюбая непустая строка.Да
serviceIdID предоставляемой услуги.StringЛюбая непустая строка.Да
orderIdID заказа.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": <Сумма списания>
}

Параметры запроса:

ПараметрОписаниеТипФорматОбязательный
userIdID пользователя, с чьего счёта резервируются деньги.StringЛюбая непустая строка.Да
serviceIdID предоставляемой услуги.StringЛюбая непустая строка.Да
orderIdID заказа.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_idVARCHARPRIMARY KEY NOT NULL
account_idVARCHARNOT NULL

accounts

ПолеТипСвойства
account_idVARCHARPRIMARY KEY NOT NULL
balanceFLOATNOT NULL

orders

ПолеТипСвойства
idVARCHARPRIMARY KEY NOT NULL
order_idVARCHARNOT NULL
account_idVARCHARNOT NULL
service_idVARCHARNOT NULL
costFLOATNOT NULL
statusVARCHARNOT NULL

License

MIT

# Packages

No description provided by the author
No description provided by the author