diff --git a/lib/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart b/lib/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart index f18193371..47bb73900 100644 --- a/lib/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart +++ b/lib/features/manage_account/domain/usecases/save_language_to_server_settings_interactor.dart @@ -4,6 +4,7 @@ import 'package:core/utils/app_logger.dart'; import 'package:dartz/dartz.dart'; import 'package:flutter/widgets.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:server_settings/server_settings/tmail_server_settings.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/save_language_to_server_settings_state.dart'; import 'package:tmail_ui_user/features/server_settings/domain/repository/server_settings_repository.dart'; @@ -14,6 +15,7 @@ class SaveLanguageToServerSettingsInteractor { final ServerSettingsRepository _serverSettingsRepository; Stream> execute( + Session session, AccountId accountId, Locale locale, ) async* { @@ -27,6 +29,7 @@ class SaveLanguageToServerSettingsInteractor { ) ?? TMailServerSettingOptions(language: locale.languageCode), ); await _serverSettingsRepository.updateServerSettings( + session, accountId, TMailServerSettings(settings: newSettings.settings), ); diff --git a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart index 79739e8ff..c22525cd8 100644 --- a/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart +++ b/lib/features/manage_account/presentation/language_and_region/language_and_region_controller.dart @@ -75,6 +75,7 @@ class LanguageAndRegionController extends BaseController { } consumeState(saveLanguageToServerSettingsInteractor.execute( + session, accountId, localeCurrent, )); diff --git a/lib/features/manage_account/presentation/preferences/preferences_controller.dart b/lib/features/manage_account/presentation/preferences/preferences_controller.dart index 6376c467d..1be4acd08 100644 --- a/lib/features/manage_account/presentation/preferences/preferences_controller.dart +++ b/lib/features/manage_account/presentation/preferences/preferences_controller.dart @@ -179,10 +179,12 @@ class PreferencesController extends BaseController { break; } + final session = _manageAccountDashBoardController.sessionCurrent; final accountId = _manageAccountDashBoardController.accountId.value; - if (accountId != null && newSettingOption != null) { + if (session != null && accountId != null && newSettingOption != null) { consumeState( _updateServerSettingInteractor.execute( + session, accountId, newSettingOption, ), diff --git a/lib/features/server_settings/data/datasource/server_settings_data_source.dart b/lib/features/server_settings/data/datasource/server_settings_data_source.dart index 91d79dbfb..9926a7722 100644 --- a/lib/features/server_settings/data/datasource/server_settings_data_source.dart +++ b/lib/features/server_settings/data/datasource/server_settings_data_source.dart @@ -1,9 +1,11 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:server_settings/server_settings/tmail_server_settings.dart'; abstract class ServerSettingsDataSource { Future getServerSettings(AccountId accountId); Future updateServerSettings( + Session session, AccountId accountId, TMailServerSettings serverSettings); } \ No newline at end of file diff --git a/lib/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart b/lib/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart index 66010effa..5044690f6 100644 --- a/lib/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart +++ b/lib/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl.dart @@ -1,4 +1,5 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:server_settings/server_settings/tmail_server_settings.dart'; import 'package:tmail_ui_user/features/server_settings/data/datasource/server_settings_data_source.dart'; import 'package:tmail_ui_user/features/server_settings/data/network/server_settings_api.dart'; @@ -20,9 +21,9 @@ class RemoteServerSettingsDataSourceImpl implements ServerSettingsDataSource { } @override - Future updateServerSettings(AccountId accountId, TMailServerSettings serverSettings) { + Future updateServerSettings(Session session, AccountId accountId, TMailServerSettings serverSettings) { return Future.sync(() async { - return await _serverSettingsAPI.updateServerSettings(accountId, serverSettings); + return await _serverSettingsAPI.updateServerSettings(session, accountId, serverSettings); }).catchError(_exceptionThrower.throwException); } } \ No newline at end of file diff --git a/lib/features/server_settings/data/network/server_settings_api.dart b/lib/features/server_settings/data/network/server_settings_api.dart index dbc8ec7f4..726868edf 100644 --- a/lib/features/server_settings/data/network/server_settings_api.dart +++ b/lib/features/server_settings/data/network/server_settings_api.dart @@ -1,6 +1,7 @@ import 'package:jmap_dart_client/http/http_client.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/error/method/exception/error_method_response_exception.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; import 'package:server_settings/server_settings/get/get_server_settings_method.dart'; import 'package:server_settings/server_settings/get/get_server_settings_response.dart'; @@ -10,6 +11,7 @@ import 'package:server_settings/server_settings/set/set_server_settings_response import 'package:server_settings/server_settings/tmail_server_settings.dart'; import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart'; import 'package:tmail_ui_user/features/server_settings/domain/exceptions/server_settings_exception.dart'; +import 'package:tmail_ui_user/features/server_settings/domain/extensions/tmail_server_settings_extension.dart'; class ServerSettingsAPI with HandleSetErrorMixin { final HttpClient httpClient; @@ -44,10 +46,12 @@ class ServerSettingsAPI with HandleSetErrorMixin { } Future updateServerSettings( + Session session, AccountId accountId, TMailServerSettings serverSettings ) async { final processingInvocation = ProcessingInvocation(); + serverSettings = serverSettings.normalized(session, accountId); final setServerSettingsMethod = SetServerSettingsMethod(accountId) ..addUpdatesSingleton({ diff --git a/lib/features/server_settings/data/repository/server_settings_repository_impl.dart b/lib/features/server_settings/data/repository/server_settings_repository_impl.dart index ca2bd203d..e266c9cf6 100644 --- a/lib/features/server_settings/data/repository/server_settings_repository_impl.dart +++ b/lib/features/server_settings/data/repository/server_settings_repository_impl.dart @@ -1,4 +1,5 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:server_settings/server_settings/tmail_server_settings.dart'; import 'package:tmail_ui_user/features/server_settings/data/datasource/server_settings_data_source.dart'; import 'package:tmail_ui_user/features/server_settings/domain/repository/server_settings_repository.dart'; @@ -14,7 +15,8 @@ class ServerSettingsRepositoryImpl implements ServerSettingsRepository { @override Future updateServerSettings( + Session session, AccountId accountId, TMailServerSettings serverSettings) - => _serverSettingsDataSource.updateServerSettings(accountId, serverSettings); + => _serverSettingsDataSource.updateServerSettings(session, accountId, serverSettings); } \ No newline at end of file diff --git a/lib/features/server_settings/domain/extensions/tmail_server_settings_extension.dart b/lib/features/server_settings/domain/extensions/tmail_server_settings_extension.dart new file mode 100644 index 000000000..8e99b2836 --- /dev/null +++ b/lib/features/server_settings/domain/extensions/tmail_server_settings_extension.dart @@ -0,0 +1,19 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:server_settings/server_settings/tmail_server_settings.dart'; +import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; + +extension TmailServerSettingsExtension on TMailServerSettings { + TMailServerSettings normalized(Session session, AccountId accountId) { + if (session.isLanguageReadOnly(accountId)) { + return TMailServerSettings( + id: id, + settings: TMailServerSettingOptions( + alwaysReadReceipts: settings?.alwaysReadReceipts, + displaySenderPriority: settings?.displaySenderPriority, + ), + ); + } + return this; + } +} \ No newline at end of file diff --git a/lib/features/server_settings/domain/repository/server_settings_repository.dart b/lib/features/server_settings/domain/repository/server_settings_repository.dart index 8e0d833e5..194340dcd 100644 --- a/lib/features/server_settings/domain/repository/server_settings_repository.dart +++ b/lib/features/server_settings/domain/repository/server_settings_repository.dart @@ -1,9 +1,11 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:server_settings/server_settings/tmail_server_settings.dart'; abstract class ServerSettingsRepository { Future getServerSettings(AccountId accountId); Future updateServerSettings( + Session session, AccountId accountId, TMailServerSettings serverSettings); } \ No newline at end of file diff --git a/lib/features/server_settings/domain/usecases/update_server_setting_interactor.dart b/lib/features/server_settings/domain/usecases/update_server_setting_interactor.dart index b134625e4..0e230d30d 100644 --- a/lib/features/server_settings/domain/usecases/update_server_setting_interactor.dart +++ b/lib/features/server_settings/domain/usecases/update_server_setting_interactor.dart @@ -2,6 +2,7 @@ import 'package:core/presentation/state/failure.dart'; import 'package:core/presentation/state/success.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:server_settings/server_settings/tmail_server_settings.dart'; import 'package:tmail_ui_user/features/server_settings/domain/exceptions/server_settings_exception.dart'; import 'package:tmail_ui_user/features/server_settings/domain/repository/server_settings_repository.dart'; @@ -13,12 +14,14 @@ class UpdateServerSettingInteractor { UpdateServerSettingInteractor(this._serverSettingsRepository); Stream> execute( + Session session, AccountId accountId, TMailServerSettingOptions newSettingOption, ) async* { yield Right(UpdatingServerSetting()); try { final serverSetting = await _serverSettingsRepository.updateServerSettings( + session, accountId, TMailServerSettings(settings: newSettingOption), ); diff --git a/test/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl_test.dart b/test/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl_test.dart index bd2ef0ad4..18b2230b0 100644 --- a/test/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl_test.dart +++ b/test/features/server_settings/data/datasource_impl/remote_server_settings_data_source_impl_test.dart @@ -10,6 +10,7 @@ import 'package:tmail_ui_user/features/server_settings/data/network/server_setti import 'package:tmail_ui_user/features/server_settings/domain/exceptions/server_settings_exception.dart'; import 'package:tmail_ui_user/main/exceptions/remote_exception_thrower.dart'; +import '../../../../fixtures/session_fixtures.dart'; import 'remote_server_settings_data_source_impl_test.mocks.dart'; @GenerateNiceMocks([MockSpec()]) @@ -18,6 +19,7 @@ void main() { id: ServerSettingsId(id: Id('123')), settings: TMailServerSettingOptions(alwaysReadReceipts: true), ); + final session = SessionFixtures.aliceSession; final accountId = AccountId(Id('321')); final serverSettingsAPI = MockServerSettingsAPI(); final remoteServerSettingsDataSource = RemoteServerSettingsDataSourceImpl( @@ -55,12 +57,12 @@ void main() { group('update server settings', () { test('should return value when ServerSettingsAPI returns value',() async { // arrange - when(serverSettingsAPI.updateServerSettings(any, any)) + when(serverSettingsAPI.updateServerSettings(any, any, any)) .thenAnswer((_) async => serverSettings); // act final result = await remoteServerSettingsDataSource - .updateServerSettings(accountId, serverSettings); + .updateServerSettings(session, accountId, serverSettings); // assert expect(result, serverSettings); @@ -68,12 +70,13 @@ void main() { test('should rethrow exception when ServerSettingsAPI throws exception',() async { // arrange - when(serverSettingsAPI.updateServerSettings(any, any)) + when(serverSettingsAPI.updateServerSettings(any, any, any)) .thenThrow(CanNotUpdateServerSettingsException()); // assert expect( () => remoteServerSettingsDataSource.updateServerSettings( + session, accountId, serverSettings), throwsA(const TypeMatcher())); diff --git a/test/features/server_settings/data/network/server_settings_api_test.dart b/test/features/server_settings/data/network/server_settings_api_test.dart index ebd1ee303..f9ddaa197 100644 --- a/test/features/server_settings/data/network/server_settings_api_test.dart +++ b/test/features/server_settings/data/network/server_settings_api_test.dart @@ -9,6 +9,8 @@ import 'package:server_settings/server_settings/tmail_server_settings.dart'; import 'package:tmail_ui_user/features/server_settings/data/network/server_settings_api.dart'; import 'package:tmail_ui_user/features/server_settings/domain/exceptions/server_settings_exception.dart'; +import '../../../../fixtures/session_fixtures.dart'; + void main() { final newServerSettings = TMailServerSettings( id: ServerSettingsIdExtension.serverSettingsIdSingleton, @@ -91,11 +93,13 @@ void main() { final httpClient = HttpClient(dio); final serverSettingsAPI = ServerSettingsAPI(httpClient); + final session = SessionFixtures.aliceSession; final accountId = AccountId(Id('123')); // assert expect( serverSettingsAPI.updateServerSettings( + session, accountId, newServerSettings), throwsA(isA())); diff --git a/test/features/server_settings/data/repository/server_settings_repository_impl_test.dart b/test/features/server_settings/data/repository/server_settings_repository_impl_test.dart index a113eec4b..33608936f 100644 --- a/test/features/server_settings/data/repository/server_settings_repository_impl_test.dart +++ b/test/features/server_settings/data/repository/server_settings_repository_impl_test.dart @@ -8,11 +8,13 @@ import 'package:tmail_ui_user/features/server_settings/data/datasource/server_se import 'package:tmail_ui_user/features/server_settings/data/repository/server_settings_repository_impl.dart'; import 'package:tmail_ui_user/features/server_settings/domain/exceptions/server_settings_exception.dart'; +import '../../../../fixtures/session_fixtures.dart'; import 'server_settings_repository_impl_test.mocks.dart'; @GenerateNiceMocks([MockSpec()]) void main() { final serverSettings = TMailServerSettings(); + final session = SessionFixtures.aliceSession; final accountId = AccountId(Id('123')); final serverSettingsDataSource = MockServerSettingsDataSource(); final serverSettingsRepository = ServerSettingsRepositoryImpl( @@ -48,12 +50,12 @@ void main() { group('update server settings', () { test('should return value when ServerSettingsDataSource returns value', () async { // arrange - when(serverSettingsDataSource.updateServerSettings(accountId, serverSettings)) + when(serverSettingsDataSource.updateServerSettings(session, accountId, serverSettings)) .thenAnswer((_) async => serverSettings); // act final result = await serverSettingsRepository - .updateServerSettings(accountId, serverSettings); + .updateServerSettings(session, accountId, serverSettings); // assert expect(result, serverSettings); @@ -61,12 +63,12 @@ void main() { test('should rethrow exception when ServerSettingsDataSource throws exception', () async { // arrange - when(serverSettingsDataSource.updateServerSettings(accountId, serverSettings)) + when(serverSettingsDataSource.updateServerSettings(session, accountId, serverSettings)) .thenThrow(NotFoundServerSettingsException()); // assert expect( - () => serverSettingsRepository.updateServerSettings(accountId, serverSettings), + () => serverSettingsRepository.updateServerSettings(session, accountId, serverSettings), throwsA(const TypeMatcher())); }); }); diff --git a/test/features/server_settings/domain/usecases/update_server_setting_interactor_test.dart b/test/features/server_settings/domain/usecases/update_server_setting_interactor_test.dart index 829b6bf95..e3912abf3 100644 --- a/test/features/server_settings/domain/usecases/update_server_setting_interactor_test.dart +++ b/test/features/server_settings/domain/usecases/update_server_setting_interactor_test.dart @@ -10,10 +10,12 @@ import 'package:tmail_ui_user/features/server_settings/domain/repository/server_ import 'package:tmail_ui_user/features/server_settings/domain/state/update_server_setting_state.dart'; import 'package:tmail_ui_user/features/server_settings/domain/usecases/update_server_setting_interactor.dart'; +import '../../../../fixtures/session_fixtures.dart'; import 'update_server_setting_interactor_test.mocks.dart'; @GenerateNiceMocks([MockSpec()]) void main() { + final session = SessionFixtures.aliceSession; final accountId = AccountId(Id('123')); const alwaysReadReceipts = false; final serverSettings = TMailServerSettings( @@ -24,12 +26,13 @@ void main() { group('update always read receipt setting interactor', () { test('should return right with value returned from repository', () { // arrange - when(serverSettingsRepository.updateServerSettings(any, any)) + when(serverSettingsRepository.updateServerSettings(any, any, any)) .thenAnswer((_) async => serverSettings); // assert expect( updateServerSettingInteractor.execute( + session, accountId, TMailServerSettingOptions(alwaysReadReceipts: alwaysReadReceipts), ), @@ -43,12 +46,13 @@ void main() { test('should return left with exception returned from repository', () { // arrange final exception = NotFoundServerSettingsException(); - when(serverSettingsRepository.updateServerSettings(any, any)) + when(serverSettingsRepository.updateServerSettings(any, any, any)) .thenThrow(exception); // assert expect( updateServerSettingInteractor.execute( + session, accountId, TMailServerSettingOptions(alwaysReadReceipts: alwaysReadReceipts), ),