Mercury-IM/repository_xmpp/src/main/java/org/mercury_im/messenger/xmpp/repository/RosterRepository.java

203 lines
8.3 KiB
Java

package org.mercury_im.messenger.xmpp.repository;
import org.jxmpp.jid.EntityBareJid;
import org.mercury_im.messenger.xmpp.model.AccountModel;
import org.mercury_im.messenger.xmpp.model.ContactModel;
import org.mercury_im.messenger.xmpp.model.EntityModel;
import org.mercury_im.messenger.thread_utils.ThreadUtils;
import javax.inject.Inject;
import javax.inject.Named;
import io.reactivex.Completable;
import io.reactivex.Observable;
import io.reactivex.Scheduler;
import io.reactivex.Single;
import io.requery.Persistable;
import io.requery.reactivex.ReactiveEntityStore;
import io.requery.reactivex.ReactiveResult;
public class RosterRepository extends RequeryRepository {
@Inject
public RosterRepository(ReactiveEntityStore<Persistable> data,
@Named(value = ThreadUtils.SCHEDULER_IO) Scheduler subscriberScheduler,
@Named(value = ThreadUtils.SCHEDULER_UI) Scheduler observerScheduler) {
super(data, subscriberScheduler, observerScheduler);
}
/*
ContactModel related methods
*/
public Observable<ReactiveResult<ContactModel>> getAllContactsOfAccount(AccountModel accountModel) {
return getAllContactsOfAccount(accountModel.getId());
}
public Observable<ReactiveResult<ContactModel>> getAllContactsOfAccount(long accountId) {
return data().select(ContactModel.class).join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID))
.where(EntityModel.ACCOUNT_ID.eq(accountId))
.get().observableResult()
.subscribeOn(subscriberScheduler()).observeOn(observerScheduler());
}
public Single<ContactModel> upsertContact(ContactModel contact) {
return data().upsert(contact).subscribeOn(subscriberScheduler()).observeOn(observerScheduler());
}
public Completable deleteContact(ContactModel contact) {
return data().delete(contact).subscribeOn(subscriberScheduler()).observeOn(observerScheduler());
}
public Completable deleteContact(long accountId, EntityBareJid jid) {
return data().delete(ContactModel.class).from(ContactModel.class)
.join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID))
.where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid)))
.get().single().ignoreElement()
.subscribeOn(subscriberScheduler()).observeOn(observerScheduler());
}
public Single<Integer> deleteAllContactsOfAccount(AccountModel account) {
return deleteAllContactsOfAccount(account.getId());
}
public Single<Integer> deleteAllContactsOfAccount(long accountId) {
return data().delete(ContactModel.class).from(ContactModel.class)
.join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID))
.where(EntityModel.ACCOUNT_ID.eq(accountId))
.get().single()
.subscribeOn(subscriberScheduler()).observeOn(observerScheduler());
}
/*
EntityModel related methods
*/
public Observable<ReactiveResult<EntityModel>> getAllEntitiesOfAccount(AccountModel account) {
return getAllEntitiesOfAccount(account.getId());
}
public Observable<ReactiveResult<EntityModel>> getAllEntitiesOfAccount(long accountId) {
return data().select(EntityModel.class).where(EntityModel.ACCOUNT_ID.eq(accountId))
.get().observableResult()
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
public Observable<ReactiveResult<EntityModel>> getEntityById(long entityId) {
return data().select(EntityModel.class).where(EntityModel.ID.eq(entityId))
.get().observableResult()
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
public Observable<ReactiveResult<EntityModel>> getEntityByJid(AccountModel account, EntityBareJid jid) {
return getEntityByJid(account.getId(), jid);
}
public Observable<ReactiveResult<EntityModel>> getEntityByJid(long accountId, EntityBareJid jid) {
return data().select(EntityModel.class)
.where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid)))
.get().observableResult()
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
public Single<EntityModel> getOrCreateEntity(long accountId, EntityBareJid jid) {
return Single.fromCallable(() -> {
AccountModel account = data().select(AccountModel.class).where(AccountModel.ID.eq(accountId))
.get().first();
return getOrCreateEntity(account, jid).blockingGet();
})
.observeOn(observerScheduler())
.subscribeOn(subscriberScheduler());
}
public Single<EntityModel> getOrCreateEntity(AccountModel account, EntityBareJid jid) {
return Single.fromCallable(() -> {
EntityModel entity = data().select(EntityModel.class)
.where(EntityModel.ACCOUNT_ID.eq(account.getId()).and(EntityModel.JID.eq(jid)))
.get().firstOrNull();
if (entity == null) {
entity = new EntityModel();
entity.setAccount(account);
entity.setJid(jid);
entity = data().insert(entity).blockingGet();
}
return entity;
})
.observeOn(observerScheduler())
.subscribeOn(subscriberScheduler());
}
public Single<EntityModel> upsertEntity(EntityModel entity) {
return data().upsert(entity)
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
public Completable deleteEntity(EntityModel entity) {
return data().delete(entity)
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
/*
RosterVersion related methods
*/
public Single<Integer> updateRosterVersion(long accountId, String rosterVer) {
return data().update(AccountModel.class).set(AccountModel.ROSTER_VERSION, rosterVer)
.where(AccountModel.ID.eq(accountId))
.get().single()
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
public Observable<String> getRosterVersion(AccountModel account) {
return getRosterVersion(account.getId());
}
public Observable<String> getRosterVersion(long accountId) {
return data().select(AccountModel.class).where(AccountModel.ID.eq(accountId))
.get().observableResult()
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler())
.map(accountModels -> {
AccountModel accountModel = accountModels.firstOrNull();
if (accountModel == null || accountModel.getRosterVersion() == null) {
return "";
}
return accountModel.getRosterVersion();
});
}
public Single<AccountModel> updateRosterVersion(AccountModel account, String rosterVersion) {
account.setRosterVersion(rosterVersion);
return data().upsert(account)
.subscribeOn(subscriberScheduler()).observeOn(observerScheduler());
}
public Observable<ReactiveResult<ContactModel>> getContact(AccountModel account, EntityBareJid jid) {
return getContact(account.getId(), jid);
}
public Observable<ReactiveResult<ContactModel>> getContact(long accountId, EntityBareJid jid) {
return data().select(ContactModel.class).from(ContactModel.class)
.join(EntityModel.class).on(ContactModel.ENTITY_ID.eq(EntityModel.ID))
.where(EntityModel.ACCOUNT_ID.eq(accountId).and(EntityModel.JID.eq(jid)))
.get().observableResult()
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
public Observable<ReactiveResult<ContactModel>> getAllContacts() {
return data().select(ContactModel.class)
.get().observableResult()
.subscribeOn(subscriberScheduler())
.observeOn(observerScheduler());
}
}