Qravan
Qravan [карав`ан] — сервер для быстрого создания API обмена данными, консолидирующий различные источники с SQL-интерфейсами (СУБД или REST).
Установка
Установить как GEM (предпочтительно):
$ gem install qravan
Или добавить строку ниже в свой Gemfile:
gem 'qravan'
Потом выполнить:
$ bundle install
Запуск
Запустить сервер Qravan:
$ qravan
Сервер станет доступен по адресу http://localhost:3300/
. В базовую поставку включены демонстрационные источники postgres
, prostore
и модель vehicles
.
Методы сервера
Сервер содержит следующие методы:
- GET http://localhost:3300/ping — проверить запусщенность сервера (ответ PONG!)
- GET http://localhost:3300/model — список загруженных моделей
- GET http://localhost:3300/sources — список загруженных источников
- POST http://localhost:3300/data — выполнить запрос
Настройка моделей данных и ресурсов
Модели
Модели данных описываются в соответствии со спецификацией в формате
YAML в папке models/[model_name]/[model_version x.x]/model.yaml
Версионирование моделей должно осуществляться в двухразрядном формате.
По-умолчанию сервер запускает модель по симлинку с current
.
Ресурсы
Источники описывются также в соответствии со спецификацией в формате
YAML в папке sources/[source_name]/[source_version x.x]/source.yaml
Версионирование источников должно осуществляться в двухразрядном формате.
По-умолчанию сервер запускает источники по симлинку с current
.
qravan
│ README.md
│ credentials.yaml
│
└─models
│ └─base
│ │ │ current
│ │ └─1.0
│ │ │ model.yaml
│ │
│ └─vehicles
│ │ current
│ └─1.0
│ │ └─ model.yaml
│ └─2.0
│ └─ model.yaml
│
└─sources
│ └─vehicles
│ │ current
│ └─1.0
│ │ └─ source.yaml
│ └─2.0
│ └─ source.yaml
Пример использования
Демо-данные
В составе Qravan описаны демо-модели и источники. Также в папке examples
лежат дампы (pg_dump
) Postgres, достаточные для проверок ниже.
Запросы к демо-данным
Запрос объединенных данных о владельце автомобиля из Prostore и Postgres:
{
"query":{
"driver":{
"conditions":{
"driverlicensetype":"E",
"drivermiddlename":"Александрович"
},
"attributes":[
"DriverLastname",
"DriverFirstname",
"DriverMiddlename",
"driverlicensetype"
]
},
"super_driver":{
"conditions":{
"driverlicensetype":"D",
"driverfirstname": "Евгений"
},
"attributes":[
"DriverLastname",
"DriverFirstname",
"DriverMiddlename",
"driverlicensetype"
]
},
"driver_license":{
"conditions":{
"driverlicensetype":"C",
"driverlicensetypeid": 1
},
"attributes":[
"DriverLastname",
"DriverFirstname",
"DriverMiddlename",
"Driverlicenseid"
]
},
"identity_document":{
"conditions": {
"driverlicensetypeid": 4
},
"attributes":[
"driverlicenseissuer",
"DriverLicenseSerNum",
"driverlicensetype"
]
}
},
"credentials":{
"system":{
"mnemonic":"117bed7f-1c07-4079-a446-1161588db4e5",
"instance_id":"ccb4a88f-f44b-43e7-8a97-3e45c8345e90",
"user_id":"5ed38461-0907-486a-930a-7b443482932c"
},
"request":{
"id":"df5a0073-c6be-4d8c-8eb2-9b2f4188a429",
"sub_id":"0cdb59ce-224b-4118-8da1-c5ea08a5d955",
"name":"driver_data",
"purpose_id":"ed1170f1-3caa-4985-aa38-c9c5a190b770",
"audit":"false",
"audit_id":"fc1048fe-323d-4eeb-92df-5710b3d1d100",
"audit_token":"39e47aac-45d2-44c1-8c26-2d9b28b1703b"
},
"signature":{
"digest": null,
"signature": null
}
}
}
Ответ для данного запроса будет иметь вид:
{
"response": [
{
"driver": [
[
{
"driverlastname": "Козлов",
"driverfirstname": "Кирилл",
"drivermiddlename": "Александрович",
"driverlicensetype": "E"
},
{
"driverlastname": "Фёдоров",
"driverfirstname": "Михаил",
"drivermiddlename": "Александрович",
"driverlicensetype": "E"
}
],
{
"time": "REST Duration: 0.21902s "
}
]
},
{
"super_driver": [
[
{
"driverlastname": "Белов",
"driverfirstname": "Евгений",
"drivermiddlename": "Витальевич",
"driverlicensetype": "D"
},
{
"driverlastname": "Комаров",
"driverfirstname": "Евгений",
"drivermiddlename": "Александрович",
"driverlicensetype": "D"
}
],
{
"time": "REST Duration: 0.022836s "
}
]
},
{
"driver_license": [
{
"driverlastname": "Беляев",
"driverfirstname": "Алексей",
"drivermiddlename": "Николаевич",
"driverlicenseid": 32
},
{
"driverlastname": "Соловьёв",
"driverfirstname": "Леонид",
"drivermiddlename": "Иванович",
"driverlicenseid": 26
},
{
"driverlastname": "Михайлов",
"driverfirstname": "Александр",
"drivermiddlename": "Георгиевич",
"driverlicenseid": 34
},
{
"time": "DB Duration: 0.00319s"
}
]
},
{
"identity_document": [
{
"driverlicenseissuer": "44261",
"driverlicensesernum": "32662",
"driverlicensetype": "B"
},
{
"driverlicenseissuer": "32203",
"driverlicensesernum": "39303",
"driverlicensetype": "A"
},
{
"driverlicenseissuer": "43233",
"driverlicensesernum": "30101",
"driverlicensetype": "A"
},
{
"driverlicenseissuer": "45275",
"driverlicensesernum": "42336",
"driverlicensetype": "B"
},
{
"driverlicenseissuer": "46690",
"driverlicensesernum": "31614",
"driverlicensetype": "A"
},
{
"driverlicenseissuer": "37435",
"driverlicensesernum": "47250",
"driverlicensetype": "B"
},
{
"driverlicenseissuer": "36823",
"driverlicensesernum": "45173",
"driverlicensetype": "C"
},
{
"driverlicenseissuer": "33728",
"driverlicensesernum": "43290",
"driverlicensetype": "C"
},
{
"driverlicenseissuer": "41989",
"driverlicensesernum": "47023",
"driverlicensetype": "C"
},
{
"time": "DB Duration: 0.001113s"
}
]
}
],
"credentials": {
"response": {
"id": "4201414d-fa86-4221-9d15-f91c10356daa",
"sub_id": "a59ea446-5dca-4705-bca5-53d6569e58a2",
"started_at": "2023-01-20 12:34:25 +0300",
"finished_at": "2023-01-20 12:34:25 +0300"
},
"system": {
"mnemonic": "117bed7f-1c07-4079-a446-1161588db4e5",
"instance_id": "ccb4a88f-f44b-43e7-8a97-3e45c8345e90",
"user_id": "5ed38461-0907-486a-930a-7b443482932c"
},
"request": {
"id": "df5a0073-c6be-4d8c-8eb2-9b2f4188a429",
"sub_id": "0cdb59ce-224b-4118-8da1-c5ea08a5d955",
"name": "driver_data",
"purpose_id": "ed1170f1-3caa-4985-aa38-c9c5a190b770",
"audit": "false",
"audit_id": "fc1048fe-323d-4eeb-92df-5710b3d1d100",
"audit_token": "39e47aac-45d2-44c1-8c26-2d9b28b1703b"
},
"signature": {
"digest": null,
"signature": null
}
}
}
Лицензирование
Qravan распространяется под открытой лицензией CAPAAL.
Copyright (c) 2022 Panasenkov Alexander (apanasenkov@capaa.ru)