Update master (#4)

* update

* renamed to vality
This commit is contained in:
Артем 2022-01-24 15:35:28 +03:00 committed by GitHub
parent b8b19e1d82
commit da5112091b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
32 changed files with 4616 additions and 8994 deletions

23
.github/workflows/build.yaml vendored Normal file
View File

@ -0,0 +1,23 @@
name: build
on:
- pull_request
env:
NODEJS_VERSION: '16'
jobs:
bundle:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ env.NODEJS_VERSION }}
cache: npm
- run: npm install
- name: Bundle specification
run: npm run build
- name: Validate specification
run: npm run test

28
.github/workflows/gh-pages.yaml vendored Normal file
View File

@ -0,0 +1,28 @@
name: gh-pages
on:
push:
branches: [master]
env:
NODEJS_VERSION: '16'
jobs:
publish:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v2
with:
node-version: ${{ env.NODEJS_VERSION }}
cache: npm
- run: npm install
- name: Bundle specification
run: npm run build
- name: Publish ReDoc on Github Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./dist
exclude_assets: 'swagger-ui'

7
.gitignore vendored
View File

@ -1,6 +1,6 @@
# Dir for API portal deploy
dist
out
dist/
out/
# Logs
logs
@ -35,6 +35,3 @@ node_modules
# CI
.wercker
# Generated
web_deploy/

View File

@ -1,10 +1 @@
# Wallet API Specification
## TODO
* Надо бы ввести identity service terms.
* Кажется всё-таки, что identity classes и identity levels на одном уровне иерархии.
* Можно попробовать identity classes и levels совместить во что-то одно (типа badges) и позволять набивать их в identity в произвольном количестве.
* Вообще, withdrawal может включать и user interaction.
* Ресурсы _currencies_ и _residences_ выглядят как достаточно универсальные, чтобы их вынести в отдельную спеку.
* Пропатчить _swagger-repo_ так, чтобы _swagger-editor_ корректно работал с репозиториями, в которых больше одной спеки.

View File

@ -1,7 +1,7 @@
type: object
properties:
authData:
description: Данные для авторизации операции по карте
description: Данные для авторизации платежа по карте
type: string
minLength: 1
maxLength: 1000

View File

@ -1,19 +1,11 @@
description: Платёжная система
description: Платежная система
type: string
enum:
- visa
- mastercard
- visaelectron
- maestro
- forbrugsforeningen
- dankort
- amex
- dinersclub
- discover
- unionpay
- jcb
- nspkmir
- elo
- rupay
- dummy
- uzcard
# enum:
# - visa
# - mastercard
# - amex
# - dinersclub
# - discover
# - unionpay
# - jcb
# - nspkmir

View File

@ -2,4 +2,3 @@ type: object
allOf:
- $ref: '#/definitions/SecuredBankCard'
- $ref: '#/definitions/AuthData'
- $ref: '#/definitions/ValidUntil'

View File

@ -1,20 +1,17 @@
swagger: '2.0'
info:
version: '0.0.1'
title: RBKmoney Payment Resource API
version: '0.1.0'
title: Vality Payment Resource API
description: >
Платформа предоставляет возможность токенизации исходных данных пользовательских платёжных ресурсов.
Используя RBKmoney Payment Resource API вы можете для своего платёжного ресурса получить уникальный токен,
который может быть использован для переводов.
Vality Payment Resource API служит для токенизации чувствительных данных платёжных ресурсов пользователей.
termsOfService: http://rbk.money/
termsOfService: https://vality.dev/
contact:
name: RBKmoney support team
email: support@rbk.money
url: https://rbk.money
host: api.rbk.money
name: Команда техподдержки
email: support@vality.dev
url: https://vality.dev/
host: api.vality.dev
basePath: /payres/v0
schemes:
- https

View File

@ -1,12 +0,0 @@
description: Исходные чувствительные данные персональные документа
type: object
discriminator: type
required:
- type
properties:
type:
description: Вид документа
type: string
enum:
- RUSDomesticPassportData
- RUSRetireeInsuranceCertificateData

