Mercury-IM/domain/src/main/java/org/mercury_im/messenger/usecase/AddAccount.java

83 lines
3.1 KiB
Java
Raw Normal View History

package org.mercury_im.messenger.usecase;
import org.mercury_im.messenger.data.repository.AccountRepository;
import org.mercury_im.messenger.entity.Account;
import org.mercury_im.messenger.xmpp.MercuryConnection;
import org.mercury_im.messenger.xmpp.MercuryConnectionManager;
2020-01-06 03:41:37 +01:00
import java.util.logging.Level;
import java.util.logging.Logger;
import io.reactivex.Completable;
import io.reactivex.Single;
2019-12-21 01:45:30 +01:00
import io.reactivex.disposables.CompositeDisposable;
import io.reactivex.schedulers.Schedulers;
public class AddAccount {
private static final Logger LOGGER = Logger.getLogger(AddAccount.class.getName());
private final AccountRepository accountRepository;
private final MercuryConnectionManager connectionManager;
2019-12-21 01:45:30 +01:00
private final CompositeDisposable disposable = new CompositeDisposable();
public AddAccount(AccountRepository accountRepository, MercuryConnectionManager connectionManager) {
this.accountRepository = accountRepository;
this.connectionManager = connectionManager;
}
2020-01-04 22:56:34 +01:00
public Completable execute(Account account) {
return loginAndStoreAccountIfSuccessful(account);
}
2020-01-04 22:56:34 +01:00
private Completable loginAndStoreAccountIfSuccessful(Account account) {
2020-01-06 03:41:37 +01:00
LOGGER.log(Level.INFO, "loginAndStoreIfSuccessful");
2020-01-04 22:56:34 +01:00
return logIntoAccount(account).flatMap(connection ->
insertEnabledAccountIntoDatabase(account).flatMap(insertedAccount ->
updateAccountIdInConnectionSingle(insertedAccount, connection)))
.map(this::addConnectionToMessenger)
.ignoreElement();
}
2020-01-04 22:56:34 +01:00
private Single<MercuryConnection> logIntoAccount(Account account) {
return getOrCreateConnectionSingle(account)
.doAfterSuccess(con -> LogIntoAccount.with(con).executeAndPossiblyThrow())
.subscribeOn(Schedulers.io());
}
2020-01-04 22:56:34 +01:00
private Single<MercuryConnection> getOrCreateConnectionSingle(Account account) {
return Single.fromCallable(() -> getOrCreateConnection(account));
}
private MercuryConnection getOrCreateConnection(Account account) {
MercuryConnection connection = connectionManager.getConnection(account);
2020-01-04 22:56:34 +01:00
if (connection == null) {
connection = new MercuryConnection(accountRepository, account);
2020-01-04 22:56:34 +01:00
}
return connection;
}
2020-01-04 22:56:34 +01:00
private Single<Account> insertEnabledAccountIntoDatabase(Account account) {
account.setEnabled(true);
2020-01-04 22:56:34 +01:00
return accountRepository.upsertAccount(account);
}
2020-01-04 22:56:34 +01:00
private Completable addConnectionToMessenger(MercuryConnection connection) {
return Completable.fromAction(() -> connectionManager.registerConnection(connection));
2019-12-22 02:06:51 +01:00
}
2020-01-04 22:56:34 +01:00
private Single<MercuryConnection> updateAccountIdInConnectionSingle(Account account, MercuryConnection connection) {
return Single.fromCallable(() -> {
updateAccountIdInConnection(account, connection);
return connection;
});
}
2020-01-04 22:56:34 +01:00
private void updateAccountIdInConnection(Account account, MercuryConnection connection) {
if (connection != null) {
connection.getAccount().setId(account.getId());
}
}
}