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 schema: type: string 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 schema: type: string 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: не найден такой тариф /cart/pay: post: tags: - cart summary: оплатить козину description: "- очевидно нужен воркер или очередь(место где можно потрогать кафку), которая будет слать запросы в конечные сервисы для добавления привилегий в аккаунт пользователя\n - в случае если денег в кошельке достаточно - отправить в воркер или очередь задачи на разослать конкретным сервисам добавление привилегий\n - если денег недостаточно, получить ссылку на оплату у сервиса платёжки и вернуть её. в случае оплаты, повторить вызов этого метода\n - очистить корзину" operationId: payCart requestBody: content: application/json: schema: type: object properties: id: type: string description: айдишник для того, чтобы указать сервису оплаты, какой юзер оплатил example: "807f1f77bcf81cd799439011" responses: '200': description: успешная оплата корзины content: application/json: schema: $ref: '#/components/schemas/Account' '401': description: Неавторизован /wallet: patch: tags: - wallet summary: изменить валюту кошелька description: "при запросе:\n - отвалидировать, что такая валюта одобрена \n - получить данные из сервиса cbrf(выдам задачу на него чуть позднее)\n - перевести валюту кошелька в нвоую валюту. кошелёк нарочно целочисленный, чтобы не было претензий к точности с плавающей точкой, поэтому, например долларовый счёт считается в центах" operationId: changeCurrency requestBody: content: application/json: schema: type: object properties: currency: type: string example: "USD" responses: '200': description: успешная смена валюты кошелька content: application/json: schema: $ref: "#/components/schemas/Account" '401': description: Неавторизован '400': description: Такая валюта не одобрена put: tags: - wallet summary: зачислить деньги на кошелёк description: "прибавляем полученное значение к cash и при необходимости приводим к валюте кошелька" operationId: putMoney requestBody: content: application/json: schema: type: object properties: cash: type: integer example: 10000 currency: type: string example: "USD" id: type: string example: "807f1f77bcf81cd799439011" responses: '200': description: успешное внесение денег на кошелёк content: application/json: schema: $ref: "#/components/schemas/Account" '400': description: Такая валюта не одобрена post: tags: - wallet summary: запрос на получение ссылки на оплату description: "- формируем запрос к сервису оплаты, с необходимыми постбэками\n - получаем ответ от сервиса оплаты с ссылкой на оплату, которую надо передать пользователю" operationId: requestMoney requestBody: content: application/json: schema: type: object properties: cash: type: integer example: 10000 responses: '200': description: успешный зпрос денег content: application/json: schema: type: object properties: link: type: string example: "https://google.ru" '500': description: сервис оплаты вернул ошибку /history: get: tags: - history summary: получение лога событий связанных с аккаунтом operationId: getHistory 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: successful operation content: application/json: schema: type: object properties: count: type: integer example: 11 items: type: array items: $ref: '#/components/schemas/Record' '401': description: Неавторизован post: tags: - history summary: публикация лога в истории operationId: add2history requestBody: content: application/json: schema: $ref: "#/components/schemas/Record" responses: '200': 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 money: type: integer format: int64 description: деньги на счету в копейках. Чтобы при перессчётах не возникало денег изниоткуда. фиксируемся к одной валюте, она будет внутренней, никому её не покажем example: 10701 Cart: type: array items: type: string example: - "807f1f77bcf81cd799439011" - "807f1f77bcf81cd799439011" - "807f1f77bcf81cd799439011" Record: type: object properties: id: type: string example: "807f1f77bcf81cd799439011" userId: type: string example: "807f1f77bcf81cd799439011" type: type: string enum: ["successfulPayment", "declinedPayment", "timeoutPayment", "buyCart", "subsriptionEnd"] example: "successfulPayment" createdAt: type: string format: date-time comment: type: string example: "я это сделал потому что 42" subject: type: string description: я пока не могу предположить, какие будут фильтры по истории, поэтому предлагаю в это поле просто класть строку с json. ибо для каждого типа записи она своя. example: {"tariffs":["807f1f77bcf81cd799439011","807f1f77bcf81cd799439011"]}