View File

@ -1,20 +0,0 @@
description: Открытые данные национального паспорта гражданина РФ
allOf:
- $ref: '#/definitions/SecuredPrivateDocument'
- type: object
properties:
seriesMasked:
description: Маскированная серия паспорта
type: string
example: "45**"
readOnly: true
numberMasked:
description: Маскированный номер паспорта
type: string
example: "*****6"
readOnly: true
fullnameMasked:
description: Маскированное полное имя гражданина
type: string
example: "И***** И.И."
readOnly: true

View File

@ -1,69 +0,0 @@
description: Исходные данные национального паспорта гражданина РФ
allOf:
- $ref: '#/definitions/PrivateDocument'
- type: object
required:
- series
- number
- issuer
- issuerCode
- issuedAt
- familyName
- firstName
- birthDate
- birthPlace
properties:
series:
description: Серия паспорта
type: string
example: "4567"
pattern: '^[0-9]{4}$'
number:
description: Номер паспорта
type: string
example: "123456"
pattern: '^[0-9]{6}$'
issuer:
description: Наименование выдавшего паспорт органа
type: string
example: |
Отделение УФМС России по Кемеровской области в Юргинском районе
maxLength: 1000
issuerCode:
description: Код подразделения выдавшего паспорт органа
type: string
example: |
666-777
pattern: '^[0-9]{3}-[0-9]{3}$'
issuedAt:
description: Дата выдачи паспорта
type: string
format: date
familyName:
description: Фамилия гражданина
type: string
example: "Иванов"
# pattern: "^[А-Яа-я'-]{1,100}$"
maxLength: 100
firstName:
description: Имя гражданина
type: string
example: "Иван"
# pattern: "^[А-Яа-я'-]{1,100}$"
maxLength: 100
patronymic:
description: Отчество гражданина
type: string
example: "Иванович"
# pattern: "^[А-Яа-я'-]{1,100}$"
maxLength: 100
birthDate:
description: Дата рождения гражданина
type: string
format: date
birthPlace:
description: Место рождения гражданина
type: string
# pattern: "^[ .0-9А-Яа-я'-]{1,100}$"
maxLength: 100
example: "дер. Белянино"

View File

