competitions → storefront
Зачем нужно
Competitions предоставляет storefront публичные проекции олимпиад: события, сезоны, туры, площадки, опубликованные результаты и наградные документы. Storefront отображает эти данные после publication и не становится владельцем олимпиадного lifecycle.
Стороны
- источник истины: competitions;
- потребитель: storefront;
- вид интеграции: event-driven read-model + online read fallback.
Сущности и события
| Сущность/Событие | Назначение | Кто владеет |
|---|---|---|
competition_event, competition_season, competition_tour | публичное описание олимпиады | competitions |
competition_venue | публичная площадка очного тура | competitions |
competition_publication | gate публичной видимости | competitions |
competition_training_publication | опубликованны й архив, разбор или тренажёр с public-safe ссылкой | competitions/LMS ref |
competition_result, competition_award_document | опубликованные результаты и документы | competitions |
storefront_page, storefront_catalog_item | витринные read-model projections с source ref на competitions | storefront |
События
| messageType | Когда |
|---|---|
competitions.season.published | сезон стал публичным |
competitions.venue.published | площадка разрешена к публичному показу |
competitions.training_publication.published | опубликован архивный тренажёр, разбор или подготовительный блок |
competitions.result.published | опубликован результат |
competitions.award.issued | выдан документ, доступный публично по правилам privacy |
competitions.publication.revoked | публичная проекция должна быть скрыта или инвалидирована |
Online read API
GET /api/v2/competitions/events
GET /api/v2/competitions/events/{slug}
GET /api/v2/competitions/seasons/{seasonId}/venues
GET /api/v2/competitions/seasons/{seasonId}/venues/map
GET /api/v2/competitions/seasons/{seasonId}/public-results
GET /api/v2/competitions/seasons/{seasonId}/training-links
GET /api/v2/competitions/documents/verify/{code}
Storefront использует API как fallback для SSR/cache rebuild. Admin actions остаются в competitions.
Правила publication
- storefront показывает только records со статусом
publishedилиpublic_visible = true; - draft/review/scheduled/hidden/private records не попадают в public read-model;
- результаты публикуются только после
competition_publication; - персональные данные несовершеннолетних скрываются или агрегируются по privacy policy;
- venue address/detail может быть публичным только после явного venue publication;
- storefront получает только public-safe поля площадки: адрес/координаты после публикации, public comment, правила входа, документы, сопровождающих, facility rules и availability;
- private contacts,
technical_capabilities, printing/scanning internals andadmin_internal_commentне попадают в storefront; - архив, тренажёры и разборы показываются только при published training/publication state; CTA тренажёра ведёт в LMS/training контур;
competition_group, Learning Workspace groups и списки «мои ученики» не передаются в storefront.
Поведение storefront
- По событиям обновляет
storefront_page/storefront_catalog_itemprojections. - SSR/cache инвалидируется по publication/revocation events.
- В карточках и лендингах хранится source ref:
domain=competitions,type,id,publicationVersion. - Storefront не принимает регистрации и не меняет результат; CTA ведёт в competitions или CRM flow.
Идемпотентность
- publication events идемпотентны по
competition_publication_id + version; - result projections — по
competition_result_id + publicationVersion; - venue projections — по
competition_venue_id + publicationVersion.
Ошибки
| Сценарий | Поведение |
|---|---|
| событие пришло до publication state | storefront игнорирует и ждёт published snapshot |
| result revoked | projection скрывается, cache инвалидируется |
| payload содержит raw answer/submission | событие отклоняется, DLQ + security alert |
| venue payload содержит private technical/admin fields | событие отклоняется, projection не обновляется |
| competitions API недоступен | storefront отдаёт последний published cache с source timestamp |
Scopes
| Scope | Для чего |
|---|---|
service:competitions.seasons.read | читать published season/tour projections |
service:competitions.results.read | читать published result snapshots |
Retention
- storefront projection хранится до revocation/archive source record;
- events — 90 дней;
- audit publication/revocation — по retention competitions.