--- domain: messaging-flutter last_rule_review_commit: 60eb73c2813f47e7157464bcd24b4db314c2ffce last_rule_updated_at: 2026-05-26 --- # messaging-flutter ## 목적 / 책임 Mattermost 호환 푸시 알림 Flutter 플러그인을 담당한다. FCM 수신, 알림 표시, tap/open 이벤트, inline reply, dismiss 처리, ACK 전달, token/key 저장을 앱별 구현으로 흩어지지 않게 모은다. ## 포함 경로 - `packages/messaging_flutter/lib/` — public Dart API와 Flutter-facing behavior - `packages/messaging_flutter/android/` — Android native plugin implementation - `packages/messaging_flutter/ios/`, `packages/messaging_flutter/macos/` — platform scaffold와 stub - `packages/messaging_flutter/test/` — Dart API contract tests - `packages/messaging_flutter/docs/` — plugin 개발 및 검증 문서 - `packages/messaging_flutter/pubspec.yaml` — plugin package metadata ## 제외 경로 - `apps/client/` — plugin을 소비하는 host app 책임 - `services/core/` — server, webapp, API, compose runtime 책임 - root `bin/` — workspace-level command entrypoint 책임 ## 주요 구성 요소 - `MattermostPushPlugin` — singleton public API, event stream, token/key action channel - `NotificationOpenedEvent` — notification open payload parsing - `MattermostFirebaseMessagingService` — Android FCM 수신 진입점 - `NotificationReplyBroadcastReceiver`, `NotificationDismissService` — Android action handling - `ReceiptDelivery` — ACK delivery 책임 ## 유지할 패턴 - public import는 `package:mattermost_push_plugin/mattermost_push_plugin.dart` 경로를 유지한다. - Android가 production target이며 iOS/macOS는 stub 상태임을 명확히 보고한다. - host app이 해야 할 Firebase 초기화, token 등록, navigation 연결은 README의 Host App Responsibilities와 맞춘다. - native event type은 Dart API의 `PushNotificationType`과 호환되게 유지한다. ## 다른 도메인과의 경계 - **client-app**: client app은 integration host이며 plugin 내부 push 처리 로직을 복제하지 않는다. - **core-service**: server와의 계약은 payload, signing key, auth token, ACK/reply endpoint 수준으로 다룬다. - **workspace-ops**: 공통 `bin/test`, `bin/lint`가 plugin 검증을 호출하지만 plugin 세부 검증 기준은 이 도메인이 소유한다. ## 금지 사항 - package rename이나 public API breaking change를 사용자 결정 없이 수행하지 않는다. - host app 전용 navigation, 화면 구성, 제품 UI 상태를 plugin 내부에 넣지 않는다. - iOS/macOS stub을 production-ready로 단정하지 않는다.