@ -1,13 +0,0 @@
description: |
Открытые данные страхового свидетельства обязательного пенсионного страхования
гражданина РФ
allOf:
- $ref: '#/definitions/SecuredPrivateDocument'
- type: object
properties:
numberMasked:
description: |
Маскированный [СНИЛС](https://ru.wikipedia.org/wiki/Страховой_номер_индивидуального_лицевого_счёта)
type: string
example: "12*-***-*** *4"
readOnly: true

View File

@ -1,15 +0,0 @@
description: |
Исходные данные страхового свидетельства обязательного пенсионного страхования
гражданина РФ
allOf:
- $ref: '#/definitions/PrivateDocument'
- type: object
required:
- number
properties:
number:
description: |
[СНИЛС](https://ru.wikipedia.org/wiki/Страховой_номер_индивидуального_лицевого_счёта)
type: string
example: "123-456-789 64"
pattern: "^[0-9]{3}-[0-9]{3}-[0-9]{3} [0-9]{2}$"

View File

@ -1,15 +0,0 @@
description: |
Персональный документ, токенизированный с целью сокрытия чувствительных данных
type: object
discriminator: type
required:
- token
properties:
type:
x-rebillyMerge:
- $ref: '#/definitions/SecuredPrivateDocumentType'
- readOnly: true
token:
description: Токен, уникально идентифицирующий исходные данные
type: string
example: 7kodCm5gr68ji4O11KpVn0

View File

@ -1,5 +0,0 @@
description: Тип документа
type: string
enum:
- RUSDomesticPassport
- RUSRetireeInsuranceCertificate

View File

@ -1 +0,0 @@
../../../../../spec/definitions/responses/BadRequest.yaml

View File

@ -1,20 +0,0 @@
post:
operationId: storePrivateDocument
summary: Сохранить персональный документ
tags:
- Private Documents
parameters:
- $ref: '#/parameters/requestID'
- name: proof
description: Данные документа
in: body
required: true
schema:
$ref: '#/definitions/PrivateDocument'
responses:
'201':
description: Документ токенизирован
schema:
$ref: '#/definitions/SecuredPrivateDocument'
'400':
$ref: '#/responses/BadRequest'

View File

@ -1,61 +0,0 @@
swagger: '2.0'
info:
version: '0.0.1'
title: RBKmoney Private Document API
description: >
RBKmoney Private Document API служит для токенизации чувствительных данных
персональных документов пользователей.
termsOfService: http://rbk.money/
contact:
name: RBKmoney support team
email: support@rbk.money
url: https://rbk.money
host: api.rbk.money
basePath: /privdoc/v0
schemes:
- https
consumes:
- application/json; charset=utf-8
produces:
- application/json; charset=utf-8
securityDefinitions:
bearer:
type: apiKey
name: Authorization
in: header
description: >
Для аутентификации вызовов мы используем [JWT](https://jwt.io).
Cоответствующий ключ передается в заголовке.
```shell
Authorization: Bearer {TOKENIZATION|PRIVATE_JWT}
```
security:
- bearer: []
responses:
BadRequest:
description: Недопустимые для операции входные данные
schema:
$ref: '#/definitions/BadRequest'
parameters:
requestID:
name: X-Request-ID
in: header
description: Уникальный идентификатор запроса к системе
required: true
type: string
maxLength: 32
minLength: 1
tags:
- name: Private Documents
x-displayName: Персональные документы
description: ""

View File

@ -8,7 +8,7 @@ properties:
description: |
Тип ресурса приёмника средств.
См. [RBKmoney Payment Resource API](?api/payres/swagger.yaml).
См. [Vality Payment Resource API](?api/payres/swagger.yaml).
type: string
enum:
- BankCardDestinationResource

View File

@ -1,4 +1,4 @@
description: Уникальный в рамках платформы идентификатор участника.
description: Уникальный в рамках системы идентификатор участника.
type: string
minLength: 1
maxLength: 40

View File

@ -12,7 +12,7 @@ properties:
description: |
Человекочитаемое наименование провайдера услуг
type: string
example: НКО «ЭПС»
example: ООО «СЕРВИС ПРОВАЙДЕР»
residences:
type: array
description: |

View File

@ -1,3 +1,3 @@
description: Идентификатор провайдера услуг
type: string
example: ncoeps
example: serviceprovider

View File

@ -8,7 +8,7 @@ properties:
description: |
Тип ресурса получателя средств.
См. [RBKmoney Payment Resource API](?api/payres/swagger.yaml).
См. [Vality Payment Resource API](?api/payres/swagger.yaml).
type: string
enum:
- BankCardReceiverResource

View File

@ -8,7 +8,7 @@ properties:
description: |
Тип ресурса получателя средств.
См. [RBKmoney Payment Resource API](?api/payres/swagger.yaml).
См. [Vality Payment Resource API](?api/payres/swagger.yaml).
type: string
enum:
- BankCardReceiverResourceParams

View File

@ -8,7 +8,7 @@ properties:
description: |
Тип ресурса отправителя средств.
См. [RBKmoney Payment Resource API](?api/payres/swagger.yaml).
См. [Vality Payment Resource API](?api/payres/swagger.yaml).
type: string
enum:
- BankCardSenderResource

View File

@ -8,7 +8,7 @@ properties:
description: |
Тип ресурса отправителя средств.
См. [RBKmoney Payment Resource API](?api/payres/swagger.yaml).
См. [Vality Payment Resource API](?api/payres/swagger.yaml).
type: string
enum:
- BankCardSenderResourceParams

View File

@ -1,24 +1,16 @@
swagger: '2.0'
info:
version: '0.0.1'
title: RBKmoney Wallet API
version: '0.1.0'
title: Vality Wallet API
description: >
RBKmoney Wallet API является базовой и единственной точкой взаимодействия с
платформой кошельков. Все изменения состояний платформы осуществляются с
помощью вызовов соответствующих методов API. Любые сторонние приложения,
включая наши веб-сайты и другие UI-интерфейсы являются внешними
приложениями-клиентами.
Vality Wallet API является базовой и единственной точкой взаимодействия с системой кошельков. Все изменения состояний системы осуществляются с помощью вызовов соответствующих методов API. Любые сторонние приложения, включая наши веб-сайты и другие UI-интерфейсы, являются внешними приложениями-клиентами.
RBKmoney API работает поверх HTTP-протокола. Мы используем REST архитектуру,
схема описывается в соответствии со [Swagger](http://swagger.io/). Коды
возврата описываются соответствующими HTTP-статусами. Платформа принимает и
возвращает значения JSON в теле запросов и ответов.
Vality API работает поверх HTTP-протокола. Мы используем REST архитектуру, схема описывается в соответствии с [OpenAPI 2.0](https://spec.openapis.org/oas/v2.0). Коды возврата описываются соответствующими HTTP-статусами. Система принимает и возвращает значения JSON в теле запросов и ответов.
## Формат содержимого
Любой запрос к API должен выполняться в кодировке UTF-8 и с указанием
содержимого в формате JSON.
Любой запрос к API должен выполняться в кодировке UTF-8 и с указанием содержимого в формате JSON.
```
Content-Type: application/json; charset=utf-8
@ -26,7 +18,7 @@ info:
## Формат дат
Платформа принимает значения date-time в формате, описанном в RFC 3339, например:
Система принимает и возвращает значения отметок времени в формате `date-time`, описанном в [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339):
```
2017-01-01T00:00:00Z
@ -35,43 +27,37 @@ info:
## Максимальное время обработки запроса
К любому вызову методов API можно добавить параметр отсечки по времени,
определяющий максимальное время ожидания завершения операции по запросу.
Данная отсечка передается в соответствующем заголовке HTTP-запроса:
При любом обращении к API в заголовке `X-Request-Deadline` соответствующего запроса можно передать параметр отсечки по времени, определяющий максимальное время ожидания завершения операции по запросу:
```
X-Request-Deadline: 10s
```
Значение отсечки может быть задано в формате, описанном в RFC 3339 (см. [Формат дат](#section/Format-dat)),
либо в относительных величинах, например:
По истечении указанного времени система прекращает обработку запроса. Рекомендуется указывать значение не более одной минуты, но не менее трёх секунд.
`150000ms`, `540s`, `3.5m`
При этом возможные единицы измерения `ms`, `s`, `m`.
В обоих случаях не рекомендуется, чтобы задаваемое значение было
меньше **3 секунд** и превышало **1 минуту**.
`X-Request-Deadline` может:
* задаваться в формате `date-time` согласно [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339);
* задаваться в относительных величинах: в миллисекундах (`150000ms`), секундах (`540s`) или минутах (`3.5m`).
## Ошибки обработки запросов
В процессе обработки запросов силами нашей платформы могут происходить
различные непредвиденные ситуации. Об их появлении платформа сигнализирует
по протоколу HTTP соответствующими [статусами][5xx], обозначающими ошибки
сервера.
В процессе обработки запросов силами нашей системы могут происходить различные непредвиденные ситуации. Об их появлении система сигнализирует по протоколу HTTP соответствующими [статусами][5xx], обозначающими ошибки сервера.
| Код | Описание |
| ------- | ---------- |
| **500** | В процессе обработки платформой запроса возникла непредвиденная ситуация. При получении подобного кода ответа мы рекомендуем обратиться в техническую поддержку. |
| **503** | Платформа временно недоступна и не готова обслуживать данный запрос. Запрос гарантированно не выполнен, при получении подобного кода ответа попробуйте выполнить его позднее, когда доступность платформы будет восстановлена. |
| **504** | Платформа превысила допустимое время обработки запроса, результат запроса не определён. Попробуйте отправить запрос повторно или выяснить результат выполнения исходного запроса, если повторное исполнение запроса нежелательно. |
| **500** | В процессе обработки системой запроса возникла непредвиденная ситуация. При получении подобного кода ответа мы рекомендуем обратиться в техническую поддержку. |
| **503** | Система временно недоступна и не готова обслуживать данный запрос. Запрос гарантированно не выполнен, при получении подобного кода ответа попробуйте выполнить его позднее, когда доступность системы будет восстановлена. |
| **504** | Система превысила допустимое время обработки запроса, результат запроса не определён. Попробуйте отправить запрос повторно или выяснить результат выполнения исходного запроса, если повторное исполнение запроса нежелательно. |
[5xx]: https://tools.ietf.org/html/rfc7231#section-6.6
termsOfService: http://rbk.money/
termsOfService: 'https://vality.dev/'
contact:
name: RBKmoney support team
email: support@rbk.money
url: https://rbk.money
host: api.rbk.money
name: Команда техподдержки
email: support@vality.dev
url: 'https://api.vality.dev'
host: api.vality.dev
basePath: /wallet/v0
schemes:
- https
@ -85,11 +71,10 @@ securityDefinitions:
name: Authorization
in: header
description: >
Для аутентификации вызовов мы используем [JWT](https://jwt.io).
Cоответствующий ключ передается в заголовке.
Для аутентификации вызовов мы используем [JWT](https://jwt.io). Соответствующий ключ передается в заголовке.
```shell
Authorization: Bearer {TOKENIZATION|PRIVATE_JWT}
Authorization: Bearer {YOUR_API_KEY_JWT}
```
security:
@ -142,15 +127,6 @@ parameters:
maxLength: 40
minLength: 1
challengeID:
name: challengeID
in: path
description: Идентификатор процедуры идентификации личности
required: true
type: string
maxLength: 40
minLength: 1
walletID:
name: walletID
in: path
@ -322,12 +298,6 @@ parameters:
tags:
- name: Payment Resources
x-displayName: Платёжные ресурсы
description: >
Платформа предоставляет возможность токенизации исходных данных пользовательских платёжных ресурсов.
См. [RBKmoney Payment Resource API](?api/payres/swagger.yaml).
- name: Providers
x-displayName: Провайдеры услуг
description: ""
@ -365,27 +335,19 @@ tags:
description: ""
- name: W2W
x-displayName: Переводы внутри платформы
description: "Переводы средств между кошельками внутри платформы"
x-displayName: Переводы внутри системы
description: "Переводы средств между кошельками внутри системы"
- name: Webhooks
x-displayName: Webhooks
description: >
## RBKmoney Webhooks Management API
## Vality Webhooks Management API
В данном разделе описаны методы, позволяющие управлять Webhook'ами, или
инструментами для получения асинхронных оповещений посредством
HTTP-запросов при наступлении одного или группы интересующих вас событий,
например, о том, что выплата в рамках созданного кошелька была успешно
проведена.
В данном разделе описаны методы, позволяющие управлять Webhook'ами, или инструментами для получения асинхронных оповещений посредством HTTP-запросов при наступлении одного или группы интересующих вас событий, например, о том, что выплата в рамках созданного кошелька была успешно проведена.
## RBKmoney Webhooks Events API
## Vality Webhooks Events API
Внимание! Только Webhooks Management API является частью платформы
RBKmoney, а следовательно и данной спецификации. Для реализации
обработчика присылаемых уведомлений вам необходимо будет ознакомиться со
Swagger-спецификацей [RBKmoney Wallet Webhooks Events
API](https://rbkmoney.github.io/wallet-webhook-events-api/).
Внимание! Только Webhooks Management API является частью системы Vality, а следовательно и данной спецификации. Для реализации обработчика присылаемых уведомлений вам необходимо будет ознакомиться с OpenAPI-спецификацией [Vality Wallets Webhook Events API](https://vality.github.io/swag-wallets-webhook-events/).
- name: Error Codes
x-displayName: Коды ошибок
@ -399,5 +361,4 @@ tags:
| InvalidReceiverResource| Неверный получатель перевода (введен номер несуществующей карты и т.п.) |
| InsufficientFunds | Недостаточно средств на счете банковской карты |
| PreauthorizationFailed | Предварительная авторизация отклонена (введен неверный код 3D-Secure, на форме 3D-Secure нажата ссылка отмены) |
| RejectedByIssuer | Перевод отклонён эмитентом (установлены запреты по стране списания, запрет на покупки в интернете, платёж отклонен антифродом эмитента и т.п.) |
| RejectedByIssuer | Перевод отклонён эмитентом (установлены запреты по стране списания, запрет на покупки в интернете, платеж отклонен антифродом эмитента и т.п.) |

View File

@ -1,14 +1,14 @@
var gulp = require('gulp');
var util = require('gulp-util')
var gulpConnect = require('gulp-connect');
var connect = require('connect');
var cors = require('cors');
var path = require('path');
var exec = require('child_process').exec;
var portfinder = require('portfinder');
var swaggerRepo = require('swagger-repo');
const gulp = require('gulp');
const util = require('gulp-util');
const gulpConnect = require('gulp-connect');
const connect = require('connect');
const cors = require('cors');
const exec = require('child_process').exec;
const portfinder = require('portfinder');
const swaggerRepo = require('swagger-repo');
var DIST_DIR = 'dist';
const DIST_DIR = 'dist';
const SPEC_DIR = 'spec';
gulp.task('build', function (cb) {
exec('npm run build', function (err, stdout, stderr) {
@ -17,22 +17,22 @@ gulp.task('build', function (cb) {
});
});
gulp.task('edit', function () {
portfinder.getPort({ port: 5000 }, function (err, port) {
var app = connect();
let app = connect();
app.use(swaggerRepo.swaggerEditorMiddleware());
app.listen(port);
util.log(util.colors.green('swagger-editor started http://localhost:' + port));
});
});
gulp.task('reload', gulp.series('build', function () {
gulp.src(DIST_DIR).pipe(gulpConnect.reload())
}));
gulp.task('watch', function () {
gulp.watch(['api/**/*', 'spec/**/*', 'web/**/*'], gulp.series('reload'));
gulp.watch([`${SPEC_DIR}/**/*`, 'web/**/*'], gulp.series('reload'));
});
gulp.task('serve', gulp.parallel('build', 'edit', 'watch', function () {

13105
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,15 +1,14 @@
{
"name": "rbkmoney-wallet-api-spec",
"version": "0.0.1",
"name": "vality-wallet-openapi-spec",
"version": "0.1.0",
"dependencies": {
"bower": "^1.7.7",
"connect": "^3.4.1",
"cors": "^2.7.1",
"gulp": "^4.0.2",
"gulp-connect": "^4.2.0",
"gulp-util": "^3.0.7",
"json-merge-patch": "^0.2.3",
"npm": "^5.7.1",
"npm": "^8.1.3",
"portfinder": "^1.0.3",
"shelljs": "^0.7.0",
"swagger-repo": "^1.5.1",
@ -19,7 +18,10 @@
"scripts": {
"build": "node ./scripts/build.js",
"swagger": "swagger-repo",
"test": "swagger-repo validate --basedir api/wallet/spec/ && swagger-repo validate --basedir api/privdoc/spec/ && swagger-repo validate --basedir api/payres/spec/",
"test": "swagger-repo validate --basedir api/wallet/spec/ && swagger-repo validate --basedir api/payres/spec/",
"start": "gulp serve"
},
"devDependencies": {
"gulp": "github:gulpjs/gulp"
}
}

View File

@ -16,7 +16,6 @@ properties:
- NoMatch
- InvalidResourceToken
- InvalidToken
- AmbiguousPartyID
example: NotFound
name:
description: Имя или идентификатор элемента сообщения, содержащего недопустимые данные

View File

@ -2,11 +2,10 @@
<html>
<head>
<title>RBKmoney Wallets API</title>
<title>Vality Wallets API</title>
<!-- needed for adaptive design -->
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<link href="https://fonts.googleapis.com/css?family=Montserrat:300,400,700|Roboto:300,400,700" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/redoc@next/bundles/redoc.standalone.js">
</script>
<!--