From f4302e06e89f960711dc65f35685c17e9def96bd Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 25 Nov 2025 00:11:16 +0700 Subject: [PATCH] TF-4171 Add datasource/repository/interactor for get all labels --- labels/lib/labels.dart | 9 +++ .../data/datasource/label_datasource.dart | 6 ++ .../label_datasource_impl.dart | 22 +++++++ .../labels/data/network/label_api.dart | 26 +++++++++ .../repository/label_repository_impl.dart | 15 +++++ .../domain/repository/label_repository.dart | 6 ++ .../domain/state/get_all_label_state.dart | 18 ++++++ .../usecases/get_all_label_interactor.dart | 22 +++++++ .../labels/presentation/label_controller.dart | 58 +++++++++++++++++++ .../label_interactor_bindings.dart | 43 ++++++++++++++ .../bindings/mailbox_dashboard_bindings.dart | 3 + .../mailbox_dashboard_controller.dart | 10 ++++ .../mailbox_dashboard_controller_test.dart | 4 ++ .../mailbox_dashboard_view_widget_test.dart | 4 ++ ...fore_time_in_search_email_filter_test.dart | 4 ++ 15 files changed, 250 insertions(+) create mode 100644 lib/features/labels/data/datasource/label_datasource.dart create mode 100644 lib/features/labels/data/datasource_impl/label_datasource_impl.dart create mode 100644 lib/features/labels/data/network/label_api.dart create mode 100644 lib/features/labels/data/repository/label_repository_impl.dart create mode 100644 lib/features/labels/domain/repository/label_repository.dart create mode 100644 lib/features/labels/domain/state/get_all_label_state.dart create mode 100644 lib/features/labels/domain/usecases/get_all_label_interactor.dart create mode 100644 lib/features/labels/presentation/label_controller.dart create mode 100644 lib/features/labels/presentation/label_interactor_bindings.dart diff --git a/labels/lib/labels.dart b/labels/lib/labels.dart index 4b9c3052e..0b9052814 100644 --- a/labels/lib/labels.dart +++ b/labels/lib/labels.dart @@ -2,3 +2,12 @@ export 'package:labels/model/label.dart'; export 'package:labels/model/hex_color.dart'; export 'package:labels/utils/labels_constants.dart'; + +export 'package:labels/method/set/set_label_method.dart'; +export 'package:labels/method/set/set_label_response.dart'; +export 'package:labels/method/get/get_label_method.dart'; +export 'package:labels/method/get/get_label_response.dart'; +export 'package:labels/method/changes/changes_label_method.dart'; +export 'package:labels/method/changes/changes_label_response.dart'; + +export 'package:labels/extensions/label_extension.dart'; diff --git a/lib/features/labels/data/datasource/label_datasource.dart b/lib/features/labels/data/datasource/label_datasource.dart new file mode 100644 index 000000000..49385740e --- /dev/null +++ b/lib/features/labels/data/datasource/label_datasource.dart @@ -0,0 +1,6 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:labels/model/label.dart'; + +abstract class LabelDatasource { + Future> getAllLabels(AccountId accountId); +} diff --git a/lib/features/labels/data/datasource_impl/label_datasource_impl.dart b/lib/features/labels/data/datasource_impl/label_datasource_impl.dart new file mode 100644 index 000000000..0012ea5e4 --- /dev/null +++ b/lib/features/labels/data/datasource_impl/label_datasource_impl.dart @@ -0,0 +1,22 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:labels/model/label.dart'; +import 'package:tmail_ui_user/features/labels/data/datasource/label_datasource.dart'; +import 'package:tmail_ui_user/features/labels/data/network/label_api.dart'; +import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart'; + +class LabelDatasourceImpl extends LabelDatasource { + final LabelApi _labelApi; + final ExceptionThrower _exceptionThrower; + + LabelDatasourceImpl(this._labelApi, this._exceptionThrower); + + @override + Future> getAllLabels(AccountId accountId) { + return Future.sync(() async { + return await _labelApi.getAllLabels(accountId); + }).catchError((error, stackTrace) async { + await _exceptionThrower.throwException(error, stackTrace); + throw error; + }); + } +} diff --git a/lib/features/labels/data/network/label_api.dart b/lib/features/labels/data/network/label_api.dart new file mode 100644 index 000000000..9794083cb --- /dev/null +++ b/lib/features/labels/data/network/label_api.dart @@ -0,0 +1,26 @@ +import 'package:jmap_dart_client/http/http_client.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/jmap_request.dart'; +import 'package:labels/labels.dart'; + +class LabelApi { + final HttpClient _httpClient; + + LabelApi(this._httpClient); + + Future> getAllLabels(AccountId accountId) async { + final builder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); + final method = GetLabelMethod(accountId); + final invocation = builder.invocation(method); + + final result = + await (builder..usings(method.requiredCapabilities)).build().execute(); + + final response = result.parse( + invocation.methodCallId, + GetLabelResponse.deserialize, + ); + + return response?.list ?? []; + } +} diff --git a/lib/features/labels/data/repository/label_repository_impl.dart b/lib/features/labels/data/repository/label_repository_impl.dart new file mode 100644 index 000000000..f1cca9153 --- /dev/null +++ b/lib/features/labels/data/repository/label_repository_impl.dart @@ -0,0 +1,15 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:labels/model/label.dart'; +import 'package:tmail_ui_user/features/labels/data/datasource/label_datasource.dart'; +import 'package:tmail_ui_user/features/labels/domain/repository/label_repository.dart'; + +class LabelRepositoryImpl extends LabelRepository { + final LabelDatasource _labelDatasource; + + LabelRepositoryImpl(this._labelDatasource); + + @override + Future> getAllLabels(AccountId accountId) { + return _labelDatasource.getAllLabels(accountId); + } +} diff --git a/lib/features/labels/domain/repository/label_repository.dart b/lib/features/labels/domain/repository/label_repository.dart new file mode 100644 index 000000000..2ae7b15fd --- /dev/null +++ b/lib/features/labels/domain/repository/label_repository.dart @@ -0,0 +1,6 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:labels/model/label.dart'; + +abstract class LabelRepository { + Future> getAllLabels(AccountId accountId); +} diff --git a/lib/features/labels/domain/state/get_all_label_state.dart b/lib/features/labels/domain/state/get_all_label_state.dart new file mode 100644 index 000000000..a7f3bdf3e --- /dev/null +++ b/lib/features/labels/domain/state/get_all_label_state.dart @@ -0,0 +1,18 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:labels/model/label.dart'; + +class GettingAllLabel extends LoadingState {} + +class GetAllLabelSuccess extends UIState { + final List