bloc_concurrency
ember concurrency를 영감으로 삼은 사용자 정의 이벤트 변환기입니다. bloc 상태 관리 패키지와 함께 사용하도록 설계되었습니다.
미레아 - 러시아 기술 대학을 위한 모바일 애플리케이션으로 시간표, 뉴스 및 기타 다양한 기능을 포함
ember concurrency를 영감으로 삼은 사용자 정의 이벤트 변환기입니다. bloc 상태 관리 패키지와 함께 사용하도록 설계되었습니다.
bloc 상태 관리 라이브러리의 확장으로, 상태를 자동으로 저장하고 복원합니다.
GetX를 사용하면 컨텍스트 없이 화면, 스크린바, 대화상자를 열고 상태를 쉽게 관리하며 종속성을 주입할 수 있습니다.
Google Analytics for Firebase용 Flutter 플러그인. Android 및 iOS에서 앱 사용 및 사용자 참여에 대한 통찰력을 제공하는 앱 측정 솔루션입니다.
Firebase Cloud Messaging용 플러터 플러그인으로, Android 및 iOS에서 메시지를 신뢰할 수 있게 전달할 수 있는 크로스플랫폼 메시징 솔루션입니다.
package:go_router용 생성된 강력한 타입의 라우트 헬퍼를 지원하는 빌더
v5.9.3화면 및 글자 크기 조정을 위한 플러터 플러그인입니다. 다양한 모델에서 잘 보이도록 보장됩니다
v8.3.2Flutter의 1위 비상업적 목적의 지도 클라이언트: 사용이 간편하고 유연하며 공급업체에 의존하지 않으며, 완전히 크로스 플랫폼이며 100% 순수한 Flutter입니다
v10.1.0공식 확장 이미지, 플레이스홀더(로딩)/실패 상태 지원, 네트워크 캐시, 줌/팬, 사진 보기, 슬라이드 아웃 페이지, 편집기(자르기, 회전, 뒤집기), 그림 그리기 등
v3.2.1Flutter용으로 매우 사용자 정의가 가능하고 기능이 풍부한 캘린더 위젯입니다.
정적 HTML과 CSS를 Flutter 위젯으로 렌더링하기 위한 Flutter 위젯입니다.
v3.0.0이 확장 패키지는 허용합니다
{"path":"packages/academic_calendar"}^1.0.1^3.5.0{"path":"packages/ads_ui"}^1.1.0{"path":"packages/analytics_repository"}^7.0.0{"path":"packages/app_ui"}{"path":"packages/article_repository"}^9.2.0^0.3.0^4.1.3^5.1.1^3.2.0^3.0.0{"path":"packages/campus_repository"}^5.0.0^1.16.2^1.1.2^1.18.0{"path":"packages/community_catalog_repository"}{"path":"packages/community_repository"}{"path":"packages/connectivity_client"}^1.0.2{"path":"packages/deep_link_client"}{"git":{"url":"https://github.com/0niel/device_calendar.git","ref":"develop"}}^5.1.2^1.0.2{"git":{"url":"https://github.com/0niel/dot_navigation_bar.git","ref":"master"}}^0.6.0^1.1.1^2.0.5^10.0.1^12.0.0-beta.4^2.0.0^12.1.2^4.4.0^16.1.1^1.1.1{"sdk":"flutter"}^4.5.0^9.1.1^3.3.1^3.0.0-beta.2^3.0.0-beta.2^3.0.0-beta.2^3.0.0-beta.2^3.0.0-beta.2^2.0.8{"sdk":"flutter"}^8.2.2^3.1.0+7447^2.4.3^3.3.1^11.5.1^11.0.0^5.9.3^10.0.0^1.1.0^0.7.0^0.8.0^2.0.5^6.0.0{"sdk":"flutter"}^0.8.03.1.0{"path":"packages/friends_repository"}{"path":"packages/gamification_repository"}^14.0.2^17.1.00.9.1^1.2.2^1.1.5^11.0.0^1.1.2^0.20.24.12.0^0.9.1{"path":"packages/local_auth_client"}{"path":"packages/local_notifications_client"}{"path":"packages/local_notifications_repository"}^2.0.2+1^1.1.1{"path":"packages/lost_and_found_repository"}^0.5.0^1.15.0^2.0.0{"path":"packages/mini_apps_repository"}^7.2.0{"path":"packages/network_location_client"}{"path":"packages/news_blocks"}{"path":"packages/news_blocks_ui"}{"path":"packages/news_repository"}{"path":"packages/nfc_pass_client"}{"path":"packages/nfc_pass_repository"}^4.4.0{"path":"packages/package_info_client"}^10.1.0^1.0.0^1.0.1^2.1.13.12.0^2.11.0^2.5.2+1{"path":"packages/permission_client"}{"path":"packages/storage/persistent_storage"}^0.15.0^3.0.2{"path":"packages/preferences_repository"}{"path":"packages/promo_repository"}^4.1.0^3.0.0^1.5.1^0.28.0^3.3.2{"path":"packages/schedule"}{"path":"packages/schedule_exporter_repository"}{"path":"packages/schedule_repository"}{"path":"packages/storage/secure_storage"}9.20.09.20.09.20.0{"path":"packages/service_catalog_repository"}{"path":"packages/share_launcher"}^13.1.0^2.0.11^0.2.12^1.0.2^7.4.0{"path":"packages/stac_bridge"}{"path":"packages/storage/storage"}^1.1.0^2.1.1{"path":"packages/study_groups_repository"}{"path":"packages/auth_client/supabase_authentication_client"}^2.8.3^32.1.23^32.2.3^3.0.3^0.10.0{"path":"packages/auth_client/token_storage"}^1.3.3any^2.0.0^0.1.0{"path":"packages/university_provider"}^6.1.12{"path":"packages/user_repository"}^4.5.3^0.9.0^2.9.2^0.4.0+20.2.9^6.6.1^8.0.0^1.1.2^1.1.2^10.0.02.15.1any^5.3.2^0.14.1{"sdk":"flutter"}3.2.5^4.1.16.14.0^1.0.5^2.4.210.3.03.1.3아래는 영문 원문 스냅샷입니다. 최신 내용은 GitHub에서 확인하세요.
Открытая платформа студенческого приложения на Flutter. Репозиторий можно адаптировать под другой университет без форка бизнес-логики: tenant, публичный брендинг и deep links задаются конфигурацией, а университетские источники данных подключаются через нормализованный ingest-контракт Supabase.
Конфигурация по умолчанию сохраняет совместимость с РТУ МИРЭА. Встроенный MIREA-фетчер выключен по умолчанию и не должен использоваться для другого tenant.
lib/<feature>, а
переиспользуемые клиенты, модели и репозитории — в Dart workspace packages/.bloc/hydrated_bloc для состояния, yx_scope для dependency injection и
go_router для навигации.json_serializable для генерируемых immutable-моделей и JSON DTO.Основной поток данных:
внешний источник -> Python worker -> Edge Function /ingest
-> Supabase RPC/таблицы -> repository -> BLoC -> Flutter UI
Flutter не должен обращаться к внутренним таблицам или использовать
service_role. Привилегированная запись контента проходит через защищённую
функцию supabase/functions/ingest, а схема БД
изменяется только миграциями из
supabase/migrations.
Нужны Flutter, FVM и Java 17 для
Android. Версия Flutter закреплена в .fvmrc.
dart pub global activate fvm
fvm install
fvm flutter pub get
Создайте две локальные compile-time конфигурации:
cp .env.example .env
cp config/university.example.json config/university.local.json
В PowerShell используйте Copy-Item вместо cp. В .env укажите публичные
SUPABASE_URL и SUPABASE_PUBLISHABLE_KEY. В
config/university.local.json задайте tenant и брендинг. Затем проверьте
конфигурацию и сгенерируйте код:
fvm dart run tool/configure_university.dart
fvm dart run build_runner build
Запуск development flavor на Android/iOS/macOS:
fvm flutter run \
--flavor development \
--target lib/main/main_development.dart \
--dart-define-from-file=.env \
--dart-define-from-file=config/university.local.json \
--dart-define-from-file=config/firebase.local.json
Firebase-файл опционален: без него Analytics и FCM корректно отключаются.
Нативные google-services.json, GoogleService-Info.plist и сгенерированный
firebase_options.dart не являются частью открытого исходного кода.
Для Windows уберите --flavor development. Подробности о схеме конфигурации и
режиме --check описаны в
docs/university-configuration.md.
Локальные .env, tenant-файлы, Firebase-конфигурация, ключи подписи и Telegram
session-файлы нельзя коммитить. Пример university config содержит только
публичные значения и не заменяет настройку собственных Firebase/Supabase
проектов.
Локальная конфигурация находится в supabase/config.toml. Для работы с
миграциями нужен Supabase CLI и Docker:
supabase start
supabase db reset
Не изменяйте уже применённые миграции: создавайте новую через
supabase migration new <name>. Секрет ingest-функции хранится только на
сервере и в локальном окружении worker.
Для одного tenant задайте Edge secrets INGEST_API_KEY и
INGEST_ORGANIZATION_ID. Общий backend нескольких университетов должен
использовать INGEST_TENANT_KEYS — JSON-карту organization_id к отдельному
ключу каждого worker. Не используйте один неприкреплённый ключ для всех tenant.
Worker находится в tools/social_media_fetcher и использует
uv. Он нормализует контент и отправляет его в
Edge ingest; напрямую в БД не пишет.
Для RSS/Atom и официальных API предпочтителен no-code путь через self-hosted
n8n: импортируйте готовый
rss-to-ingest.json и
используйте HTTP Request node для Facebook Graph API, YouTube, Mastodon или
иного документированного API. Python-коннектор оставлен для источников, которым
нужна пользовательская сессия или особая обработка, например Telegram Stories.
Полный контракт и правила расширения — в
tools/social_media_fetcher/docs/architecture.md.
cd tools/social_media_fetcher
cp .env.example .env
uv sync --locked
uv run python worker.py
MIREA_ENABLED=true допустим только при APP_ORGANIZATION_ID=mirea. Telegram
подключается явно через TELEGRAM_CHANNELS и TELEGRAM_STORY_CHANNELS. Для
пользовательской Telegram-сессии используйте отдельный согласованный аккаунт и
setup_telegram_session.py; полученный session string считается секретом и не
должен попадать в логи, issues или Git.
Stories-медиа загружается только через подписанные Storage URL. Workflow
cleanup-story-media.yml независимо от Telegram-сессии удаляет истёкшие и
осиротевшие объекты; для него задаются SUPABASE_URL,
INGEST_ORGANIZATION_ID и tenant-bound INGEST_API_KEY.
fvm dart analyze --fatal-warnings
fvm flutter test
cd tools/social_media_fetcher
uv run ruff format --check .
uv run ruff check .
uv run pytest
CI повторяет анализ и тесты Flutter и ключевых workspace-пакетов, проверки Python worker, format/lint/type-check Edge ingest и fresh replay Supabase миграций. CI имеет только read-доступ к репозиторию. Релиз Shorebird запускается только вручную отдельным workflow.
Перед pull request прочитайте CONTRIBUTING.md и CODE_OF_CONDUCT.md. Уязвимости нельзя публиковать в обычных issues — используйте SECURITY.md.
Проект распространяется по лицензии MIT.