TF-4268 Initialize Sentry from Linagora Ecosystem configuration

This commit is contained in:
dab246
2026-04-07 16:10:57 +07:00
committed by Dat H. Pham
parent c9ec1c2820
commit d2566dd9aa
14 changed files with 263 additions and 23 deletions
@@ -0,0 +1,53 @@
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource/linagora_ecosystem_datasource.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/datasource_impl/linagora_ecosystem_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/network/linagora_ecosystem_api.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/linagora_ecosystem_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/linagora_ecosystem_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_linagora_system_interactor.dart';
import 'package:tmail_ui_user/main/exceptions/thrower/remote_exception_thrower.dart';
class LinagoraEcosystemInteractorBindings extends InteractorsBindings {
@override
void bindingsDataSource() {
Get.lazyPut<LinagoraEcosystemDatasource>(
() => Get.find<LinagoraEcosystemDatasourceImpl>(),
);
}
@override
void bindingsDataSourceImpl() {
Get.lazyPut(
() => LinagoraEcosystemDatasourceImpl(
Get.find<LinagoraEcosystemApi>(),
Get.find<RemoteExceptionThrower>(),
),
);
}
@override
void bindingsInteractor() {
Get.lazyPut(
() => GetLinagoraEcosystemInteractor(
Get.find<LinagoraEcosystemRepository>(),
),
);
}
@override
void bindingsRepository() {
Get.lazyPut<LinagoraEcosystemRepository>(
() => Get.find<LinagoraEcosystemRepositoryImpl>(),
);
}
@override
void bindingsRepositoryImpl() {
Get.lazyPut(
() => LinagoraEcosystemRepositoryImpl(
Get.find<LinagoraEcosystemDatasource>(),
),
);
}
}
@@ -86,19 +86,16 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/data/local/local_sort_o
import 'package:tmail_ui_user/features/mailbox_dashboard/data/network/linagora_ecosystem_api.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/app_grid_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/composer_cache_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/linagora_ecosystem_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/search_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/data/repository/spam_report_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/app_grid_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/composer_cache_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/linagora_ecosystem_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/spam_report_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_all_recent_search_latest_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app_dashboard_configuration_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_app_grid_linagra_ecosystem_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_composer_cache_on_web_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_linagora_system_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_mailbox_cached_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_spam_report_state_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/get_stored_email_sort_order_interactor.dart';
@@ -113,6 +110,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_e
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_last_time_dismissed_spam_reported_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/usecases/store_spam_report_state_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/email_action_interactor_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/linagora_ecosystem_interactor_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/advanced_filter_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/app_grid_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
@@ -385,7 +383,6 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut(() => EmptySpamFolderInteractor(Get.find<ThreadRepository>()));
Get.lazyPut(() => GetAppDashboardConfigurationInteractor(Get.find<AppGridRepository>()));
Get.lazyPut(() => GetAppGridLinagraEcosystemInteractor(Get.find<AppGridRepository>()));
Get.lazyPut(() => GetLinagoraEcosystemInteractor(Get.find<LinagoraEcosystemRepository>()));
Get.lazyPut(() => GetEmailByIdInteractor(
Get.find<ThreadRepository>(),
Get.find<EmailRepository>()));
@@ -435,6 +432,7 @@ class MailboxDashBoardBindings extends BaseBindings {
);
EmailActionInteractorBindings(Get.find<EmailRepository>()).dependencies();
LinagoraEcosystemInteractorBindings().dependencies();
}
@override
@@ -450,7 +448,6 @@ class MailboxDashBoardBindings extends BaseBindings {
Get.lazyPut<ServerSettingsRepository>(() => Get.find<ServerSettingsRepositoryImpl>());
Get.lazyPut<IdentityCreatorRepository>(() => Get.find<IdentityCreatorRepositoryImpl>());
Get.lazyPut<AppGridRepository>(() => Get.find<AppGridRepositoryImpl>());
Get.lazyPut<LinagoraEcosystemRepository>(() => Get.find<LinagoraEcosystemRepositoryImpl>());
}
@override
@@ -503,6 +500,5 @@ class MailboxDashBoardBindings extends BaseBindings {
DataSourceType.network: Get.find<AppGridDatasource>(),
DataSourceType.local: Get.find<LocalAppGridDatasourceImpl>()
},));
Get.lazyPut(() => LinagoraEcosystemRepositoryImpl(Get.find<LinagoraEcosystemApi>()));
}
}
@@ -109,6 +109,7 @@ import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_ac
import 'package:tmail_ui_user/features/mailbox/presentation/extensions/presentation_mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/exceptions/spam_report_exception.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/spam_report_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_composer_cache_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_linagora_ecosystem_state.dart';
@@ -153,6 +154,7 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_current_emails_flags_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/update_text_formatting_menu_state_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/extensions/web_auth_redirect_processor_extension.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mixin/sentry_ecosystem_mixin.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/dashboard_routes.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/draggable_app_state.dart';
@@ -162,7 +164,6 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/quick_search_filter.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/search_email_filter.dart';
import 'package:tmail_ui_user/features/mailto/presentation/model/mailto_arguments.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/linagora_ecosystem.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/preferences/ai_scribe_config.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_rule_filter_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_ai_scribe_config_state.dart';
@@ -241,7 +242,8 @@ class MailboxDashBoardController extends ReloadableController
AiScribeMixin,
SearchLabelFilterModalMixin,
AddLabelToEmailMixin,
HandleTeamMailboxMixin {
HandleTeamMailboxMixin,
SentryEcosystemMixin {
final RemoveEmailDraftsInteractor _removeEmailDraftsInteractor = Get.find<RemoveEmailDraftsInteractor>();
final EmailReceiveManager _emailReceiveManager = Get.find<EmailReceiveManager>();
@@ -873,8 +875,12 @@ class MailboxDashBoardController extends ReloadableController
await super.injectFCMBindings(session, accountId);
await LocalNotificationManager.instance.recreateStreamController();
_registerLocalNotificationStreamListener();
} catch (e) {
logWarning('MailboxDashBoardController::injectFCMBindings(): $e');
} catch (e, st) {
logError(
'MailboxDashBoardController::injectFCMBindings():',
exception: e,
stackTrace: st,
);
}
}
@@ -900,15 +906,19 @@ class MailboxDashBoardController extends ReloadableController
accountId.value = currentAccountId;
synchronizeOwnEmailAddress(session.getOwnEmailAddressOrEmpty());
SentryManager.instance.setUser(
SentryUser(
id: currentAccountId.asString,
name: session.getUserDisplayName(),
username: session.username.value,
email: session.getOwnEmailAddressOrEmpty(),
)
final sentryUser = SentryUser(
id: currentAccountId.asString,
name: session.getUserDisplayName(),
username: session.username.value,
email: session.getOwnEmailAddressOrEmpty(),
);
if (PlatformInfo.isWeb) {
SentryManager.instance.setUser(sentryUser);
} else {
initSentryUser(sentryUser);
}
_setUpMinInputLengthAutocomplete();
injectAutoCompleteBindings(session, currentAccountId);
injectRuleFilterBindings(session, currentAccountId);
@@ -3449,7 +3459,7 @@ class MailboxDashBoardController extends ReloadableController
progressStateController.close();
_refreshActionEventController.close();
_notificationManager.closeStream();
_fcmService.closeStream();
unawaited(_fcmService.closeStream());
ApplicationManager().releaseUserAgent();
BackButtonInterceptor.removeByName(AppRoutes.dashboard);
_identities = null;
@@ -10,6 +10,7 @@ extension SetupScribePromptUrlExtension on MailboxDashBoardController {
void loadLinagoraEcosystem() {
if (cachedLinagoraEcosystem != null) {
_applyScribePromptUrl(cachedLinagoraEcosystem!.scribePromptUrl);
_setUpSentry(cachedLinagoraEcosystem!);
return;
}
@@ -30,6 +31,7 @@ extension SetupScribePromptUrlExtension on MailboxDashBoardController {
void handleGetLinagoraEcosystemSuccess(GetLinagoraEcosystemSuccess success) {
cachedLinagoraEcosystem = success.linagoraEcosystem;
_applyScribePromptUrl(cachedLinagoraEcosystem!.scribePromptUrl);
_setUpSentry(cachedLinagoraEcosystem!);
}
void handleGetLinagoraEcosystemFailure(GetLinagoraEcosystemFailure failure) {
@@ -47,4 +49,15 @@ extension SetupScribePromptUrlExtension on MailboxDashBoardController {
logWarning('SetupScribePromptUrlExtension::_applyScribePromptUrl: PromptService not found');
}
}
void _setUpSentry(LinagoraEcosystem ecosystem) {
final sentryConfigEcosystem = ecosystem.sentryConfigEcosystem;
if (sentryConfigEcosystem != null) {
setUpSentry(sentryConfigEcosystem);
} else {
logWarning(
'LinagoraEcosystemController:_setUpSentry: Sentry config ecosystem is null',
);
}
}
}
@@ -0,0 +1,79 @@
import 'package:core/presentation/extensions/string_extension.dart';
import 'package:core/utils/app_logger.dart';
import 'package:core/utils/sentry/sentry_config.dart';
import 'package:core/utils/sentry/sentry_manager.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/linagora_ecosystem/sentry_config_linagora_ecosystem.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
mixin SentryEcosystemMixin {
SentryUser? _sentryUser;
void initSentryUser(SentryUser? newSentryUser) {
_sentryUser = newSentryUser;
}
Future<void> setUpSentry(
SentryConfigLinagoraEcosystem ecosystemConfig,
) async {
final dsn = ecosystemConfig.dsn?.trimmed;
final env = ecosystemConfig.environment?.trimmed;
final isValid = ecosystemConfig.enabled == true
&& (dsn?.isNotEmpty ?? false)
&& (env?.isNotEmpty ?? false);
if (!isValid) {
logWarning(
'SentryEcosystemMixin::setUpSentry: config invalid '
'(enabled=${ecosystemConfig.enabled}, dsn=${dsn?.isNotEmpty}, env=${env?.isNotEmpty})',
);
await clearSentryConfiguration();
return;
}
final sentryConfig = await ecosystemConfig.toSentryConfig();
await SentryManager.instance.initializeWithSentryConfig(sentryConfig);
_setupSentryUser();
await _saveSentryConfiguration(
sentryConfig: sentryConfig,
sentryUser: _sentryUser,
);
}
void _setupSentryUser() {
if (_sentryUser == null) return;
SentryManager.instance.setUser(_sentryUser!);
}
Future<void> _saveSentryConfiguration({
required SentryConfig sentryConfig,
SentryUser? sentryUser,
}) async {
final cachingManager = getBinding<CachingManager>();
if (cachingManager != null) {
await cachingManager.saveSentryConfiguration(sentryConfig);
if (sentryUser != null) {
await cachingManager.saveSentryUser(sentryUser);
}
} else {
logTrace(
'SentryEcosystemMixin::saveSentryConfiguration: CachingManager is null');
}
}
Future<void> clearSentryConfiguration() async {
final cachingManager = getBinding<CachingManager>();
if (cachingManager != null) {
await cachingManager.clearSentryConfiguration();
} else {
logTrace(
'SentryEcosystemMixin::clearSentryConfiguration: CachingManager is null');
}
}
}