Skip to content

Prod: quarantine next-gen API surface - #740

Merged
TThanos3000 merged 2 commits into
masterfrom
fix/prod-quarantine-nextgen-surface
Sep 11, 2026
Merged

TThanos3000 merged 2 commits into
masterfrom
fix/prod-quarantine-nextgen-surface

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Sep 10, 2026

Copy link
Copy Markdown
Collaborator

Что сделано

Добавлен явный runtime-флаг NEXTGEN_SURFACE_ENABLED с безопасным значением по умолчанию False.

При выключенном флаге будущий React/next-gen surface отсутствует из URLConf и отвечает 404, соответствующие модели не зарегистрированы в Django Admin, а next-gen notification emitters завершаются до чтения объектов и SQL. Общий модуль уведомлений, legacy Angular API, программные email-сценарии и last_activity остаются активными.

Это quarantine runtime surface, а не откат схемы или данных.

Revisions и аудит клиентов

  • Backend base: 907ced23273e298314e9d8604dbaabb25ded6869
  • Backend head: 55c2e93d96e45568dc50062d841521cc7ba75fbf
  • Angular PROD audit: 8abbff5f103225dcc293aa4d22be1959aca32cc9
  • React origin/main audit: 4b421707e1b873b35ec22b272de6fbb51169e7fa

Аудит выполнен по фактическим Angular HttpClient/repository/use-case URL, а не по совпадению названий frontend routes.

Endpoint audit

