TF-1897 Implement delete multiple sending email

(cherry picked from commit fecdb2cedba62820b0639d4aff495e2f93fa8c58)
This commit is contained in:
dab246
2023-06-10 19:14:10 +07:00
committed by Dat Vu
parent 51c11f2cad
commit b6528b5bf5
10 changed files with 73 additions and 67 deletions
@@ -97,4 +97,8 @@ abstract class EmailDataSource {
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName); Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName);
Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId); Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId);
Future<void> deleteMultipleSendingEmail(AccountId accountId, UserName userName, List<String> sendingIds);
Future<List<SendingEmail>> updateMultipleSendingEmail(AccountId accountId, UserName userName, List<SendingEmail> newSendingEmails);
} }
@@ -195,7 +195,7 @@ class EmailDataSourceImpl extends EmailDataSource {
} }
@override @override
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}) { Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName) {
throw UnimplementedError(); throw UnimplementedError();
} }
@@ -208,4 +208,14 @@ class EmailDataSourceImpl extends EmailDataSource {
Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail) { Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail) {
throw UnimplementedError(); throw UnimplementedError();
} }
@override
Future<List<SendingEmail>> updateMultipleSendingEmail(AccountId accountId, UserName userName, List<SendingEmail> newSendingEmails) {
throw UnimplementedError();
}
@override
Future<List<SendingEmail>> deleteMultipleSendingEmail(AccountId accountId, UserName userName, List<String> sendingIds) {
throw UnimplementedError();
}
} }
@@ -35,6 +35,7 @@ import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache
import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/detailed_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_manager.dart';
import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart'; import 'package:tmail_ui_user/features/offline_mode/manager/opened_email_cache_worker_queue.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/extensions/list_sending_email_extension.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/extensions/sending_email_extension.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
import 'package:tmail_ui_user/features/thread/data/extensions/email_cache_extension.dart'; import 'package:tmail_ui_user/features/thread/data/extensions/email_cache_extension.dart';
@@ -256,25 +257,40 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource {
} }
@override @override
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}) { Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName) {
return Future.sync(() async { return Future.sync(() async {
final sendingEmailsCache = await _sendingEmailCacheManager.getAllSendingEmailsByTupleKey(accountId, userName, needToReopen: needToReopen); final sendingEmailsCache = await _sendingEmailCacheManager.getAllSendingEmailsByTupleKey(accountId, userName);
return sendingEmailsCache.toSendingEmails(); return sendingEmailsCache.toSendingEmails();
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId, {bool needToReopen = false}) { Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId) {
return Future.sync(() async { return Future.sync(() async {
return await _sendingEmailCacheManager.deleteSendingEmail(accountId, userName, sendingId, needToReopen: needToReopen); return await _sendingEmailCacheManager.deleteSendingEmail(accountId, userName, sendingId);
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override @override
Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail, {bool needToReopen = false}) { Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail) {
return Future.sync(() async { return Future.sync(() async {
final sendingEmailsCache = await _sendingEmailCacheManager.updateSendingEmail(accountId, userName, newSendingEmail.toHiveCache(), needToReopen: needToReopen); final sendingEmailsCache = await _sendingEmailCacheManager.updateSendingEmail(accountId, userName, newSendingEmail.toHiveCache());
return sendingEmailsCache.toSendingEmail(); return sendingEmailsCache.toSendingEmail();
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@override
Future<List<SendingEmail>> updateMultipleSendingEmail(AccountId accountId, UserName userName, List<SendingEmail> newSendingEmails) {
return Future.sync(() async {
final listSendingEmailsCache = await _sendingEmailCacheManager.updateMultipleSendingEmail(accountId, userName, newSendingEmails.toHiveCache());
return listSendingEmailsCache.toSendingEmails();
}).catchError(_exceptionThrower.throwException);
}
@override
Future<void> deleteMultipleSendingEmail(AccountId accountId, UserName userName, List<String> sendingIds) {
return Future.sync(() async {
return await _sendingEmailCacheManager.deleteMultipleSendingEmail(accountId, userName, sendingIds);
}).catchError(_exceptionThrower.throwException);
}
} }
@@ -11,22 +11,32 @@ class SendingQueueRepositoryImpl extends SendingQueueRepository {
SendingQueueRepositoryImpl(this._emailHiveCacheDataSourceImpl); SendingQueueRepositoryImpl(this._emailHiveCacheDataSourceImpl);
@override @override
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}) { Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName) {
return _emailHiveCacheDataSourceImpl.getAllSendingEmails(accountId, userName, needToReopen: needToReopen); return _emailHiveCacheDataSourceImpl.getAllSendingEmails(accountId, userName);
} }
@override @override
Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId, {bool needToReopen = false}) { Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId) {
return _emailHiveCacheDataSourceImpl.deleteSendingEmail(accountId, userName, sendingId, needToReopen: needToReopen); return _emailHiveCacheDataSourceImpl.deleteSendingEmail(accountId, userName, sendingId);
} }
@override @override
Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail, {bool needToReopen = false}) { Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail) {
return _emailHiveCacheDataSourceImpl.updateSendingEmail(accountId, userName, newSendingEmail, needToReopen: needToReopen); return _emailHiveCacheDataSourceImpl.updateSendingEmail(accountId, userName, newSendingEmail);
} }
@override @override
Future<SendingEmail> storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) { Future<SendingEmail> storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) {
return _emailHiveCacheDataSourceImpl.storeSendingEmail(accountId, userName, sendingEmail); return _emailHiveCacheDataSourceImpl.storeSendingEmail(accountId, userName, sendingEmail);
} }
@override
Future<List<SendingEmail>> updateMultipleSendingEmail(AccountId accountId, UserName userName, List<SendingEmail> newSendingEmails) {
return _emailHiveCacheDataSourceImpl.updateMultipleSendingEmail(accountId, userName, newSendingEmails);
}
@override
Future<void> deleteMultipleSendingEmail(AccountId accountId, UserName userName, List<String> sendingIds) {
return _emailHiveCacheDataSourceImpl.deleteMultipleSendingEmail(accountId, userName, sendingIds);
}
} }
@@ -4,11 +4,15 @@ import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/model/sending_email.dart';
abstract class SendingQueueRepository { abstract class SendingQueueRepository {
Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName, {bool needToReopen = false}); Future<List<SendingEmail>> getAllSendingEmails(AccountId accountId, UserName userName);
Future<SendingEmail> storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail); Future<SendingEmail> storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail);
Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId, {bool needToReopen = false}); Future<void> deleteSendingEmail(AccountId accountId, UserName userName, String sendingId);
Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail, {bool needToReopen = false}); Future<void> deleteMultipleSendingEmail(AccountId accountId, UserName userName, List<String> sendingIds);
Future<SendingEmail> updateSendingEmail(AccountId accountId, UserName userName, SendingEmail newSendingEmail);
Future<List<SendingEmail>> updateMultipleSendingEmail(AccountId accountId, UserName userName, List<SendingEmail> newSendingEmails);
} }
@@ -4,16 +4,13 @@ import 'package:core/presentation/state/success.dart';
class DeleteMultipleSendingEmailLoading extends UIState {} class DeleteMultipleSendingEmailLoading extends UIState {}
class DeleteMultipleSendingEmailAllSuccess extends UIState {} class DeleteMultipleSendingEmailSuccess extends UIState {
final List<String> sendingIds;
class DeleteMultipleSendingEmailHasSomeSuccess extends UIState {} DeleteMultipleSendingEmailSuccess(this.sendingIds);
class DeleteMultipleSendingEmailAllFailure extends FeatureFailure {
DeleteMultipleSendingEmailAllFailure(dynamic exception) : super(exception: exception);
@override @override
List<Object?> get props => [exception]; List<Object?> get props => [sendingIds];
} }
class DeleteMultipleSendingEmailFailure extends FeatureFailure { class DeleteMultipleSendingEmailFailure extends FeatureFailure {
@@ -3,32 +3,19 @@ import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart'; import 'package:dartz/dartz.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/repository/sending_queue_repository.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/state/delete_multiple_sending_email_state.dart'; import 'package:tmail_ui_user/features/sending_queue/domain/state/delete_multiple_sending_email_state.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/usecases/delete_single_sending_email_interactor.dart';
class DeleteMultipleSendingEmailInteractor { class DeleteMultipleSendingEmailInteractor {
final DeleteSingleSendingEmailInteractor _deleteSingleSendingEmailInteractor; final SendingQueueRepository _sendingQueueRepository;
DeleteMultipleSendingEmailInteractor(this._deleteSingleSendingEmailInteractor); DeleteMultipleSendingEmailInteractor(this._sendingQueueRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName, List<String> sendingIds) async* { Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName, List<String> sendingIds) async* {
try { try {
yield Right<Failure, Success>(DeleteMultipleSendingEmailLoading()); yield Right<Failure, Success>(DeleteMultipleSendingEmailLoading());
final listResult = await Future.wait( await _sendingQueueRepository.deleteMultipleSendingEmail(accountId, userName, sendingIds);
sendingIds.map((sendingId) => _deleteSingleSendingEmailInteractor.execute(accountId, userName, sendingId)), yield Right<Failure, Success>(DeleteMultipleSendingEmailSuccess(sendingIds));
eagerError: true
);
bool isAllSuccess = listResult.every((either) => either.isRight());
bool isAllFailure = listResult.every((either) => either.isLeft());
if (isAllSuccess) {
yield Right<Failure, Success>(DeleteMultipleSendingEmailAllSuccess());
} else if (isAllFailure) {
yield Left<Failure, Success>(DeleteMultipleSendingEmailAllFailure(null));
} else {
yield Right<Failure, Success>(DeleteMultipleSendingEmailHasSomeSuccess());
}
} catch (e) { } catch (e) {
yield Left<Failure, Success>(DeleteMultipleSendingEmailFailure(e)); yield Left<Failure, Success>(DeleteMultipleSendingEmailFailure(e));
} }
@@ -11,10 +11,10 @@ class DeleteSendingEmailInteractor {
DeleteSendingEmailInteractor(this._sendingQueueRepository); DeleteSendingEmailInteractor(this._sendingQueueRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName, String sendingId, {bool needToReopen = false}) async* { Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName, String sendingId) async* {
try { try {
yield Right<Failure, Success>(DeleteSendingEmailLoading()); yield Right<Failure, Success>(DeleteSendingEmailLoading());
await _sendingQueueRepository.deleteSendingEmail(accountId, userName, sendingId, needToReopen: needToReopen); await _sendingQueueRepository.deleteSendingEmail(accountId, userName, sendingId);
yield Right<Failure, Success>(DeleteSendingEmailSuccess()); yield Right<Failure, Success>(DeleteSendingEmailSuccess());
} catch (e) { } catch (e) {
yield Left<Failure, Success>(DeleteSendingEmailFailure(e)); yield Left<Failure, Success>(DeleteSendingEmailFailure(e));
@@ -1,22 +0,0 @@
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/user_name.dart';
import 'package:tmail_ui_user/features/email/domain/state/delete_sending_email_state.dart';
import 'package:tmail_ui_user/features/sending_queue/domain/repository/sending_queue_repository.dart';
class DeleteSingleSendingEmailInteractor {
final SendingQueueRepository _sendingQueueRepository;
DeleteSingleSendingEmailInteractor(this._sendingQueueRepository);
Future<Either<Failure, Success>> execute(AccountId accountId, UserName userName, String sendingId) async {
try {
await _sendingQueueRepository.deleteSendingEmail(accountId, userName, sendingId);
return Right<Failure, Success>(DeleteSendingEmailSuccess());
} catch (e) {
return Left<Failure, Success>(DeleteSendingEmailFailure(e));
}
}
}
@@ -11,10 +11,10 @@ class GetAllSendingEmailInteractor {
GetAllSendingEmailInteractor(this._sendingQueueRepository); GetAllSendingEmailInteractor(this._sendingQueueRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName, {bool needToReopen = false}) async* { Stream<Either<Failure, Success>> execute(AccountId accountId, UserName userName) async* {
try { try {
yield Right<Failure, Success>(GetAllSendingEmailLoading()); yield Right<Failure, Success>(GetAllSendingEmailLoading());
final sendingEmails = await _sendingQueueRepository.getAllSendingEmails(accountId, userName, needToReopen: needToReopen); final sendingEmails = await _sendingQueueRepository.getAllSendingEmails(accountId, userName);
yield Right<Failure, Success>(GetAllSendingEmailSuccess(sendingEmails)); yield Right<Failure, Success>(GetAllSendingEmailSuccess(sendingEmails));
} catch (e) { } catch (e) {
yield Left<Failure, Success>(GetAllSendingEmailFailure(e)); yield Left<Failure, Success>(GetAllSendingEmailFailure(e));