Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions src/new_links_format/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Пример модификации метамодели для описания связей в новом формате

**Цель примера:**
1. Предоставить пример модификации метамодели
2. Предоставить новый способ описания связей между сущностями

# Суть примера
В примере реализован новый вид описания связей между сущностями. Задействованы механизмы изменения метамодели, кастомных сущностей(entity) и датасетов.

# Формат
Связь в данном примере описывается в следующем формате:
```yaml
links:
front.app-orders.backend:
from: front.app
to: orders.backend
via:
- orders.gateway
title: Передача заказа
contract: dh.contract.id

front.web-orders.backend:
from: front.web
to: orders.backend
via:
- orders.gateway
title: Передача заказа
```
Обязательными являются только параметры from/to. Новый параметр via позволяет отметить шлюз, через который работает связь между компонентами не создавая при этом двух отдельных сущностей.

# Особенности
1. Связь между компонентами - это отдельный объект, который можно расширить.
2. Несколько связей между компонентами на схемах группируется в одну. При клике по такой связи мы попадаем на страницу со списком.
3. В SELF контексте компонента будут отображены все связи, которые у него существуют. Неважно при этом где они описаны. Также будут показаны связи, которые проходят через шлюзы.
4. Все связи всплывают наверх, если вы используете модель DDD, при всплытии также происходит группировка.
5. Работает ТОЛЬКО с plantUML представлением.
6. Корректно работает в случае указания элемнтов разного уровня на контекстной диаграмме. При этом прозводительность упадет.

# Подключение:
1. Заменить файлы, находящиеся в папке metamodel/dochub/entities/contexts на файлы в соотвествующей папке из примера.
2. Использовать converter.json, которые сделает первичную конвертацию из формата старых ссылок в новый формат.
3. Подключить файлы entities/links.yaml и datasets/links.yaml в архитектуру
4. Добавить полученные данные в свойство "links:"
5. Старые связи можно не удалять

26 changes: 26 additions & 0 deletions src/new_links_format/converter.jsonata
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
(
$links := $.components.$spread().(
$id := $keys()[0];
$l := *.links;
$l.(
$f := $contains(direction, "<");
$f ? {
"from": id,
"to": $id,
"title": title,
"contract": contract
} : {
"from": $id,
"to": id,
"title": title,
"contract": contract
}
)
);
$links{from & "-" & to:{
"from": from,
"to": to,
"title": title,
"contract": contract
}}
)
24 changes: 24 additions & 0 deletions src/new_links_format/datasets/links.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
datasets:
links:
source: >
(
$c := $.components;
[
$.links.$spread().(
$d:=*.$;
$contract := $d.contract ? "/entities/docs/blank?dh-doc-id=" & $d.contract : "";
$from := $lookup($c, $d.from);
$to := $lookup($c, $d.to);
$url := $d.title;
{
"about": $url,
"from_link": "/architect/components/" & $d.from,
"to_link": "/architect/components/" & $d.to,
"from": $d.from,
"to": $d.to,
"via": $d.via,
"contract": $contract
}
)
]
)
4 changes: 4 additions & 0 deletions src/new_links_format/dochub.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
imports:
- entites/links.yaml
- datasets/links.yaml
- example.yaml
65 changes: 65 additions & 0 deletions src/new_links_format/entites/links.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
entities:
links:
menu: >
(
[{
"location": "Документы/Взаимодействия",
"link": "entities/links/mainlist"
}]
)
schema:
properties:
tables:
type: object
patternProperties:
# Определяем шаблон идентификаторов контекстов
^([a-zA-Z\\_0-9]*)\.([a-zA-Z\_0-9]*).([a-zA-Z\_0-9]*)$:
type: object
properties:
description:
type: string
owners:
type: array
required:
- description
- owners
presentations:
filtered:
type: table
headers:
- value: about
text: Описание взаимодействия
sortable: true
link: contract
- value: from
text: От
sortable: true
link: from_link
- value: to
text: К
sortable: true
link: to_link
origin: links
source: >
(
$from := $params.from != "" ? $params.from : "";
$to := $params.to != "" ? $params.to : "";
[$[$contains(from, $from) and $contains(to, $to)]]
)
mainlist:
type: table
headers:
- value: about
text: Описание взаимодействия
sortable: true
link: contract
- value: from
text: От
sortable: true
link: from_link
- value: to
text: К
sortable: true
link: to_link
origin: links
source: ($)
143 changes: 143 additions & 0 deletions src/new_links_format/example.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
links:
front.app-orders.backend:
from: front.app
to: orders.backend
via:
- orders.gateway
title: Передача заказа

front.web-orders.backend:
from: front.web
to: orders.backend
via:
- orders.gateway
title: Передача заказа

front.app-auth.backend:
from: front.app
to: auth.backend
via:
- auth.gateway
title: Авторизация

front.web-auth.backend:
from: front.web
to: auth.backend
via:
- auth.gateway
title: Авторизация

orders.backend-payments.backend:
from: orders.backend
to: payments.backend
via:
- payments.gateway
title: Оплата
payments.backend-payments.db:
from: payments.backend
to: payments.db

orders.backend-orders.db:
from: orders.backend
to: orders.db

orders.backend-auth.backend:
from: orders.backend
to: auth.backend
title: Авторизация
contract: notfounddocument

auth.backend-auth.db:
from: auth.backend
to: auth.db

components:
# Описываем L2

# **************************************
# Платежный шлюз (payments)
# **************************************
# Здесь даем общую информацию о системе.
# Детали будем собирать автоматически из L2
payments:
title: Платежи
entity: component

# Подробно описываем L2
payments.gateway:
title: Шлюз
entity: component
payments.backend:
title: Микросервис оплаты
entity: component
links:
- id: payments.db
payments.db:
title: База платежей
entity: database

# **************************************
# Подсистема заказов (orders)
# **************************************
# Аналогично, даем общую информацию
orders:
title: Заказы
entity: component

# Подробно описываем L2
orders.gateway:
title: Шлюз
entity: component
orders.backend:
title: Микросервис заказов
entity: component
orders.db:
title: База заказов
entity: database

# **************************************
# Подсистема авторизации (auth)
# **************************************
auth:
title: Авторизация
entity: component
auth.gateway:
title: Шлюз
entity: component
auth.backend:
title: Микросервис авторизации
entity: component
auth.db:
title: База пользователей
entity: database

# **************************************
# Фронтэнд (front)
# **************************************
# Пользовательское приложение
front:
title: Фронтальные компоненты
entity: component

front.web:
entity: component
title: Веб-сайт

front.app:
entity: component
title: Приложение

contexts:
L2:
title: L2 уровень
location: L2
components:
- "*.*" # Отбираем все компоненты второго уровня
L1:
title: L1 уровень
location: L1
components:
- front
- auth
- orders
- payments
Loading