diff --git a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java index f5b58a3..d78ca5d 100644 --- a/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java +++ b/data/src/main/java/org/mercury_im/messenger/data/repository/XmppGroupChatRepository.java @@ -3,6 +3,7 @@ package org.mercury_im.messenger.data.repository; import org.mercury_im.messenger.data.mapping.GroupChatMapping; import org.mercury_im.messenger.data.model.GroupChatModel; import org.mercury_im.messenger.data.util.Optional; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.entity.chat.IGroupChat; import org.mercury_im.messenger.entity.message.Message; @@ -68,9 +69,23 @@ public class XmppGroupChatRepository } @Override - public Observable> observeGroupChatByRoomAddress(String roomAddress) { + public Single getOrCreateGroupChat(Account account, String roomAddress) { + return getGroupChatByRoomAddress(account, roomAddress) + .switchIfEmpty(insertGroupChat(new IGroupChat(){ + { + setAccount(account); + setRoomAddress(roomAddress); + } + })) + .subscribeOn(subscriberScheduler()) + .observeOn(observerScheduler()); + } + + @Override + public Observable> observeGroupChatByRoomAddress(long accountId, String roomAddress) { return data().select(GroupChatModel.class) .where(GroupChatModel.ADDRESS.eq(roomAddress)) + .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) .get().observableResult() .map(result -> new Optional<>( groupChatMapping.modelToEntity(result.firstOrNull(), new IGroupChat()))) @@ -79,9 +94,10 @@ public class XmppGroupChatRepository } @Override - public Maybe getGroupChatByRoomAddress(String roomAddress) { + public Maybe getGroupChatByRoomAddress(long accountId, String roomAddress) { return data().select(GroupChatModel.class) .where(GroupChatModel.ADDRESS.eq(roomAddress)) + .and(GroupChatModel.ACCOUNT_ID.eq(accountId)) .get().maybe() .map(model -> groupChatMapping.modelToEntity(model, new IGroupChat())) .subscribeOn(subscriberScheduler()) diff --git a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java index 643c527..601edac 100644 --- a/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java +++ b/domain/src/main/java/org/mercury_im/messenger/data/repository/GroupChatRepository.java @@ -1,5 +1,6 @@ package org.mercury_im.messenger.data.repository; +import org.mercury_im.messenger.entity.Account; import org.mercury_im.messenger.entity.chat.GroupChat; import org.mercury_im.messenger.entity.message.Message; import org.mercury_im.messenger.data.util.Optional; @@ -19,9 +20,19 @@ public interface GroupChatRepository { Maybe getGroupChat(long chatId); - Observable> observeGroupChatByRoomAddress(String roomAddress); + Single getOrCreateGroupChat(Account account, String roomAddress); - Maybe getGroupChatByRoomAddress(String roomAddress); + default Observable> observeGroupChatByRoomAddress(Account account, String roomAddress) { + return observeGroupChatByRoomAddress(account.getId(), roomAddress); + } + + Observable> observeGroupChatByRoomAddress(long accountId, String roomAddress); + + default Maybe getGroupChatByRoomAddress(Account account, String roomAddress) { + return getGroupChatByRoomAddress(account.getId(), roomAddress); + } + + Maybe getGroupChatByRoomAddress(long accountId, String roomAddress); Observable> observeAllGroupChats();