Endpoint group Angular PROD usage React-dev usage PROD Feature-gated
/applications/*, /submissions/*, /evaluations/*, /expert/*, /team-invites/*, /submission-assignments/* нет да 404 да
/programs/managed/, manager-overview, new applications/evaluations/submission-assignments нет да 404 да
React project catalog/my/subscribed/workspace/invitations/subscription/goals/achievements нет да 404 да
/feed/news/* React API нет да 404 да
/auth/profiles/* public profile API нет да 404 да
/notifications/* production foundation для Angular bell да доступен нет
Legacy /programs/*, project analytics, fields/submit, projects/apply/filter да частично доступен нет
Legacy /projects/*, /invites/*, /vacancies/*, /rate-project/* да частично доступен нет
Legacy /feed/, contextual program/project/user news да нет доступен нет
/auth/users/*, /auth/specialists/*, /courses/*, /chats/* да частично доступен нет

Сохранены в том числе контракты #732-#739: current_project_application, canonical programLinkId, case lifecycle, Project Analytics, rating, evaluation deadline, manager/expert access и production vacancy behavior.

Notification audit

Типы Emitter action_url Angular route PROD OFF
PROJECT_INVITE_CREATED, PROJECT_INVITE_REVOKED legacy /invites/ create/delete /office/projects/invites да создаются
PROJECT_INVITE_ACCEPTED/DECLINED legacy invite decision service /office/projects/<id>/edit?section=team да создаются
VACANCY_RESPONSE_CREATED vacancy response lifecycle /office/vacancies/<id> да создаётся
VACANCY_RESPONSE_ACCEPTED/DECLINED vacancy decision lifecycle /office/vacancies/my да создаются
TEAM_INVITE_* next-gen team services React team/application routes нет gated
APPLICATION_* next-gen application services React program routes не используется gated
SUBMISSION_* next-gen submission services React submission routes нет gated
EXPERT_ASSIGNMENT_* next-gen assignment services React expert routes нет gated
EVALUATION_* next-gen evaluation services React analytics route нет gated
NEWS_COMMENT_CREATED React news comment domain /office/news/<id> нет для этого domain gated

Для legacy invite create/revoke добавлены недостающие вызовы существующего event layer внутри транзакции. Для нового vacancy response исправлен несуществующий Angular URL /office/projects/.../responses на существующий /office/vacancies/<id>. Базовые create_notification() / create_notifications() не отключаются и сохраняют recipient isolation, auth, pagination, unread/read API и idempotency.

React-dev

React-dev получает NEXTGEN_SURFACE_ENABLED=True через атомарно создаваемый и ignored Compose override .react-dev-runtime/nextgen-surface.compose.yml для сервисов web и celerys.

Deploy script:

  1. подключает override ровно один раз к существующему Compose-набору;
  2. проверяет итоговое значение для обоих сервисов до смены git revision, миграций и restart;
  3. выводит подтверждённое значение в deployment summary.

Production deploy этот override не использует. Default setting остаётся False; release deploy job и Docker-конфигурация не изменены. В release-ci.yml изменено только тестовое окружение, чтобы существующий полный next-gen suite выполнялся в режиме ON.

Follow-up: общий PartnerProgram contract

На follow-up head 55c2e93d96e45568dc50062d841521cc7ba75fbf дочищен next-gen surface внутри legacy detail/admin программы:

  • при NEXTGEN_SURFACE_ENABLED=False поле application_policy полностью исключается через PartnerProgramBaseSerializerMixin.get_fields() из member и non-member detail responses;
  • current_project_application, courses, materials, welcome state и остальные legacy поля не меняются;
  • при OFF PartnerProgramAdmin скрывает participation_format из list display/links/filter и целиком убирает секцию «Участие и заявки» вместе с team sizes/application deadline;
  • при ON прежние detail и React-dev admin contracts сохраняются;
  • models, migrations, DB columns, routes, notifications, mailing и React-dev deploy не изменены.

Follow-up regression:

  • OFF detail/admin/current-project/courses/materials: 33/33 passed;
  • ON тот же contract: 33/33 passed;
  • OFF чистый legacy Project Analytics subset: 86/86 passed;
  • Black, Flake8, Django check и check --tag models в OFF/ON: passed;
  • makemigrations --check --dry-run: No changes detected;
  • git diff --check: passed.

Existing cross-domain tests, которые намеренно reverse-ят quarantined manager-overview/new evaluation routes, остаются ON-only и проверяются полным CI.

Admin, БД и производительность

При OFF условно не регистрируются:

Application, Team, TeamMember, TeamInvite, Submission, SubmissionExpertAssignment, Evaluation, EvaluationScore, EvaluationAmendment.

Это закрывает также прямые /admin/partner_programs/<model>/... URL. Legacy PartnerProgram-модели остаются зарегистрированы.

  • моделей и migration-файлов не изменено;
  • destructive DB operations отсутствуют;
  • dependencies и Docker-файлы не изменены;
  • route/admin gating выполняется при старте процесса и не добавляет SQL в запросы Angular;
  • OFF event guards срабатывают до обращений к next-gen relations/QuerySet;
  • mailing scenarios, Celery schedule, Anymail/Unisender и ActivityTrackingJWTAuthentication не затронуты.

Проверки

Локально, Python 3.11 из существующего Poetry environment:

  • OFF route/admin/notification contract: 68/68 passed;
  • ON next-gen targeted regression: 375 tests OK, 4 expected mode skips;
  • OFF legacy invites/vacancies/auth activity/mailing/notifications: 159/159 passed;
  • OFF legacy Project Analytics subset: 67/67 passed;
  • Django check: OFF и ON passed;
  • Django check --tag models: OFF и ON passed;
  • makemigrations --check --dry-run: No changes detected;
  • Black check changed Python files: passed;
  • Flake8 changed files и весь tracked Python tree: passed;
  • workflow YAML parse: passed;
  • bash -n scripts/deploy_react_dev.sh: passed;
  • git diff --check: passed;
  • hashes pyproject.toml / poetry.lock не изменились.

Полный локальный suite запускался один раз в ON-режиме: 1501 tests, 1 failure, 8 skipped. Единственный failure — FeedAPITests.test_feed_returns_project_news_as_news_content после многократного reuse локальной SQLite БД через --keepdb. Этот же тест проходит:

  • на feature head с чистой SQLite test DB;
  • на exact base с чистой SQLite test DB;
  • в OFF-режиме с чистой DB.

Failure классифицирован как локальное stale/reused-test-DB состояние, а не изменение quarantine logic. GitHub Linux CI с чистой БД является обязательным gate.

PostgreSQL suite локально не запускался: доступного Docker daemon/PostgreSQL окружения нет; dependency/Docker-конфигурация не менялась. PostgreSQL job запускает полный suite в ON и отдельный quarantine contract в OFF.

CI

  • standard CI: quarantine targeted в OFF, затем existing full suite в ON;
  • PostgreSQL CI: quarantine targeted в OFF, остальной suite в ON;
  • Release CI test job: full suite в ON; build/deploy logic не изменён.

GitHub CI исходного head 4543ab24cead452ecb9f9f334ec09b806bf3c425: 5/5 checks passed.

Повторный CI для follow-up head 55c2e93d96e45568dc50062d841521cc7ba75fbf: выполняется.

  • CI/Tests: passed, 28m29s;
  • Backend PostgreSQL CI: passed, 11m59s;
  • CI/Lint: passed, 12s;
  • Sync roadmap push и pull_request: passed.

Чистые SQLite и PostgreSQL CI подтверждают, что локальный failure на многократно reused --keepdb SQLite DB не является regression/blocker этого PR.

Ограничения

PR не добавляет Angular bell UI и новые события program_news_published, program_material_published, course_access_opened; текущая общая Notification foundation остаётся пригодной для отдельного Angular PR.

Миграций, удаления endpoint-кода, удаления таблиц/данных, merge и deploy в рамках этой работы нет.

@TThanos3000
TThanos3000 marked this pull request as ready for review September 11, 2026 09:47
@TThanos3000
TThanos3000 merged commit b47be5b into master Sep 11, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants