customer/openapi.yaml

464 lines
16 KiB
YAML
Raw Normal View History

2023-05-14 21:47:40 +00:00
openapi: 3.0.1
info:
title: Customer - сервис для управления клиентами
description: |-
Область ответственности сервиса - предоставление пользователю функционала корзины и кошелька.
version: 1.0.0
tags:
- name: account
description: аккаунт
- name: currency
description: доступные валюты
- name: cart
description: корзина
- name: wallet
description: кошелёк
- name: history
description: история
paths:
/account:
get:
tags:
- account
summary: Получение текущего аккаунта юзера
description: используется при заходе юзера в систему. Айдишник юзера получает из токена, который передаётся в заголовке authorization
operationId: getAccount
responses:
'200':
description: успешное получение
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
'401':
description: Неавторизован
'404':
description: Такого пользователя нет
post:
tags:
- account
summary: создать новый аккаунт
description: создаёт новый аккаунт для юзера, если такого ещё не было
operationId: addAccount
responses:
'201':
description: успешное созание аккаунта
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
'401':
description: Неавторизован
delete:
tags:
- account
summary: удалить собственный аккаунт
description: помечает аккаунт удалённым
operationId: deleteAccount
responses:
'200':
description: успешное удаление аккаунта
'401':
description: Неавторизован
/accounts:
get:
tags:
- account
summary: списко аккаунтов с пагинацией
description: получает список аккаунтов на указанной странице + общее количество аккаунтов
operationId: paginationAccounts
parameters:
- name: p
in: query
description: Номер страницы, начиная с 0
required: false
explode: false
schema:
type: integer
default: 0
- name: s
in: query
description: размер страницы
required: false
explode: false
schema:
type: integer
default: 10
responses:
'200':
description: успешное получение страницы аккаунтов
content:
application/json:
schema:
type: object
properties:
count:
type: integer
example: 11
items:
type: array
items:
$ref: "#/components/schemas/Account"
'401':
description: Неавторизован
/account/{accountId}:
get:
tags:
- account
summary: получить аккаунт по айди
description: метод необходимый в основном только менеджерам, для получения данных о клиенте
operationId: getDirectAccount
parameters:
- name: accountId
in: path
description: айдишник аккаунта
required: true
2023-05-15 16:41:04 +00:00
schema:
type: string
2023-05-14 21:47:40 +00:00
responses:
'200':
description: успешное получение аккаунта
content:
application/json:
schema:
$ref: '#/components/schemas/Account'
'401':
description: Неавторизован
'404':
description: Нет такого пользователя
delete:
tags:
- account
summary: удалить аккаунт по айди
description: метод необходимый в основном только менеджерам, для удаления клиента
operationId: deleteDirectAccount
parameters:
- name: accountId
in: path
description: айдишник аккаунта
required: true
2023-05-15 16:41:04 +00:00
schema:
type: string
2023-05-14 21:47:40 +00:00
responses:
'200':
description: успешное удаление аккаунта
'401':
description: Неавторизован
'404':
description: Нет такого пользователя
/currencies:
get:
tags:
- currency
summary: получить список одобренных валют
operationId: getCurrencies
responses:
'200':
description: успешное получение списка валют
content:
application/json:
schema:
type: array
example:
- "RUB"
- "USD"
- "CAD"
items:
type: string
patch:
tags:
- currency
summary: обновляет список одобренных валют
operationId: updateCurrencies
requestBody:
content:
application/json:
schema:
type: array
example:
- "RUB"
- "USD"
- "CAD"
items:
type: string
responses:
'401':
description: Uanuthorized
/cart:
put:
tags:
- cart
summary: добавляем в корзину тариф
description: 'необходимо проверить, что такой тариф существует'
operationId: add2cart
requestBody:
content:
application/json:
schema:
type: object
properties:
id:
type: string
example: "807f1f77bcf81cd799439011"
responses:
'200':
description: добавлено в корзину
'401':
description: неавторизован
'404':
description: не найден такой тариф
delete:
tags:
- cart
summary: удаляем из корзины тариф
operationId: removeFromCart
parameters:
- name: id
in: query
required: true
schema:
type: string
example: "807f1f77bcf81cd799439011"
responses:
'200':
description: удалено из корзины
'401':
description: неавторизован
'404':
description: не найден такой тариф
2023-05-15 16:41:04 +00:00
/cart/pay:
2023-05-14 21:47:40 +00:00
post:
tags:
2023-05-15 16:41:04 +00:00
- cart
summary: оплатить козину
description: "- очевидно нужен воркер или очередь(место где можно потрогать кафку), которая будет слать запросы в конечные сервисы для добавления привилегий в аккаунт пользователя\n
- в случае если денег в кошельке достаточно - отправить в воркер или очередь задачи на разослать конкретным сервисам добавление привилегий\n
- если денег недостаточно, получить ссылку на оплату у сервиса платёжки и вернуть её. в случае оплаты, повторить вызов этого метода\n
- очистить корзину"
operationId: payCart
2023-05-14 21:47:40 +00:00
requestBody:
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
type: object
properties:
id:
type: string
description: айдишник для того, чтобы указать сервису оплаты, какой юзер оплатил
example: "807f1f77bcf81cd799439011"
2023-05-14 21:47:40 +00:00
responses:
'200':
2023-05-15 16:41:04 +00:00
description: успешная оплата корзины
2023-05-14 21:47:40 +00:00
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
$ref: '#/components/schemas/Account'
'401':
description: Неавторизован
/wallet:
patch:
2023-05-14 21:47:40 +00:00
tags:
2023-05-15 16:41:04 +00:00
- wallet
summary: изменить валюту кошелька
description: "при запросе:\n
- отвалидировать, что такая валюта одобрена \n
- получить данные из сервиса cbrf(выдам задачу на него чуть позднее)\n
- перевести валюту кошелька в нвоую валюту. кошелёк нарочно целочисленный, чтобы не было претензий к точности с плавающей точкой, поэтому, например долларовый счёт считается в центах"
operationId: changeCurrency
requestBody:
content:
application/json:
schema:
type: object
properties:
currency:
type: string
example: "USD"
2023-05-14 21:47:40 +00:00
responses:
'200':
2023-05-15 16:41:04 +00:00
description: успешная смена валюты кошелька
2023-05-14 21:47:40 +00:00
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
$ref: "#/components/schemas/Account"
'401':
description: Неавторизован
2023-05-14 21:47:40 +00:00
'400':
2023-05-15 16:41:04 +00:00
description: Такая валюта не одобрена
put:
2023-05-14 21:47:40 +00:00
tags:
2023-05-15 16:41:04 +00:00
- wallet
summary: зачислить деньги на кошелёк
description: "прибавляем полученное значение к cash и при необходимости приводим к валюте кошелька"
operationId: putMoney
2023-05-14 21:47:40 +00:00
requestBody:
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
type: object
properties:
cash:
type: integer
example: 10000
currency:
type: string
example: "USD"
id:
type: string
example: "807f1f77bcf81cd799439011"
2023-05-14 21:47:40 +00:00
responses:
2023-05-15 16:41:04 +00:00
'200':
description: успешное внесение денег на кошелёк
2023-05-14 21:47:40 +00:00
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
$ref: "#/components/schemas/Account"
'400':
description: Такая валюта не одобрена
2023-05-14 21:47:40 +00:00
post:
tags:
2023-05-15 16:41:04 +00:00
- wallet
summary: запрос на получение ссылки на оплату
description: "- формируем запрос к сервису оплаты, с необходимыми постбэками\n
- получаем ответ от сервиса оплаты с ссылкой на оплату, которую надо передать пользователю"
operationId: requestMoney
2023-05-14 21:47:40 +00:00
requestBody:
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
type: object
properties:
cash:
type: integer
example: 10000
2023-05-14 21:47:40 +00:00
responses:
'200':
2023-05-15 16:41:04 +00:00
description: успешный зпрос денег
2023-05-14 21:47:40 +00:00
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
type: object
properties:
link:
type: string
example: "https://google.ru"
'500':
description: сервис оплаты вернул ошибку
/history:
2023-05-14 21:47:40 +00:00
get:
tags:
2023-05-15 16:41:04 +00:00
- history
summary: получение лога событий связанных с аккаунтом
operationId: getHistory
2023-05-14 21:47:40 +00:00
parameters:
2023-05-15 16:41:04 +00:00
- name: p
2023-05-14 21:47:40 +00:00
in: query
2023-05-15 16:41:04 +00:00
description: Номер страницы, начиная с 0
2023-05-14 21:47:40 +00:00
required: false
2023-05-15 16:41:04 +00:00
explode: false
2023-05-14 21:47:40 +00:00
schema:
2023-05-15 16:41:04 +00:00
type: integer
default: 0
- name: s
2023-05-14 21:47:40 +00:00
in: query
2023-05-15 16:41:04 +00:00
description: размер страницы
2023-05-14 21:47:40 +00:00
required: false
2023-05-15 16:41:04 +00:00
explode: false
2023-05-14 21:47:40 +00:00
schema:
2023-05-15 16:41:04 +00:00
type: integer
default: 10
2023-05-14 21:47:40 +00:00
responses:
'200':
description: successful operation
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
type: object
properties:
count:
type: integer
example: 11
items:
type: array
items:
$ref: '#/components/schemas/Record'
'401':
description: Неавторизован
post:
2023-05-14 21:47:40 +00:00
tags:
2023-05-15 16:41:04 +00:00
- history
summary: публикация лога в истории
operationId: add2history
2023-05-14 21:47:40 +00:00
requestBody:
content:
application/json:
schema:
2023-05-15 16:41:04 +00:00
$ref: "#/components/schemas/Record"
2023-05-14 21:47:40 +00:00
responses:
2023-05-15 16:41:04 +00:00
'200':
2023-05-14 21:47:40 +00:00
description: successful operation
components:
schemas:
Account:
type: object
properties:
_id:
type: string
example: "807f1f77bcf81cd799439011"
userId:
type: string
example: "807f1f77bcf81cd799439011"
cart:
$ref: "#/components/schemas/Cart"
wallet:
$ref: "#/components/schemas/Wallet"
isDeleted:
type: boolean
example: false
Wallet:
type: object
properties:
currency:
type: string
example: "RUB"
cash:
type: integer
format: int64
example: 10701
2023-05-15 16:41:04 +00:00
money:
type: integer
format: int64
description: деньги на счету в копейках. Чтобы при перессчётах не возникало денег изниоткуда. фиксируемся к одной валюте, она будет внутренней, никому её не покажем
example: 10701
2023-05-14 21:47:40 +00:00
Cart:
type: array
items:
type: string
example:
- "807f1f77bcf81cd799439011"
- "807f1f77bcf81cd799439011"
- "807f1f77bcf81cd799439011"
2023-05-15 16:41:04 +00:00
Record:
2023-05-14 21:47:40 +00:00
type: object
properties:
id:
type: string
2023-05-15 16:41:04 +00:00
example: "807f1f77bcf81cd799439011"
userId:
2023-05-14 21:47:40 +00:00
type: string
2023-05-15 16:41:04 +00:00
example: "807f1f77bcf81cd799439011"
type:
2023-05-14 21:47:40 +00:00
type: string
2023-05-15 16:41:04 +00:00
enum: ["successfulPayment", "declinedPayment", "timeoutPayment", "buyCart", "subsriptionEnd"]
example: "successfulPayment"
createdAt:
2023-05-14 21:47:40 +00:00
type: string
2023-05-15 16:41:04 +00:00
format: date-time
comment:
2023-05-14 21:47:40 +00:00
type: string
2023-05-15 16:41:04 +00:00
example: "я это сделал потому что 42"
subject:
2023-05-14 21:47:40 +00:00
type: string
2023-05-15 16:41:04 +00:00
description: я пока не могу предположить, какие будут фильтры по истории, поэтому предлагаю в это поле просто класть строку с json. ибо для каждого типа записи она своя.
example: {"tariffs":["807f1f77bcf81cd799439011","807f1f77bcf81cd799439011"]}