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

События

Правила

  • События не содержат полные ответы, сканы, PII, закрытые task-bank данные или raw LMS responses.
  • Results events публикуются только после calculation/finalization/publication соответствующего уровня.
  • Document events не содержат приватный файл, только id/url по правилам доступа.
  • Повторная доставка команд и events обрабатывается идемпотентно.

Общий envelope

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

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

EventКогда
competitions.season.publishedсезон стал публичным для storefront/read-models
competitions.season.registration_openedоткрыт сезон
competitions.registration.pre_submittedсоздана предварительная регистрация
competitions.registration.submittedподана заявка
competitions.registration.completion_requiredнужно дозаполнить регистрацию
competitions.registration.createdсоздана регистрация
competitions.registration.approvedзаявка одобрена
competitions.participant.createdсоздан участник
competitions.participant.joinedучастник присоединился к сезону или туру
competitions.access_claim.approvedclaim access одобрен
competitions.learning_group.snapshot_createdсоздан season snapshot Learning Group
competitions.group.helper_grantedпомощнику выданы ограниченные права
competitions.tour.openedтур открыт
competitions.activity_binding.lockedactivity binding и task structure заблокированы
competitions.activity_attempt.startedparticipant запустил LMS/adapter attempt через competitions
competitions.submission.submittedработа отправлена
competitions.group_submission.submittedпреподаватель отправил ответы по ученикам группы
competitions.submission.late_files_uploadedзагружены поздние файлы/zip/изображения
competitions.submission.receivedработа получена системой
competitions.submission.checkedработа проверена
competitions.score_snapshot.createdscore by item сохранён как immutable snapshot
competitions.photo_report.submittedфотоотчёт отправлен
competitions.photo_report.reviewedфотоотчёт подтверждён или не подтверждён
competitions.venue.application_submittedподана заявка площадки
competitions.venue.application_approvedзаявка площадки одобрена
competitions.venue.publishedплощадка опубликована списком/на карте
competitions.venue.assignment_changedучастник выбрал или сменил площадку
competitions.venue.capacity_change_blockedуменьшение вместимости требует admin process
competitions.result.finalizedрезультат финализирован
competitions.result.withheldрезультат удержан от публикации
competitions.result.publishedиндивидуальный результат опубликован
competitions.results.publishedрезультаты опубликованы
competitions.publication.revokedпубличная проекция сезона, результата, площадки или документа отозвана
competitions.appeal.submittedподана MVP-апелляция
competitions.appeal.decidedпринято решение по апелляции
competitions.arbitration.openedоткрыт арбитраж подозрительной работы
competitions.arbitration.decidedпринято решение арбитража
competitions.award.issuedнаграда выдана
competitions.award_document.generatedдокумент создан
competitions.gratitude_document.generatedблагодарственное письмо создано
competitions.season.closedсезон закрыт
competitions.training_publication.createdLMS activity/review mode опубликован как training
competitions.training_publication.revokedtraining-публикация отозвана для новых назначений
competitions.notification.triggeredсоздан минимальный trigger для registration/tour/result/document/venue уведомления

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

ИсточникСобытиеИспользование
identityidentity.organization_student.created/updated/archivedorganization participant context and snapshots
identityidentity.organization_membership.activated/suspendedorganization access cache
identityidentity.organization.mergedновые регистрации идут в primary organization, historical projections сохраняются
identityidentity.organization_permission_grant.created/revokedorganization-scoped permission cache
identityfamily/user updatesправа доступа и claim
learning workspacelearning.group.created/updated/archivedобновление доступных Learning Groups, без изменения historical snapshots
learning workspacelearning.group_member.added/removedобновление доступного выбора перед snapshot/registration
CRMpayment/entitlement eventspaid registrations
task-bankcontent/source eventssource refs before activity binding lock
storefrontcampaign/page eventspublic links and traffic
LMSactivity attempt/checking/score eventscompetition mode status and score by item; training attempt/result events не создают competition submission/result
managementoperational taskscoordination workflows

Payload examples

type SourceRef = {
domain: 'identity' | 'task-bank' | 'crm' | 'storefront' | 'lms' | 'learning-workspace' | 'management' | 'competitions';
type: string;
id: string;
version?: string;
};

type RegistrationApprovedPayload = {
registrationId: string;
seasonId: string;
participantId: string;
source: 'self' | 'parent' | 'teacher' | 'organization' | 'admin';
learningGroupId?: string;
childModeRequired?: boolean;
};

type SubmissionSubmittedPayload = {
submissionId: string;
lmsActivityAttemptRef?: SourceRef;
adapterAttemptRef?: SourceRef;
tourId: string;
participantId: string;
deliveryMode: 'online' | 'teacher_led' | 'venue' | 'imported';
submittedByActorType: 'student' | 'parent' | 'teacher' | 'helper' | 'venue' | 'admin' | 'system';
};

type ScoreSnapshotCreatedPayload = {
submissionId: string;
tourId: string;
participantId: string;
activityBindingId: string;
sourceRuntimeRef?: SourceRef;
itemScores: Array<{
taskNumber: number;
lmsActivityItemRef?: SourceRef;
score: number;
maxScore: number;
checkingStatus?: string;
}>;
};

type ResultFinalizedPayload = {
resultId: string;
seasonId: string;
tourId?: string;
participantId: string;
trackId?: string;
score: number;
awardStatus?: string;
isWithheld?: boolean;
};

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

СценарийКлюч
registrationseason:{seasonId}:participant:{participantId}:source:{source}
pre-registrationseason:{seasonId}:actor:{actorId}:pre:{clientKey}
group registrationseason:{seasonId}:learningGroup:{learningGroupId}:snapshot:{snapshotHash}
activity binding locktour:{tourId}:activityBinding:{activityBindingId}:lock:{version}
submission reftourParticipation:{id}:runtime:{runtimeAttemptRef}
group submissiontour:{tourId}:group:{groupId}:runtime:{batchRef}
score snapshotsubmission:{submissionId}:scoreSnapshot:{sourceVersion}
photo reporttour:{tourId}:venue:{venueId}:photoReport:{fileHash}
venue assignmenttour:{tourId}:participant:{participantId}:venue:{venueId}
result calculationseason:{seasonId}:track:{trackId}:calc:{version}
appeal decisionappeal:{appealId}:decision:{version}
arbitration decisionarbitration:{caseId}:decision:{version}
document generationresult:{resultId}:document:{type}

Retention

ДанныеСрок
registrations/participationsбессрочно или по legal policy
submissions/filesпо регламенту сезона
results/rankingsбессрочно
award documentsбессрочно или по document policy
audit logs5 лет