TF-1432 [Domain] Implement subscribe multiple mailbox

This commit is contained in:
dab246
2023-02-10 14:37:25 +07:00
committed by Dat Vu
parent 26f7e1519d
commit 6a27190f01
10 changed files with 209 additions and 16 deletions
@@ -0,0 +1,18 @@
import 'package:jmap_dart_client/jmap/core/id.dart';
import 'package:jmap_dart_client/jmap/core/patch_object.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/mailbox/mailbox_property.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
extension ListMailboxIdExtension on List<MailboxId> {
Map<Id, PatchObject> generateMapUpdateObjectSubscribeMailbox(MailboxSubscribeState subscribeState) {
final Map<Id, PatchObject> maps = {
for (var mailboxId in this)
mailboxId.id: PatchObject({
MailboxProperty.isSubscribed: subscribeState == MailboxSubscribeState.enabled
})
};
return maps;
}
}
@@ -1,19 +1,21 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart';
class SubscribeMailboxRequest with EquatableMixin {
class SubscribeMailboxRequest extends SubscribeRequest {
final MailboxId mailboxId;
final MailboxSubscribeState newState;
final MailboxSubscribeAction mailboxSubscribeStateAction;
SubscribeMailboxRequest(
this.mailboxId,
this.newState,
this.mailboxSubscribeStateAction);
this.mailboxId,
MailboxSubscribeState subscribeState,
MailboxSubscribeAction subscribeAction,
) : super(subscribeState, subscribeAction);
@override
List<Object?> get props => [mailboxId, newState, mailboxSubscribeStateAction];
List<Object?> get props => [
mailboxId,
super.props
];
}
@@ -0,0 +1,24 @@
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart';
class SubscribeMultipleMailboxRequest extends SubscribeRequest {
final MailboxId parentMailboxId;
final List<MailboxId> mailboxIdsSubscribe;
SubscribeMultipleMailboxRequest(
this.parentMailboxId,
this.mailboxIdsSubscribe,
MailboxSubscribeState subscribeState,
MailboxSubscribeAction subscribeAction,
) : super(subscribeState, subscribeAction);
@override
List<Object?> get props => [
parentMailboxId,
mailboxIdsSubscribe,
super.props
];
}
@@ -0,0 +1,14 @@
import 'package:equatable/equatable.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
abstract class SubscribeRequest with EquatableMixin {
final MailboxSubscribeState subscribeState;
final MailboxSubscribeAction subscribeAction;
SubscribeRequest(this.subscribeState, this.subscribeAction);
@override
List<Object?> get props => [subscribeState, subscribeAction];
}
@@ -16,6 +16,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dar
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
abstract class MailboxRepository {
Stream<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties});
@@ -39,4 +40,6 @@ abstract class MailboxRepository {
Future<State?> getMailboxState();
Future<bool> subscribeMailbox(AccountId accountId, SubscribeMailboxRequest request);
Future<List<MailboxId>> subscribeMultipleMailbox(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest);
}
@@ -8,11 +8,11 @@ class LoadingSubscribeMailbox extends UIState {}
class SubscribeMailboxSuccess extends UIActionState {
final MailboxId mailboxId;
final MailboxSubscribeAction mailboxSubscribeStateAction;
final MailboxSubscribeAction subscribeAction;
SubscribeMailboxSuccess(
this.mailboxId,
this.mailboxSubscribeStateAction,
this.subscribeAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
@@ -21,10 +21,9 @@ class SubscribeMailboxSuccess extends UIActionState {
@override
List<Object?> get props => [
mailboxId,
currentEmailState,
currentMailboxState,
mailboxSubscribeStateAction
mailboxId,
subscribeAction,
super.props
];
}
@@ -0,0 +1,75 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_state.dart';
class LoadingSubscribeMultipleMailbox extends UIState {}
class SubscribeMultipleMailboxAllSuccess extends UIActionState {
final MailboxId parentMailboxId;
final List<MailboxId> mailboxIdsSubscribe;
final MailboxSubscribeAction subscribeAction;
SubscribeMultipleMailboxAllSuccess(
this.parentMailboxId,
this.mailboxIdsSubscribe,
this.subscribeAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
@override
List<Object?> get props => [
parentMailboxId,
mailboxIdsSubscribe,
subscribeAction,
super.props
];
}
class SubscribeMultipleMailboxHasSomeSuccess extends UIActionState {
final MailboxId parentMailboxId;
final List<MailboxId> mailboxIdsSubscribe;
final MailboxSubscribeAction subscribeAction;
SubscribeMultipleMailboxHasSomeSuccess(
this.parentMailboxId,
this.mailboxIdsSubscribe,
this.subscribeAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
@override
List<Object?> get props => [
parentMailboxId,
mailboxIdsSubscribe,
subscribeAction,
super.props
];
}
class SubscribeMultipleMailboxAllFailure extends FeatureFailure {
SubscribeMultipleMailboxAllFailure();
@override
List<Object> get props => [];
}
class SubscribeMultipleMailboxFailure extends FeatureFailure {
final dynamic exception;
SubscribeMultipleMailboxFailure(this.exception);
@override
List<Object> get props => [exception];
}
@@ -23,7 +23,7 @@ class SubscribeMailboxInteractor {
yield Right<Failure, Success>(SubscribeMailboxSuccess(
request.mailboxId,
currentMailboxState: currentMailboxState,
request.mailboxSubscribeStateAction));
request.subscribeAction));
} else {
yield Left<Failure, Success>(SubscribeMailboxFailure(null));
}
@@ -0,0 +1,46 @@
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:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart';
class SubscribeMultipleMailboxInteractor {
final MailboxRepository _mailboxRepository;
SubscribeMultipleMailboxInteractor(this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest) async* {
try {
yield Right<Failure, Success>(LoadingSubscribeMultipleMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState();
final listResult = await _mailboxRepository.subscribeMultipleMailbox(accountId, subscribeRequest);
final matchedSize = listResult.length == subscribeRequest.mailboxIdsSubscribe.length;
final allMatchedMailboxIdSubscribe = subscribeRequest.mailboxIdsSubscribe
.every((mailboxId) => listResult.contains(mailboxId));
if (allMatchedMailboxIdSubscribe && matchedSize) {
yield Right<Failure, Success>(SubscribeMultipleMailboxAllSuccess(
subscribeRequest.parentMailboxId,
listResult,
subscribeRequest.subscribeAction,
currentMailboxState: currentMailboxState
));
} else if (listResult.isEmpty) {
yield Left<Failure, Success>(SubscribeMultipleMailboxAllFailure());
} else {
yield Right<Failure, Success>(SubscribeMultipleMailboxHasSomeSuccess(
subscribeRequest.parentMailboxId,
listResult,
subscribeRequest.subscribeAction,
currentMailboxState: currentMailboxState
));
}
} catch (e) {
yield Left<Failure, Success>(SubscribeMultipleMailboxFailure(e));
}
}
}
+13 -1
View File
@@ -101,7 +101,19 @@ class PresentationMailbox with EquatableMixin {
(namespace?.value.indexOf('[') ?? 0) + 1,
namespace?.value.indexOf(']'));
bool get isShowDisableMailbox => isTeamMailboxes || hasRole() || !hasParentId();
bool get supportedSubscribe => isSubscribed?.value == true;
bool get isSupportedDisableMailbox {
if (!supportedSubscribe) {
return false;
}
if (isPersonal) {
return true;
} else {
return isTeamMailboxes;
}
}
@override
List<Object?> get props => [