C4 Architecture Micro-Learning White-Label App Factory (Flutter + Django) Сгенерировано на основе: PRD, OpenAPI Data Contract, Factory Idea, Implementation Plan, DoD
Формат: C4 Model — Level 1 (Context), Level 2 (Containers), Level 3 (Components), Level 4 (Code/Modules). Цель: максимально детально описать, как устроена архитектура фабрики приложений, зачем каждый компонент, из чего состоит и как взаимодействует с другими.
1. Свод требований и ограничений (из документов)¶
Ключевая бизнес-цель: выпускать множество тематических приложений («Пушкин», «Шагал», «Понимать кино») из одной кодовой базы, с минимальной ручной работой. Контент и поведение должны управляться из админки. Сборка и публикация — полностью автоматические.
1.1 Нефункциональные цели (KPI)¶
- Retention: D1/D7/D30 (из PRD).
- Quiz engagement + accuracy (из PRD).
- Стабильность: crash-free sessions, API error rate, build failure rate (из PRD).
- Cost: стоимость поддержки N приложений (build time / release time) (из PRD).
1.2 Обязательные функции платформы¶
- White-label: один Flutter core → много приложений с разными bundle ID / applicationId, иконками и темами.
- Offline-first: предзагрузка контента, кеш медиа, устойчивость в airplane mode.
- Мультимедиа: текст/изображение/аудио/видео (по PRD).
- Подписки/IAP: монетизация + server-side валидация.
- Квиз-повторение (swipe): вопросы по пройденному после нескольких дней, с игровой механикой.
- Автосборка из админки: build одного бренда и rebuild всех брендов.
- Автопубликация: загрузка билдов в App Store / Google Play без ручной операции.
- Аналитика и A/B: события, когорты, remote config/feature flags.
1.3 Definition of Done (контроль качества)¶
DoD из файла фиксирует обязательность: тестов (unit/widget/integration), статических проверок, логирования, crash reporting, предпросмотров BrandConfig/Content, безопасных процедур publish/bulk ops, документации API и пайплайнов.
2. C4 Level 1 — System Context¶
Система: Micro-Learning App Factory — платформа, которая производит и обслуживает множество образовательных приложений.
2.1 Акторы (люди)¶
| Актор | Что делает | Почему важно |
|---|---|---|
| Learner (пользователь) | Проходит уроки 60 секунд/день, получает уведомления, проходит swipe-квизы, покупает подписку. | Основной источник DAU/retention/дохода. |
| Editor/Methodist | Создаёт уроки, переводы, вопросы для повторения, публикует версии контента. | Контент — главный moat и рычаг роста. |
| Release/DevOps | Управляет ключами, публикациями в сторах, откатами, стабильностью CI. | Без автоматизации и релиз-надёжности фабрика не масштабируется. |
| Marketer/Growth | Меняет paywall/офферы/эксперименты, следит за конверсией и когорточками. | Монетизация и рост. |
| Support | Разбирает проблемы подписок, доступов, refunds, GDPR-экспорт/удаление. | Снижение churn и рисков. |
2.2 Внешние системы¶
| Система | Роль |
|---|---|
| Apple App Store Connect | Приём и публикация iOS билдов (TestFlight/Production). |
| Google Play Console | Приём и публикация Android билдов (Internal/Alpha/Production). |
| APNs/FCM | Пуш-уведомления (желательно FCM унифицировано). |
| Analytics Provider (Firebase/Amplitude/Mixpanel) | Сбор событий, retention, воронки. |
| Crash reporting (Crashlytics/Sentry) | Краши/ошибки для стабильности KPI. |
| Object Storage (S3/GCS) | Хранение медиа и артефактов билдов/логов. |
| CDN (CloudFront/Cloudflare) | Доставка медиа и ускорение. |
| Payment validation endpoints (Apple/Google/RevenueCat) | Проверка подписок/квитанций. |
2.3 Context диаграмма¶
graph TB
subgraph Actors
learner["👤 Learner<br/>Daily micro-lessons, quizzes, subscription"]
editor["👤 Editor/Methodist<br/>Lessons, translations, quiz questions"]
release["👤 Release/DevOps<br/>Keys, CI/CD, store releases"]
marketer["👤 Marketer/Growth<br/>Paywall, experiments, conversion"]
support["👤 Support<br/>Entitlements, refunds, GDPR"]
end
factory["🏭 Micro-Learning App Factory<br/>White-label: content, build, deploy, analytics"]
subgraph External["External Systems"]
appstore["Apple App Store Connect"]
play["Google Play Console"]
fcm["FCM / APNs"]
analytics["Analytics Provider"]
crash["Crash Reporting"]
storage["Object Storage S3/GCS"]
cdn["CDN"]
receipts["Receipt Validation"]
end
learner -->|"Mobile app"| factory
editor -->|"Admin UI"| factory
release -->|"Build center"| factory
marketer -->|"Paywall config"| factory
support -->|"Admin UI"| factory
factory -->|"Fastlane"| appstore
factory -->|"Fastlane"| play
factory -->|"HTTP API"| fcm
factory -->|"SDK/HTTP"| analytics
factory -->|"SDK"| crash
factory -->|"S3/GCS"| storage
factory -->|"HTTPS"| cdn
factory -->|"HTTPS"| receipts
3. C4 Level 2 — Container Diagram¶
Контейнеры — крупные исполняемые части системы (приложения/сервисы/хранилища).
3.1 Контейнеры и их назначение¶
| Container | Технологии | Зачем существует | Главные интерфейсы |
|---|---|---|---|
| Flutter Mobile Apps (N брендов) | Flutter; flavors; offline DB; media cache | Runtime для пользователя: уроки, офлайн, квизы, paywall, события | HTTPS API + FCM + Store IAP |
| Django Control Plane (Web) | Django + custom admin UI | Управление брендами, контентом, квизами, билдами, релизами | Admin Web + Admin API |
| Public API (DRF) | Django REST Framework | Версионированное API для клиентов | /api/v1/* |
| Build Orchestrator | Celery + Redis | Создаёт/ведёт BuildJobs, триггерит CI, принимает callbacks | workflow triggers + callbacks |
| CI/CD System | GitHub Actions/GitLab CI + Fastlane | Сборка матрицей (brand x platform), подпись, публикация в сторах | Fastlane supply/pilot/deliver |
| PostgreSQL | PostgreSQL | Источник правды: бренды, контент, прогресс, квизы, билды | SQL |
| Redis | Redis | Брокер/кеш для Celery, rate limits, locks | Redis |
| Object Storage | S3/GCS | Медиа, артефакты билдов, логи CI | HTTPS |
| CDN | CloudFront/Cloudflare | Доставка медиа пользователям быстро | HTTPS |
| Analytics Stack | Firebase/Amplitude + (опц.) BigQuery | События, retention, воронки, эксперименты | SDK/Exports |
3.2 Container диаграмма¶
graph TB
subgraph Factory["Micro-Learning App Factory"]
mobile["📱 Flutter Mobile Apps<br/>N brands, offline, quizzes"]
web["🖥️ Control Plane<br/>Django Admin UI"]
api["🔌 Public API<br/>Django REST Framework"]
orchestrator["⚙️ Build Orchestrator<br/>Celery + Redis"]
db[("🗄️ PostgreSQL<br/>Content, progress, quizzes")]
cache[("Redis<br/>Broker, cache, locks")]
storage["📦 Object Storage<br/>S3/GCS"]
cdn["🌐 CDN<br/>Media delivery"]
analytics["📊 Analytics<br/>Firebase/Amplitude"]
end
subgraph Ext["External"]
ci["CI/CD<br/>GitHub Actions + Fastlane"]
appstore["App Store Connect"]
play["Google Play Console"]
fcm["FCM / APNs"]
receipts["Receipt Validation"]
end
mobile -->|"HTTPS/JSON"| api
web -->|"SQL"| db
api -->|"SQL"| db
orchestrator -->|"Redis"| cache
orchestrator -->|"SQL"| db
orchestrator -->|"workflow dispatch"| ci
ci -->|"HTTPS"| storage
ci -->|"Fastlane"| appstore
ci -->|"Fastlane"| play
api -->|"HTTPS"| storage
storage -->|"Origin"| cdn
mobile -->|"HTTPS"| cdn
mobile -->|"SDK"| analytics
api -->|"HTTP"| fcm
api -->|"HTTPS"| receipts
4. C4 Level 3 — Components¶
Уровень компонентов показывает внутреннюю структуру ключевых контейнеров. Ниже — самое детальное описание: зачем каждый компонент, данные, интерфейсы, и точки расширения.
4.1 Components: Django Control Plane + Public API¶
4.1.1 Brands & Configuration¶
- Brand Registry: сущность Brand (bundle ids, app ids, статус, владельцы).
- BrandConfig Snapshots: неизменяемые снимки конфигурации для воспроизводимых билдов.
- Theme/Assets Manager: загрузка и валидация иконок, splash, шрифтов; генерация наборов.
- Feature Flags Manager: флаги и параметры (включая paywall placements, quiz rules).
- Preview/Simulator: предпросмотр BrandConfig и контентного флоу (из DoD).
4.1.2 Content Studio¶
- Track Editor: правила day unlock (rollover time, catch-up, archive rules).
- Lesson Editor (block-based): Hook/Insight/Expansion/Reflection как блоки; длительность; теги.
- Asset Pipeline: привязка медиа, проверки размеров/кодеков, генерация adaptive streams (опц.).
- Localization Manager: переводы уроков/вопросов; проверка completeness по языкам.
- Content Versioning: публикация версий контента (draft -> published) и выдача дельта-обновлений клиентам.
4.1.3 Quiz Studio¶
- Question Bank: хранение утверждений True/False + explanation + ссылки на уроки/теги.
- Schedule Rules: после N дней / по spaced repetition; frequency caps (max 1 quiz/day из PRD).
- Selection Engine: выбирает вопросы по темам со слабой точностью и давностью; исключает недавние.
- Scoring Rules: баллы/комбо/награды; premium расширения (например, «архив ошибок»).
4.1.4 Entitlements & Receipts¶
- Product Catalog: продукты подписок/IAP по бренду и региону.
- Receipt Verification: server-side проверка Apple/Google (не доверять клиенту).
- Entitlement Engine: расчёт прав доступа (premium, архив, офлайн-пакеты) + кеширование.
- Refund/Support Tools: ручное изменение entitlements, обработка обращений.
4.1.5 Build Center & Orchestrator¶
- BuildJob Service: single build / batch build / rebuild all; статусы и SLA.
- CI Trigger Adapter: workflow_dispatch/trigger, параметры матрицы (brand x platform).
- Callback Receiver: прием статусов из CI (build started/succeeded/failed, store upload).
- Artifact Registry: ссылки на AAB/IPA, логи, changelog snapshot.
- Safety Gates: подтверждение “опасных” операций (bulk publish) из DoD.
4.1.6 Observability & Audit¶
- Audit Log: кто и что поменял (BrandConfig, контент, цены, публикации).
- Rate limiting / Abuse protection: ограничение login/sync.
- Health endpoints + Sentry integration: алерты по 5xx и Celery backlog.
4.2 Components: Flutter Mobile Runtime¶
4.2.1 Bootstrap & Configuration¶
- BrandConfig Bootstrapper: загрузка /brand/config, локальный кеш, fallback.
- Remote Config Adapter: получение параметров и A/B вариаций.
- Feature Flag Resolver: единая точка, откуда UI/логика читают флаги.
4.2.2 Offline-first Data Layer¶
- Local DB (Drift): lessons, blocks, assets index, progress, quiz history, pending events.
- KV Store (SharedPreferences): настройки, токены, onboarding flag, последний config hash.
- Media Cache Manager: загрузка ассетов в файл-систему, контроль checksum/ttl.
- Prefetch Scheduler: prefetch N дней, правила wifi-only для видео.
4.2.3 Daily Flow Engine¶
- Day Unlock Calculator: вычисляет “какой день” (timezone aware) и какой урок доступен.
- Today Screen State Machine: состояния (loading, offline, no-content, ready, error).
- Completion Handler: отмечает завершение, обновляет streak, ставит sync task.
4.2.4 Swipe Quiz Engine¶
- Quiz Trigger: запуск по правилам (после N дней / scheduled).
- Question Selection (client-side fallback): если офлайн — выбрать из локального question bank по правилам.
- Swipe UI: жесты вправо/влево; анимации; accessibility.
- Instant Feedback: показываем correct/incorrect + explanation + CTA “повторить урок”.
- Scoring & Rewards: очки, комбо, бейджи; запись в историю.
4.2.5 Payments & Entitlements¶
- Paywall Renderer: layout driven by config (не хардкодить тексты/цены).
- IAP Client: in_app_purchase / RevenueCat SDK.
- Receipt Uploader: отправка receipts на сервер для валидации.
- Entitlement Cache: локальный кеш прав доступа для оффлайна.
4.2.6 Sync & Analytics¶
- Sync Queue: пачки событий и прогресса; idempotency keys; ретраи.
- Delta Puller: /content/updates?since=...; применяет миграции локальных данных.
- Analytics Emitter: события из PRD (lesson_view/complete, quiz_started/completed, paywall_view, purchase_success).
- Crash Reporting: Crashlytics/Sentry; связь с brand/version.
4.2.7 Notifications¶
- FCM Receiver: push от сервера (например, контент обновился/важный анонс).
- Local Notification Scheduler: ежедневный пинг; frequency caps; quiet hours.
5. C4 Level 4 — Code (Modules/Packages)¶
Уровень кода — практическая структура репозиториев и модулей. Это нужно, чтобы команда могла параллельно работать и чтобы фабрика приложений не превратилась в монолит.
5.1 Репозитории¶
| Repo | Содержимое | Зачем |
|---|---|---|
| mobile/ | Flutter monorepo: app_core + feature packages + brand wrappers | Единый код для всех брендов. |
| backend/ | Django: control plane + APIs + celery workers | Единая точка управления. |
| infra/ | CI templates, Fastlane, scripts, IaC (Terraform) | Воспроизводимая инфраструктура и релизы. |
| content/ (optional) | Контент как код: источники, медиа манифесты, переводы | Версионирование и review контента. |
5.2 Flutter packages (целевая структура)¶
Примечание: Ниже — целевая архитектура для всех 9 эпиков. Реализованные модули — см. секцию 5.4.2.
| Package | Ответственность | Примечание |
|---|---|---|
| app_core | DI, routing, theming, error handling, base widgets | Не зависит от конкретного бренда. |
| feature_content | Lesson rendering, blocks, media player integration | Server-driven blocks. |
| feature_quiz | Swipe UI, selection, scoring, history | Изолировать от остального. |
| feature_payments | Paywall + IAP + entitlement cache | Сильная изоляция и тесты. |
| data_layer | Repositories, remote/local sources, sync queue | Общий слой данных. |
| analytics | Event schema + providers | Одинаково для всех брендов. |
brand_app_ |
Тонкий wrapper, main entry, assets hooks | Минимум кода. |
5.3 Django apps (целевая структура)¶
Примечание: Ниже — целевая архитектура для всех 9 эпиков. Реализованные apps — см. секцию 5.4.1.
| Django app | Ответственность |
|---|---|
| brands | Brand, BrandConfig snapshots, themes/assets, flags |
| content | Tracks, lessons, blocks, assets, localization |
| quizzes | Rules, question bank, selection, results |
| builds | BuildJobs, targets, callbacks, artifact registry |
| payments | Receipts, entitlements, products, support tools |
| analytics | Aggregates, exports, cohort endpoints (опц.) |
| audit | Audit log, permissions, RBAC |
5.4 Реализованные модули (текущее состояние)¶
5.4.1 Backend Django apps (реализовано)¶
| Django app | Статус | Что реализовано |
|---|---|---|
apps/auth |
Done | DeviceSession, anonymous JWT, refresh с ротацией |
apps/content |
Done | Course, AppVariant, ContentItem, MediaAsset, ContentTranslation, DeletedContentItem; сервисы: locale resolution, day access check, manifest (since_version + deleted_item_ids + content_item_id); auto content_hash (SHA-256 on publish), content_version bump (F+1 on publish); lifecycle state machine (draft→scheduled→published→archived), transition API, Celery scheduled publishing (beat: every 15min, autoretry 3x, backoff 60s) |
apps/progress |
Done | UserProgress, DayCompletion; timezone-aware streak (client_timezone via zoneinfo), idempotent complete_day |
apps/bootstrap |
Done | Aggregator: config + course + progress + today_item |
apps/quiz |
Done | QuizQuestion, QuizSession, QuizAnswer; selection with cooldown, scoring, idempotent answer/complete, review tags |
Middleware и core: - CorrelationIDMiddleware (X-Correlation-ID → structlog contextvars) - ErrorEnvelope ({error: {code, message, details, request_id}}) - drf-spectacular (OpenAPI auto-gen: Swagger UI, ReDoc)
Admin: - Django Unfold 0.78.1 — Material UI admin theme (sidebar navigation, Material icons) - Content Admin: CourseAdmin, AppVariantAdmin (fieldsets), ContentItemAdmin (inlines + lifecycle actions) - Quiz Admin: QuizQuestionAdmin, QuizSessionAdmin, QuizAnswerAdmin - Auth Admin: DeviceSessionAdmin
Тесты: 320 (pytest, SQLite in-memory), покрытие ~97%
5.4.2 Flutter packages (реализовано)¶
Структура frontend/lib/:
| Package | Статус | Что реализовано |
|---|---|---|
app/ |
Done | App root, GoRouter (splash→today→completion), Material 3 theme (light/dark) |
core/ |
Done | ApiConstants, AppException, NetworkException |
data/local/ |
Done | TokenStorage (SharedPreferences); Drift SQLite DB (ContentItems, ContentTranslations, MediaAssets, ProgressEntries, SyncMetadataEntries); 3 DAOs (ContentDao, ProgressDao, SyncMetadataDao); AppDatabase singleton via Riverpod |
data/remote/ |
Done | ApiClient (Dio + AuthInterceptor + ErrorInterceptor + LoggingInterceptor), AuthService, BootstrapService |
data/remote/models/ |
Done | 26 Freezed DTO: AuthResponse, BootstrapResponse, ContentItem, ProgressState, AppVariantConfig, ContentManifest, ManifestItem, ManifestAsset + 14 nested |
data/sync/ |
Done | SyncService (manifest pull, diff computation, apply), SyncResult, SyncDiff; uses SyncMetadata for content_version tracking |
data/repositories/ |
Done | AuthRepository, BootstrapRepository, ContentRepository (cache-first: DB→API→cache, cacheContentItem public for sync), ProgressRepository (local-first: write DB + API best-effort + dirty flag) |
features/bootstrap/ |
Done | SplashScreen (auth→bootstrap→navigate, onboarding redirect), bootstrapProvider |
features/daily/ |
Done | TodayScreen (settings icon), CompletionScreen, ContentBlockRenderer (body_rich JSON), StreakIndicator, TodayState notifier |
features/onboarding/ |
Done | OnboardingScreen (3-page PageView: Welcome→Language→Ready), OnboardingNotifier (SharedPreferences persistence), LanguageSelector (EN/RU with flags) |
features/settings/ |
Done | SettingsScreen (language, sync status, about), SettingsNotifier (SharedPreferences), reuses LanguageSelector |
features/sync/ |
Done | SyncNotifier (idle→syncing→success/error), debounces concurrent calls, exposes SyncState |
l10n/ |
Done | gen-l10n (en/ru), plural forms for streakDays, 10 onboarding + 9 settings keys |
State management: Riverpod 2.6 + riverpod_generator (@riverpod code-gen)
Тесты: 170 (flutter test), dart analyze 0 issues
6. API Contract (выжимка по OpenAPI Data Contract)¶
Ниже — как API группируется и зачем. Полная спецификация хранится в OpenApiDataContract.yaml.
6.1 Основные группы endpoint-ов¶
- Auth: login/refresh (JWT).
- Brand bootstrap: получение BrandConfig + flags.
- Content: список треков, урок дня, дельта обновлений.
- Progress: отметить завершение урока, обновить streak.
- Quiz: следующая викторина, ответы, результаты.
- Payments: verify receipts, entitlements.
- Events: batch events (если не только Firebase). Принцип: все write-операции (POST) должны быть идемпотентными (idempotency_key) — это критично для офлайна и ретраев.
7. Build/Deploy — детальный жизненный цикл (пошагово)¶
7.1 Сборка одного бренда из админки¶
- Editor/Release выбирает Brand и нажимает BUILD (platforms: iOS/Android; track: internal/beta/prod).
- Control Plane сохраняет BrandConfigSnapshot (immutable) и создаёт BuildJob + BuildTargets (brand x platform).
- Celery task отправляет trigger в CI (workflow_dispatch) с job_id и brand_code.
- CI забирает snapshot по admin API, генерирует assets/конфиги, применяет flavor/scheme.
- CI собирает артефакт (AAB/IPA), прогоняет smoke checks (например, анализатор/минимальные тесты).
- Fastlane подписывает и грузит: Play (supply) и App Store (pilot/deliver).
- CI пушит callback в Control Plane: build succeeded + store upload status + artifact/logs URLs.
- Control Plane обновляет BrandVersion (release record) и показывает статус в Build Center.
7.2 Массовая пересборка всех брендов (core change)¶
- Merge в main ветку mobile core (или ручная команда REBUILD ALL).
- Control Plane создаёт batch BuildJob со списком всех активных брендов.
- CI запускает matrix builds (brand x platform) с ограничением параллелизма (особенно iOS).
- При ошибках: retries по политике; критические фейлы — stop-the-line + алерт.
- После успешного прогона: автообновление в сторах по выбранному track или через staged rollout.
7.3 Rollback стратегия¶
- App binary rollback: выпуск новой версии с fix/rollback (обычно быстрее и безопаснее, чем «откаты» в сторах).
- Server-side rollback: фичефлаги/remote config выключают проблемную функцию без релиза.
- Content rollback: публикация предыдущей версии content pack (server-side).
8. Качество, тестирование и приемка (по DoD)¶
8.1 Backend (Django)¶
- Unit tests: правила day unlock, quiz selection, receipts verification, сериализаторы.
- API contract tests: OpenAPI schema проверяется в CI.
- Migration safety: миграции и обратная совместимость для клиентов.
- Security tests: RBAC, audit trail, rate limiting.
8.2 Mobile (Flutter)¶
- Widget tests: Today screen states, quiz swipe gestures, paywall states.
- Integration tests: offline -> online sync; receipt verify flow; prefetch.
- Static checks: dart format, analyzer, lints.
- Crash reporting: включено и проверено (brand/version).
8.3 CI/CD¶
- Pipeline reproducibility: build from snapshot, deterministic assets.
- Store upload verification: подтверждение артефакта и статуса в сторах.
- Safety: bulk publish требует подтверждения/ролей, логируется (DoD).
9. Почему так (Design Rationale)¶
- White-label через конфиги и flavor-идентичность: минимизирует стоимость запуска новых приложений.
- Control Plane как источник правды: обеспечивает операционную управляемость и воспроизводимость билдов.
- Immutable snapshots: гарантируют, что билд можно повторить и расследовать инциденты.
- Offline-first + idempotency: ключ к реальному мобильному опыту и отсутствию потерь прогресса.
- Swipe-quizzes: системная механика удержания, плюс данные для адаптации контента.
- Автодеплой: единственный способ обслуживать десятки/сотни приложений без «релиз-ада».
10. Приложение: чек-лист внедрения (коротко)¶
- Сначала — скелет: BrandConfig bootstrap, Today flow, локальная БД, sync queue.
- Затем — Content Studio + публикация версий контента + delta updates.
- Затем — Quiz Studio + swipe engine + расписание повторений.
- Затем — Build Center + CI triggers + Fastlane upload (internal testing).
- Затем — receipts/entitlements + paywall AB + observability.
- После — масштабирование числа брендов и оптимизация стоимости CI/видео.