Files
hotel-analysis/C4-Architecture.md

636 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[Назад](/README.md)
# C4 Architecture Diagrams - TaskManager
## Содержание
1. [Level 1: System Context](#level-1-system-context)
2. [Level 2: Container Diagram](#level-2-container-diagram)
3. [Level 3: Component Diagram - Tasks Service](#level-3-component-diagram---tasks-service)
4. [Level 3: Component Diagram - Adapter Layer](#level-3-component-diagram---adapter-layer)
---
## Level 1: System Context
Показывает TaskManager в контексте пользователей и внешних систем.
```mermaid
C4Context
title System Context diagram for TaskManager
Person(hotel_staff, "Hotel Staff", "Сотрудники отеля (горничные, техники, менеджеры)")
Person(admin, "System Admin", "Администратор системы")
Person(guest, "Hotel Guest", "Гость отеля")
System(taskmanager, "TaskManager", "Платформа для управления задачами между подразделениями отеля и интеграции с внешними системами")
System_Ext(pms, "PMS System", "Система управления отелем (Opera, Fidelio)")
System_Ext(erp, "ERP System", "Система управления ресурсами")
System_Ext(housekeeping, "Housekeeping App", "Приложение для управления уборкой")
System_Ext(email, "Email System", "SMTP сервер для отправки email")
System_Ext(sms, "SMS Gateway", "Сервис отправки SMS (Twilio)")
System_Ext(telegram, "Telegram", "Telegram Bot API")
System_Ext(s3, "AWS S3", "Хранилище файлов")
Rel(hotel_staff, taskmanager, "Создает и управляет задачами", "Web/Mobile")
Rel(admin, taskmanager, "Настраивает систему, связи, роли", "Web Admin")
Rel(guest, taskmanager, "Создает запросы на обслуживание", "Telegram Bot")
Rel(taskmanager, pms, "Получает/отправляет данные о бронированиях, номерах", "REST API/Webhook")
Rel(taskmanager, erp, "Интегрируется с учетом ресурсов", "REST API")
Rel(taskmanager, housekeeping, "Отправляет задачи на уборку", "REST API/Push")
Rel(taskmanager, email, "Отправляет уведомления", "SMTP")
Rel(taskmanager, sms, "Отправляет SMS уведомления", "REST API")
Rel(taskmanager, telegram, "Получает запросы гостей, отправляет уведомления", "Webhook/Bot API")
Rel(taskmanager, s3, "Хранит файлы и фото", "S3 API")
UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="2")
```
---
## Level 2: Container Diagram
Показывает основные контейнеры (приложения и хранилища данных) внутри TaskManager.
```mermaid
C4Container
title Container diagram for TaskManager
Person(hotel_staff, "Hotel Staff", "Сотрудники отеля")
Person(admin, "System Admin", "Администратор системы")
Person(guest, "Hotel Guest", "Гость отеля")
System_Ext(pms, "PMS System", "Opera/Fidelio")
System_Ext(erp, "ERP System", "ERP")
System_Ext(housekeeping_ext, "Housekeeping App", "External App")
System_Ext(email_ext, "Email System", "SMTP")
System_Ext(sms_ext, "SMS Gateway", "Twilio")
System_Ext(telegram_ext, "Telegram", "Bot API")
System_Ext(s3_ext, "AWS S3", "File Storage")
Container_Boundary(taskmanager, "TaskManager System") {
Container(web_admin, "Web Admin", "React, TypeScript", "Веб-приложение для настройки системы и управления")
Container(mobile_app, "Mobile App", "React Native/Flutter", "Мобильное приложение для сотрудников")
Container(api_gateway, "API Gateway", "Kong/Envoy", "Единая точка входа, маршрутизация, аутентификация")
Container(tasks_service, "Tasks Service", "Python, FastAPI, gRPC", "Управление задачами")
Container(connections_service, "Connections Service", "Python, FastAPI, gRPC", "Управление связями между адаптерами")
Container(users_service, "Users Service", "Python, FastAPI, gRPC", "Управление пользователями")
Container(permissions_service, "Permissions Service", "Python, FastAPI, gRPC", "Управление ролями и правами (RBAC)")
Container(notification_service, "Notification Service", "Python, FastAPI", "Отправка уведомлений через разные каналы")
Container(file_storage_service, "File Storage Service", "Python, FastAPI", "Управление файлами")
Container(audit_service, "Audit Service", "Python, FastAPI", "Логирование всех действий")
Container(scheduler_service, "Scheduler Service", "Python, FastAPI", "Управление периодическими задачами")
Container(events_service, "Events Service", "Python, FastAPI, gRPC", "Управление мероприятиями")
Container(pms_adapter, "PMS Adapter", "Python", "Адаптер для PMS системы")
Container(erp_adapter, "ERP Adapter", "Python", "Адаптер для ERP системы")
Container(housekeeping_adapter, "Housekeeping Adapter", "Python", "Адаптер для приложения уборки")
Container(telegram_adapter, "Telegram Bot Adapter", "Python", "Адаптер для Telegram бота")
ContainerQueue(kafka, "Message Broker", "Apache Kafka", "Асинхронная коммуникация между сервисами")
ContainerDb(postgres, "Database", "PostgreSQL", "Хранение данных системы")
ContainerDb(redis, "Cache", "Redis", "Кэширование данных, сессии")
}
Rel(hotel_staff, web_admin, "Использует", "HTTPS")
Rel(hotel_staff, mobile_app, "Использует", "HTTPS")
Rel(admin, web_admin, "Настраивает систему", "HTTPS")
Rel(guest, telegram_adapter, "Отправляет запросы", "Telegram")
Rel(web_admin, api_gateway, "Делает API запросы", "REST/gRPC-Web")
Rel(mobile_app, api_gateway, "Делает API запросы", "REST/gRPC")
Rel(api_gateway, tasks_service, "Маршрутизирует запросы", "gRPC")
Rel(api_gateway, users_service, "Маршрутизирует запросы", "gRPC")
Rel(api_gateway, connections_service, "Маршрутизирует запросы", "gRPC")
Rel(api_gateway, events_service, "Маршрутизирует запросы", "gRPC")
Rel(api_gateway, file_storage_service, "Маршрутизирует запросы", "REST")
Rel(tasks_service, kafka, "Публикует события", "Kafka Protocol")
Rel(connections_service, kafka, "Публикует/читает события", "Kafka Protocol")
Rel(scheduler_service, kafka, "Публикует триггеры", "Kafka Protocol")
Rel(events_service, kafka, "Публикует события", "Kafka Protocol")
Rel(notification_service, kafka, "Читает события", "Kafka Protocol")
Rel(audit_service, kafka, "Читает все события", "Kafka Protocol")
Rel(tasks_service, permissions_service, "Проверяет права", "gRPC")
Rel(users_service, permissions_service, "Проверяет права", "gRPC")
Rel(pms_adapter, kafka, "Публикует сообщения", "Kafka Protocol")
Rel(erp_adapter, kafka, "Публикует сообщения", "Kafka Protocol")
Rel(housekeeping_adapter, kafka, "Публикует сообщения", "Kafka Protocol")
Rel(telegram_adapter, kafka, "Публикует сообщения", "Kafka Protocol")
Rel(pms_adapter, pms, "Получает/отправляет данные", "REST API/Webhook")
Rel(erp_adapter, erp, "Получает/отправляет данные", "REST API")
Rel(housekeeping_adapter, housekeeping_ext, "Отправляет задачи", "REST API/Push")
Rel(telegram_adapter, telegram_ext, "Взаимодействует с ботом", "Webhook/Bot API")
Rel(notification_service, email_ext, "Отправляет email", "SMTP")
Rel(notification_service, sms_ext, "Отправляет SMS", "REST API")
Rel(notification_service, telegram_ext, "Отправляет сообщения", "Bot API")
Rel(file_storage_service, s3_ext, "Хранит файлы", "S3 API")
Rel(tasks_service, postgres, "Читает/пишет данные", "SQL")
Rel(users_service, postgres, "Читает/пишет данные", "SQL")
Rel(connections_service, postgres, "Читает/пишет данные", "SQL")
Rel(permissions_service, postgres, "Читает/пишет данные", "SQL")
Rel(scheduler_service, postgres, "Читает/пишет данные", "SQL")
Rel(events_service, postgres, "Читает/пишет данные", "SQL")
Rel(audit_service, postgres, "Пишет логи", "SQL")
Rel(file_storage_service, postgres, "Пишет метаданные", "SQL")
Rel(tasks_service, redis, "Кэширует данные", "Redis Protocol")
Rel(users_service, redis, "Кэширует данные", "Redis Protocol")
Rel(permissions_service, redis, "Кэширует права", "Redis Protocol")
UpdateLayoutConfig($c4ShapeInRow="4", $c4BoundaryInRow="2")
```
---
## Level 3: Component Diagram - Tasks Service
Показывает внутреннюю структуру Tasks Service.
```mermaid
C4Component
title Component diagram for Tasks Service
Container_Ext(api_gateway, "API Gateway", "Kong/Envoy", "Точка входа")
Container_Ext(kafka, "Kafka", "Apache Kafka", "Message Broker")
ContainerDb_Ext(postgres, "PostgreSQL", "Database", "Основная БД")
ContainerDb_Ext(redis, "Redis", "Cache", "Кэш")
Container_Ext(permissions_service, "Permissions Service", "Python, gRPC", "Проверка прав")
Container_Ext(file_storage_service, "File Storage Service", "Python", "Управление файлами")
Container_Boundary(tasks_service, "Tasks Service") {
Component(grpc_api, "gRPC API", "Python, gRPC", "Обработка gRPC запросов")
Component(rest_api, "REST API", "FastAPI", "Обработка REST запросов (fallback)")
Component(task_controller, "Task Controller", "Python", "Обработка бизнес-логики задач")
Component(status_controller, "Status Controller", "Python", "Управление статусами задач")
Component(dependency_controller, "Dependency Controller", "Python", "Управление зависимостями")
Component(history_controller, "History Controller", "Python", "Управление историей изменений")
Component(task_repository, "Task Repository", "SQLAlchemy", "Работа с БД задач")
Component(status_repository, "Status Repository", "SQLAlchemy", "Работа с БД статусов")
Component(dependency_repository, "Dependency Repository", "SQLAlchemy", "Работа с БД зависимостей")
Component(history_repository, "History Repository", "SQLAlchemy", "Работа с БД истории")
Component(kafka_producer, "Kafka Producer", "aiokafka", "Публикация событий в Kafka")
Component(kafka_consumer, "Kafka Consumer", "aiokafka", "Чтение событий из Kafka")
Component(cache_manager, "Cache Manager", "Redis Client", "Управление кэшем")
Component(permission_client, "Permission Client", "gRPC Client", "Проверка прав доступа")
Component(task_validator, "Task Validator", "Pydantic", "Валидация данных задач")
Component(event_mapper, "Event Mapper", "Python", "Маппинг событий")
}
Rel(api_gateway, grpc_api, "Отправляет gRPC запросы", "gRPC")
Rel(api_gateway, rest_api, "Отправляет REST запросы", "HTTP/JSON")
Rel(grpc_api, task_controller, "Вызывает методы")
Rel(rest_api, task_controller, "Вызывает методы")
Rel(task_controller, task_validator, "Валидирует данные")
Rel(task_controller, permission_client, "Проверяет права")
Rel(task_controller, task_repository, "Работает с задачами")
Rel(task_controller, status_controller, "Изменяет статусы")
Rel(task_controller, dependency_controller, "Управляет зависимостями")
Rel(task_controller, history_controller, "Записывает историю")
Rel(task_controller, cache_manager, "Кэширует данные")
Rel(task_controller, kafka_producer, "Публикует события")
Rel(status_controller, status_repository, "Работает со статусами")
Rel(dependency_controller, dependency_repository, "Работает с зависимостями")
Rel(history_controller, history_repository, "Работает с историей")
Rel(kafka_consumer, event_mapper, "Маппит события")
Rel(event_mapper, task_controller, "Обрабатывает события")
Rel(task_repository, postgres, "Выполняет SQL запросы", "SQL")
Rel(status_repository, postgres, "Выполняет SQL запросы", "SQL")
Rel(dependency_repository, postgres, "Выполняет SQL запросы", "SQL")
Rel(history_repository, postgres, "Выполняет SQL запросы", "SQL")
Rel(cache_manager, redis, "Кэширует/читает данные", "Redis Protocol")
Rel(permission_client, permissions_service, "Проверяет права", "gRPC")
Rel(kafka_producer, kafka, "Публикует события", "Kafka Protocol")
Rel(kafka_consumer, kafka, "Читает события", "Kafka Protocol")
UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")
```
---
## Level 3: Component Diagram - Adapter Layer
Показывает внутреннюю структуру адаптера (на примере PMS Adapter).
```mermaid
C4Component
title Component diagram for PMS Adapter (Example)
System_Ext(pms_system, "PMS System", "Opera/Fidelio", "Внешняя PMS система")
Container_Ext(kafka, "Kafka", "Apache Kafka", "Message Broker")
Container_Ext(postgres, "PostgreSQL", "Database", "Хранение состояния адаптера")
Container_Boundary(pms_adapter, "PMS Adapter") {
Component(webhook_handler, "Webhook Handler", "FastAPI", "Принимает webhook от PMS")
Component(api_poller, "API Poller", "Python, APScheduler", "Опрашивает PMS API по расписанию")
Component(rest_client, "REST Client", "httpx", "HTTP клиент для PMS API")
Component(inbound_transformer, "Inbound Transformer", "Python", "PMS формат → Стандартный формат")
Component(outbound_transformer, "Outbound Transformer", "Python", "Стандартный формат → PMS формат")
Component(message_validator, "Message Validator", "Pydantic", "Валидация сообщений")
Component(event_publisher, "Event Publisher", "aiokafka", "Публикация событий в Kafka")
Component(event_consumer, "Event Consumer", "aiokafka", "Чтение событий из Kafka")
Component(state_manager, "State Manager", "SQLAlchemy", "Управление состоянием синхронизации")
Component(error_handler, "Error Handler", "Python", "Обработка ошибок и retry")
Component(config_manager, "Config Manager", "Python", "Управление конфигурацией")
}
Rel(pms_system, webhook_handler, "Отправляет webhook", "HTTP/JSON")
Rel(api_poller, rest_client, "Запрашивает данные")
Rel(rest_client, pms_system, "Делает API запросы", "REST/SOAP")
Rel(webhook_handler, inbound_transformer, "Передает данные")
Rel(api_poller, inbound_transformer, "Передает данные")
Rel(inbound_transformer, message_validator, "Валидирует сообщение")
Rel(message_validator, event_publisher, "Публикует валидное событие")
Rel(event_consumer, kafka, "Читает исходящие события", "Kafka Protocol")
Rel(event_consumer, outbound_transformer, "Передает событие")
Rel(outbound_transformer, rest_client, "Отправляет в PMS")
Rel(event_publisher, kafka, "Публикует входящие события", "Kafka Protocol")
Rel(state_manager, postgres, "Сохраняет состояние", "SQL")
Rel(error_handler, state_manager, "Логирует ошибки")
Rel(webhook_handler, error_handler, "Обрабатывает ошибки")
Rel(api_poller, error_handler, "Обрабатывает ошибки")
Rel(rest_client, error_handler, "Обрабатывает ошибки")
Rel(config_manager, api_poller, "Предоставляет конфигурацию")
Rel(config_manager, rest_client, "Предоставляет конфигурацию")
UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")
```
---
## Deployment Diagram (Kubernetes)
Показывает развертывание в Kubernetes кластере.
```mermaid
C4Deployment
title Deployment Diagram for TaskManager (Kubernetes)
Deployment_Node(k8s_cluster, "Kubernetes Cluster", "GKE/EKS/AKS") {
Deployment_Node(ingress_ns, "Namespace: ingress") {
Container(ingress, "Ingress Controller", "NGINX/Traefik", "Входная точка для внешнего трафика")
}
Deployment_Node(gateway_ns, "Namespace: gateway") {
Container(api_gateway, "API Gateway", "Kong/Envoy", "3 replicas", "Маршрутизация и аутентификация")
}
Deployment_Node(services_ns, "Namespace: services") {
Container(tasks_svc, "Tasks Service", "Python, FastAPI", "5 replicas", "Управление задачами")
Container(users_svc, "Users Service", "Python, FastAPI", "3 replicas", "Управление пользователями")
Container(connections_svc, "Connections Service", "Python, FastAPI", "2 replicas", "Управление связями")
Container(permissions_svc, "Permissions Service", "Python, FastAPI", "3 replicas", "RBAC")
Container(notification_svc, "Notification Service", "Python, FastAPI", "3 replicas", "Уведомления")
Container(file_storage_svc, "File Storage Service", "Python, FastAPI", "2 replicas", "Файлы")
Container(audit_svc, "Audit Service", "Python, FastAPI", "2 replicas", "Аудит")
Container(scheduler_svc, "Scheduler Service", "Python, FastAPI", "1 replica", "Планировщик")
Container(events_svc, "Events Service", "Python, FastAPI", "2 replicas", "Мероприятия")
}
Deployment_Node(adapters_ns, "Namespace: adapters") {
Container(pms_adapter, "PMS Adapter", "Python", "2 replicas", "PMS интеграция")
Container(erp_adapter, "ERP Adapter", "Python", "1 replica", "ERP интеграция")
Container(housekeeping_adapter, "Housekeeping Adapter", "Python", "2 replicas", "Уборка")
Container(telegram_adapter, "Telegram Adapter", "Python", "2 replicas", "Telegram бот")
}
Deployment_Node(data_ns, "Namespace: data") {
ContainerDb(postgres_primary, "PostgreSQL Primary", "PostgreSQL 15", "1 pod", "Основная БД (master)")
ContainerDb(postgres_replica, "PostgreSQL Replica", "PostgreSQL 15", "2 pods", "Реплики для чтения")
ContainerDb(redis_cluster, "Redis Cluster", "Redis 7", "3 pods", "Кэш и сессии")
ContainerQueue(kafka_cluster, "Kafka Cluster", "Apache Kafka", "3 brokers", "Message broker")
}
Deployment_Node(monitoring_ns, "Namespace: monitoring") {
Container(prometheus, "Prometheus", "Prometheus", "Сбор метрик")
Container(grafana, "Grafana", "Grafana", "Визуализация метрик")
Container(jaeger, "Jaeger", "Jaeger", "Distributed tracing")
}
}
Deployment_Node(external_services, "External Services") {
Container(s3, "AWS S3", "Object Storage", "Хранилище файлов")
Container(smtp, "SMTP Server", "Email", "Отправка email")
Container(sms_gateway, "SMS Gateway", "Twilio", "Отправка SMS")
}
Rel(ingress, api_gateway, "Routes traffic", "HTTPS")
Rel(api_gateway, tasks_svc, "Calls", "gRPC")
Rel(api_gateway, users_svc, "Calls", "gRPC")
Rel(api_gateway, connections_svc, "Calls", "gRPC")
Rel(api_gateway, events_svc, "Calls", "gRPC")
Rel(api_gateway, file_storage_svc, "Calls", "REST")
Rel(tasks_svc, kafka_cluster, "Publishes/Consumes", "Kafka Protocol")
Rel(connections_svc, kafka_cluster, "Publishes/Consumes", "Kafka Protocol")
Rel(scheduler_svc, kafka_cluster, "Publishes", "Kafka Protocol")
Rel(notification_svc, kafka_cluster, "Consumes", "Kafka Protocol")
Rel(audit_svc, kafka_cluster, "Consumes", "Kafka Protocol")
Rel(pms_adapter, kafka_cluster, "Publishes/Consumes", "Kafka Protocol")
Rel(erp_adapter, kafka_cluster, "Publishes/Consumes", "Kafka Protocol")
Rel(housekeeping_adapter, kafka_cluster, "Publishes/Consumes", "Kafka Protocol")
Rel(telegram_adapter, kafka_cluster, "Publishes/Consumes", "Kafka Protocol")
Rel(tasks_svc, postgres_primary, "Writes", "SQL")
Rel(tasks_svc, postgres_replica, "Reads", "SQL")
Rel(users_svc, postgres_primary, "Writes", "SQL")
Rel(users_svc, postgres_replica, "Reads", "SQL")
Rel(audit_svc, postgres_primary, "Writes logs", "SQL")
Rel(tasks_svc, redis_cluster, "Cache", "Redis Protocol")
Rel(users_svc, redis_cluster, "Cache", "Redis Protocol")
Rel(permissions_svc, redis_cluster, "Cache permissions", "Redis Protocol")
Rel(file_storage_svc, s3, "Stores files", "S3 API")
Rel(notification_svc, smtp, "Sends emails", "SMTP")
Rel(notification_svc, sms_gateway, "Sends SMS", "REST API")
Rel(prometheus, tasks_svc, "Scrapes metrics", "HTTP")
Rel(prometheus, users_svc, "Scrapes metrics", "HTTP")
Rel(grafana, prometheus, "Queries metrics", "HTTP")
UpdateLayoutConfig($c4ShapeInRow="3", $c4BoundaryInRow="1")
```
---
## Sequence Diagram: Creating Task from External System
Показывает последовательность действий при создании задачи из внешней системы.
```mermaid
sequenceDiagram
participant PMS as PMS System (Opera)
participant Adapter as PMS Adapter
participant Kafka as Apache Kafka
participant Connections as Connections Service
participant Tasks as Tasks Service
participant Permissions as Permissions Service
participant Audit as Audit Service
participant Notification as Notification Service
participant DB as PostgreSQL
participant Housekeeping as Housekeeping Adapter
participant HK_App as Housekeeping App
Note over PMS,HK_App: Сценарий: Гость выехал из номера, нужна уборка
PMS->>Adapter: Webhook: Guest Checkout (Room 305)
Adapter->>Adapter: Validate webhook signature
Adapter->>Adapter: Transform to standard format
Adapter->>Kafka: Publish: adapters.pms.checkout
Note over Kafka: Topic: adapters.pms.checkout
Kafka->>Connections: Consume: adapters.pms.checkout
Connections->>DB: Get routing rules for PMS → TaskManager
DB-->>Connections: Routing rules
Connections->>Connections: Apply rules: checkout → create cleaning task
Connections->>Kafka: Publish: connections.route_task
Note over Kafka: Topic: connections.route_task
Kafka->>Tasks: Consume: connections.route_task
Tasks->>Permissions: CheckPermission(source_adapter, create_task)
Permissions->>DB: Query permissions
DB-->>Permissions: Permission granted
Permissions-->>Tasks: Allowed
Tasks->>Tasks: Create task object
Tasks->>DB: INSERT INTO tasks (...)
DB-->>Tasks: Task created (id: uuid)
Tasks->>Kafka: Publish: tasks.created
Note over Kafka: Topic: tasks.created
par Parallel Processing
Kafka->>Audit: Consume: tasks.created
Audit->>DB: INSERT INTO audit_log
Kafka->>Notification: Consume: tasks.created
Notification->>DB: Get user notification preferences
DB-->>Notification: User prefers Telegram
Notification->>Notification: Send Telegram notification
Kafka->>Connections: Consume: tasks.created
Connections->>DB: Get routing rules for TaskManager → Housekeeping
DB-->>Connections: Route to Housekeeping Adapter
Connections->>Kafka: Publish: connections.route_task
end
Note over Kafka: Topic: connections.route_task
Kafka->>Housekeeping: Consume: connections.route_task
Housekeeping->>Housekeeping: Transform to Housekeeping App format
Housekeeping->>HK_App: POST /api/tasks (Room 305 cleaning)
HK_App-->>Housekeeping: Task assigned (assignee: Maria)
Housekeeping->>Kafka: Publish: adapters.housekeeping.task_assigned
Kafka->>Tasks: Consume: adapters.housekeeping.task_assigned
Tasks->>DB: UPDATE tasks SET assignee_id = ...
Tasks->>Kafka: Publish: tasks.assigned
Note over PMS,HK_App: Task created and assigned to housekeeping staff
```
---
## Sequence Diagram: Creating Event with Auto-Generated Tasks
Показывает создание мероприятия и автоматическую генерацию задач.
```mermaid
sequenceDiagram
participant User as Sales Manager
participant Web as Web Admin
participant Gateway as API Gateway
participant Events as Events Service
participant Tasks as Tasks Service
participant Kafka as Apache Kafka
participant DB as PostgreSQL
participant Notification as Notification Service
Note over User,Notification: Сценарий: Создание конференции на 50 человек
User->>Web: Create Event: "Marketing Conference"
Web->>Gateway: POST /api/v1/events (event details)
Gateway->>Gateway: Authenticate & Authorize
Gateway->>Events: CreateEvent(gRPC)
Events->>DB: INSERT INTO events
DB-->>Events: Event created (id: uuid)
Events->>Events: Generate tasks from event template
Note over Events: Tasks: Setup chairs, Prepare projector,<br/>Organize coffee break, etc.
loop For each generated task
Events->>Tasks: CreateTask(gRPC)
Tasks->>DB: INSERT INTO tasks
DB-->>Tasks: Task created
Tasks->>Kafka: Publish: tasks.created
Tasks-->>Events: Task ID
end
Events->>DB: INSERT INTO event_tasks (event_id, task_id)
Events->>Kafka: Publish: events.created
Events->>Kafka: Publish: events.tasks_generated
Events-->>Gateway: Event + generated tasks
Gateway-->>Web: 201 Created (event + tasks)
Web-->>User: Show created event with tasks
par Notify departments
Kafka->>Notification: Consume: tasks.created
loop For each task
Notification->>Notification: Get assignee notification prefs
Notification->>Notification: Send notification (Telegram/Email)
end
end
Note over User,Notification: All tasks created and departments notified
```
---
## Data Flow Diagram
Показывает потоки данных в системе.
```mermaid
flowchart TB
subgraph External["External Systems"]
PMS["PMS System"]
ERP["ERP System"]
Guest["Guest (Telegram)"]
end
subgraph Adapters["Adapter Layer"]
PMS_A["PMS Adapter"]
ERP_A["ERP Adapter"]
TG_A["Telegram Adapter"]
end
subgraph Kafka["Apache Kafka"]
T1["adapters.*"]
T2["tasks.*"]
T3["connections.*"]
T4["notifications.*"]
T5["audit.*"]
end
subgraph Core["Core Services"]
Connections["Connections Service<br/>(Routing Rules)"]
Tasks["Tasks Service<br/>(Task Management)"]
Users["Users Service"]
Permissions["Permissions Service"]
end
subgraph Support["Support Services"]
Notification["Notification Service"]
Audit["Audit Service"]
Scheduler["Scheduler Service"]
end
subgraph Data["Data Layer"]
DB["PostgreSQL"]
Cache["Redis"]
end
%% External to Adapters
PMS -->|"Webhook/API"| PMS_A
ERP -->|"API"| ERP_A
Guest -->|"Telegram Bot"| TG_A
%% Adapters to Kafka
PMS_A -->|"Publish events"| T1
ERP_A -->|"Publish events"| T1
TG_A -->|"Publish events"| T1
%% Kafka to Connections
T1 -->|"Consume"| Connections
%% Connections routing
Connections -->|"Route messages"| T3
T3 -->|"Consume"| Tasks
%% Tasks operations
Tasks -->|"Publish events"| T2
Tasks -->|"Query permissions"| Permissions
Tasks -->|"Write/Read"| DB
Tasks -->|"Cache"| Cache
%% Support services
T2 -->|"Consume"| Notification
T2 -->|"Consume"| Audit
Scheduler -->|"Trigger tasks"| T2
Notification -->|"Send notifications"| External
Audit -->|"Write logs"| DB
%% Users and Permissions
Users -->|"Write/Read"| DB
Permissions -->|"Write/Read"| DB
Permissions -->|"Cache permissions"| Cache
style Kafka fill:#ff9900
style Core fill:#00cc66
style Support fill:#3399ff
style Data fill:#cc66ff
```
---
## Notes
### Как использовать эти диаграммы:
1. **System Context (Level 1)**: Показывает TaskManager как черный ящик в контексте пользователей и внешних систем. Используйте для презентации бизнес-заказчикам.
2. **Container Diagram (Level 2)**: Показывает основные приложения и хранилища данных. Используйте для обсуждения с архитекторами и DevOps командой.
3. **Component Diagrams (Level 3)**: Показывают внутреннюю структуру отдельных сервисов. Используйте для разработчиков при проектировании конкретного сервиса.
4. **Deployment Diagram**: Показывает как система развернута в Kubernetes. Используйте для DevOps и планирования инфраструктуры.
5. **Sequence Diagrams**: Показывают взаимодействие компонентов во времени для конкретных сценариев. Используйте для понимания бизнес-процессов.