Перейти к основному содержимому

События

Правила

  • Management читает события соседних доменов как input для метрик, но не становится владельцем этих фактов.
  • Все исходящие события имеют messageId, occurredAt, producer, producerInstance, messageVersion.
  • Payload не должен содержать PII, если достаточно ссылки на entity id или агрегата.
  • Для событий, создающих задачи, используется deduplicationKey.
  • Повторная доставка события должна быть идемпотентной.

Общий envelope

type DomainEvent<TPayload> = {
messageId: string;
messageKind: 'event';
messageType: string;
messageVersion: number;
producer: 'management';
producerInstance: string;
traceId: string;
occurredAt: string;
correlationId?: string;
actor?: {
type: 'user' | 'service' | 'system';
id?: string;
};
data: TPayload;
metadata?: Record<string, unknown>;
};

Исходящие события

EventКогдаPayload
management.metric.createdсоздана метрикаmetricId, key, owner, sourceDomain
management.metric_version.createdсоздана версия формулыmetricId, version
management.metric_recalculation.requestedзапрошен пересчётmetricId, periodStart, periodEnd
management.metric.recalculatedпересчёт завершёнmetricId, periodStart, periodEnd, qualityStatus
management.dashboard.publishedопубликован dashboarddashboardId, slug, audience
management.plan.createdсоздан планplanId, type, ownerUserId
management.plan.publishedопубликован планplanId, publishedByUserId
management.plan.approvedплан утверждёнplanId, approvedByUserId
management.plan.closedплан закрытplanId, statusSummary
management.task.createdсоздана задачаtaskId, assigneeUserId, sourceRef
management.task_status.changedизменён статус задачиtaskId, from, to
management.task.completedзадача завершенаtaskId, completedAt
management.team_task.createdсоздана командная задачаtaskId, teamRef, sourceRef
management.team_task.assignedкомандная задача назначена исполнителюtaskId, assigneeUserId, teamRef
management.team_task.remindedсрок командной задачи близкоtaskId, assigneeUserId, dueAt
management.team_task.updatedкомандная задача измененаtaskId, changedFields
management.team_task_comment.createdдобавлен комментарийcommentId, taskId
management.alert.openedсработал alertalertId, ruleKey, severity
management.alert.resolvedalert закрытalertId, resolvedAt
management.recommendation.createdсоздана рекомендацияrecommendationId, goalProfileId, type
management.recommendation.dismissedрекомендация отклоненаrecommendationId, reason
management.diagnostic.scheduledназначена диагностикаdiagnosticSessionId, studentProfileId, scheduledAt
management.goal.activatedцель активированаgoalId, goalProfileId, activatedAt
management.data_quality_issue.createdнайдена проблема данныхissueId, severity, dataSourceKey
management.action.executedвыполнено действиеactionId, actionType, status

Входящие события

ИсточникСобытияИспользование
storefrontlead/form/campaign/page eventsтрафик, конверсия, заявки
CRMlead, deal, invoice, payment, entitlement, ticket eventsпродажи, выручка, долги, support
LMSenrollment, lesson, submission, progress eventsактивность, completion, прогресс
task-bankattempt, checked, evidence eventsучебные signals, сложность, темы
competitionsregistration, submission, result, document eventsучастие и результаты
identityuser, organization, role assignment eventsсотрудники, организации, access context

Payload examples

management.task.created

type ManagementTaskCreatedPayload = {
taskId: string;
title: string;
assigneeUserId?: string;
priority: 'low' | 'normal' | 'high' | 'urgent';
sourceRef?: {
domain: string;
type: string;
id: string;
};
deduplicationKey?: string;
};

management.metric.recalculated

type ManagementMetricRecalculatedPayload = {
metricId: string;
metricKey: string;
periodStart: string;
periodEnd: string;
segment?: Record<string, unknown>;
qualityStatus: 'complete' | 'partial' | 'stale' | 'failed' | 'unknown';
calculatedAt: string;
};

management.data_quality_issue.created

type ManagementDataQualityIssueCreatedPayload = {
issueId: string;
dataSourceKey?: string;
severity: 'info' | 'warning' | 'critical';
title: string;
openedAt: string;
};

Идемпотентность

СценарийКлюч
загрузка input eventproducer:messageId
создание task из alertalert:{alertId}:task
создание recurring tasktemplate:{templateId}:period:{period}
пересчёт метрикиmetric:{metricId}:version:{version}:period:{period}:segment:{hash}

Retention

ДанныеСрок
сырые входящие event references180 дней
metric valuesбессрочно или до архивирования метрики
task history5 лет
audit logs5 лет
data quality issues3 года
exports metadata1 год