dataspace-ce
Platform V DataSpace Community Edition
Platform V DataSpace Community Edition – это программный компонент, который помогает ускорить создание бизнес-приложений и уменьшить затраты на их разработку.
Ключевые возможности продукта:
- Быстрое создание решения для работы с данными на основе модели предметной области
- Гибкий поиск и манипулирование данными (создание, изменение, удаление) с помощью языка запросов GraphQL
Системные требования:
- Поддерживаемые платформы: x86, x64
- Поддерживаемые операционные системы: Linux, Windows, Mac OS
- Минимальная конфигурация аппаратного обеспечения: 1 CPU, 256Mb ОЗУ
- Необходимые программные компоненты: Open JDK 17 и выше, Maven, Git
- Базы данных: PostgreSQL 9 и выше развернутый на внешнем сервере или локально в Docker-контейнере
Установка и подготовка к запуску
Предварительная настройка
- Скачать репозиторий проекта:
git clone https://gitverse.ru/sbertech/dataspace-ce.git
-
Собрать проект
Сборка проекта возможна в двух вариантах: с тестированием и без тестирования.
Для упрощения процесса знакомства имеется возможность выполнить сборку без тестирования. Для этого в директории проекта выполните следующую команду с использованием Maven:
mvn -Dmaven.test.skip=true clean install
Для сборки проекта с тестированием обратитесь к разделу "Сборка проекта с тестами" в руководстве Администратора
- Настроить параметры подключения к базе данных в файле context-child.properties. В варианте базы данных в виде Docker-контейнера запустите контейнер командой:
docker run --name dspc-pg-16.6 -p 5432:5432 -e POSTGRES_USER=dspc -e POSTGRES_PASSWORD=dspcpwd -e POSTGRES_DB=dspcdb -d postgres:16.6
Сборка модели
- Для подготовки модели данных выполните команду:
java -jar dataspace-legacy/model-release/target/model-release-DEV-SNAPSHOT-runnable.jar model-directory=files/resources/src-model run-liquibase=true target-directory=files/resources/build-model
В результате выполнения данной команды:
- в каталоге files/resources/build-model будут созданы файлы context-child.properties и pdm.xml, а также опциональные файлы безопасности: graphql-operations.json, jwks.json, при наличии их в исходной директории
- в базе данных будут созданы таблицы в соответствии с моделью данных
Запуск приложения
Для запуска приложения выполните команду:
java -jar dataspace-app/target/dataspace-app-DEV-SNAPSHOT.jar --dataspace.app.pathConfigDirectory=files/resources/build-model/ --dataspace.app.singleMode=true --dataspace.app.pdmZipped=false
После успешного запуска список загруженных моделей в виде JSON-документа можно увидеть по адресу: http://localhost:8080/actuator/models
При этом раздел endpoints содержит адреса, по которым можно отправлять GraphQL-запросы от клиентов (graphql), а также адрес web-интерфейса для работы с GraphQL (graphiql).
"graphql" : "/models/1/graphql", "graphiql" : "/graphiql?path=/models/1/graphql"
Также приложение позволяет выполнять GraphQL-запросы в удобном web-редакторе: http://localhost:8080/graphiql?path=/models/1/graphql
По умолчанию в приложении загружается модель с примером сервиса "Медицинская клиника: запись на прием"
При необходимости загрузки своей модели, файл с ее описанием необходимо разместить в каталоге files/resources/src-model, имя файла - model.xml. Более подробную информацию о структуре и правилах описания модели можно найти в Руководстве по ведению модели (model-guide.md)
Выполнение GraphQL-запросов на примере модели "Медицинская клиника: запись на прием"
Для быстрого ознакомления с GraphQL перейдите в Web-редактор http://localhost:8080/graphiql?path=/models/1/graphql
В раздел Variables укажите значения атрибутов для запроса на создание сущности:
{ "input": { "name": "Городская поликлиника №1", "address": { "city": "Москва", "street": "ул. Ленина", "flatNo": "10" } }}
Затем выполните GraphQL-запрос createClinicMutation через Web-редактор:
# Создание клиникиmutation createClinicMutation($input: _CreateClinicInput!) { packet { createClinic(input: $input) { id name address { city street flatNo } } }}
Для просмотра списка клиник выполните запрос searchClinicsQuery:
# Вывод списка клиникquery searchClinicsQuery { searchClinic { elems { id name address { city } } }}
По умолчанию в демо-примере отключен функционал разграничения прав доступа. Функционал разграничения прав доступа (далее Security) способен ограничивать доступ к данным на основе разрешений (permissions). Для его включения необходимо раскомментировать в файле context-child.properties параметр, определяющий правила описания логики разрешений (permissions):
dataspace.security.graphql.permissions.source=file
После этого необходимо заново собрать модель и перезапустить приложение
Для выполнения запросов в режиме Security через Web-редактор необходимо добавить токен JWT (JSON Web Token)в раздел Headers:
{ "Authorization": "Bearer eyJraWQiOiJxdWlja1N0YXJ0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJhdWQiOlsiYXVkMSIsImF1ZDIiLCJhdWQzIl0sInN1YiI6InF1aWNrU3RhcnRVc2VyIiwiY2l0eUVuZyI6Ik1vc2NvdyIsImNpdHkiOiLQnNC-0YHQutCy0LAiLCJyb2xlcyI6WyJhZG1pbmlzdHJhdG9yIiwibWFuYWdlciJdLCJpc3MiOiJxdWlja1N0YXJ0R3VpZGUiLCJleHAiOjQ4OTA4NzgxNjd9.Zbs45SeJKPb2gK-lsSri4PNTgCth0A1OE7IS4HRV8o4LXtc0PkmB3uAC7tgHwo2MfAH2bHvMsfPYTFoxsIK474ZVS-58-6MUDX9gMUQSAxtfnuDRmFoERk9VfvbUV44taFbZQ0FLGmZYaotjqe4PFwAUMC9BJ8w6EclJ6bb4E2o"}
В присутствующем в заголовке JWT содержатся ограничения:
- получение только клиники в "г.Москва"
Создайте дополнительную клинику в другом населенном пункте сменив значение Variables:
{
"input": {
"name": "Городская поликлиника №1",
"address": {
"city": "Торжок",
"street": "ул. Ленина",
"flatNo": "23"
}
}
}
и выполнив затем запрос:
mutation createClinicMutation($input: _CreateClinicInput!) {
packet {
createClinic(input: $input) {
id
name
address {
city
street
flatNo
}
}
}
}
Вновь запросим список доступных нам клиник:
query searchClinicsQuery {
searchClinic {
elems {
id
name
address {
city
}
}
}
}
Согласно функционалу Security в ответе по-прежнему будет присутствовать только клиника в г.Москва
Чтобы узнать больше о возможностях Security, ознакомьтесь с документацией по Security
Взаимодействие с GraphQL без UI:
curl -X POST \ -H "Authorization: Bearer eyJraWQiOiJxdWlja1N0YXJ0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJhdWQiOlsiYXVkMSIsImF1ZDIiLCJhdWQzIl0sInN1YiI6InF1aWNrU3RhcnRVc2VyIiwiY2l0eUVuZyI6Ik1vc2NvdyIsImNpdHkiOiLQnNC-0YHQutCy0LAiLCJyb2xlcyI6WyJhZG1pbmlzdHJhdG9yIiwibWFuYWdlciJdLCJpc3MiOiJxdWlja1N0YXJ0R3VpZGUiLCJleHAiOjQ4OTA4NzgxNjd9.Zbs45SeJKPb2gK-lsSri4PNTgCth0A1OE7IS4HRV8o4LXtc0PkmB3uAC7tgHwo2MfAH2bHvMsfPYTFoxsIK474ZVS-58-6MUDX9gMUQSAxtfnuDRmFoERk9VfvbUV44taFbZQ0FLGmZYaotjqe4PFwAUMC9BJ8w6EclJ6bb4E2o" \ -H 'Content-Type: application/json' \ -d '{"query": "query searchClinicsQuery { searchClinic { elems { id name address { city } } } }"}' \ http://localhost:8080/models/1/graphql
получим ответ:
{"data":{"searchClinic":{"elems":[{"id":"ad44313c-2308-45a4-ae4f-6596fd0d1cdb","name":"Городская поликлиника №1","address":{"city":"Москва"}}]}}}
Для дальнейшего ознакомления с Platform V DataSpace Community Edition обратитесь к документации.