2019-12-07 02:04:31 +01:00
|
|
|
package org.mercury_im.messenger.data.repository;
|
|
|
|
|
2020-06-06 18:45:20 +02:00
|
|
|
import org.mercury_im.messenger.core.data.repository.MessageRepository;
|
2019-12-07 02:04:31 +01:00
|
|
|
import org.mercury_im.messenger.data.mapping.DirectChatMapping;
|
|
|
|
import org.mercury_im.messenger.data.mapping.GroupChatMapping;
|
|
|
|
import org.mercury_im.messenger.data.mapping.MessageMapping;
|
|
|
|
import org.mercury_im.messenger.data.model.DirectChatModel;
|
|
|
|
import org.mercury_im.messenger.data.model.DirectMessagesRelation;
|
2019-12-08 18:27:34 +01:00
|
|
|
import org.mercury_im.messenger.data.model.GroupChatModel;
|
|
|
|
import org.mercury_im.messenger.data.model.GroupMessagesRelation;
|
2019-12-07 02:04:31 +01:00
|
|
|
import org.mercury_im.messenger.data.model.MessageModel;
|
2019-12-08 18:27:34 +01:00
|
|
|
import org.mercury_im.messenger.data.repository.dao.DirectChatDao;
|
|
|
|
import org.mercury_im.messenger.data.repository.dao.GroupChatDao;
|
|
|
|
import org.mercury_im.messenger.data.repository.dao.MessageDao;
|
2019-12-07 02:04:31 +01:00
|
|
|
import org.mercury_im.messenger.entity.chat.DirectChat;
|
|
|
|
import org.mercury_im.messenger.entity.chat.GroupChat;
|
|
|
|
import org.mercury_im.messenger.entity.message.Message;
|
|
|
|
|
2019-12-08 18:27:34 +01:00
|
|
|
import java.util.ArrayList;
|
2019-12-07 02:04:31 +01:00
|
|
|
import java.util.List;
|
|
|
|
|
|
|
|
import javax.inject.Inject;
|
|
|
|
|
|
|
|
import io.reactivex.Completable;
|
|
|
|
import io.reactivex.Observable;
|
|
|
|
import io.reactivex.Single;
|
|
|
|
import io.requery.Persistable;
|
2019-12-08 18:27:34 +01:00
|
|
|
import io.requery.query.ResultDelegate;
|
2019-12-07 02:04:31 +01:00
|
|
|
import io.requery.reactivex.ReactiveEntityStore;
|
|
|
|
|
2020-06-09 20:49:13 +02:00
|
|
|
public class RxMessageRepository
|
2019-12-07 02:04:31 +01:00
|
|
|
extends RequeryRepository
|
|
|
|
implements MessageRepository {
|
|
|
|
|
|
|
|
private final MessageMapping messageMapping;
|
|
|
|
private final DirectChatMapping directChatMapping;
|
|
|
|
private final GroupChatMapping groupChatMapping;
|
|
|
|
|
2019-12-08 18:27:34 +01:00
|
|
|
private final DirectChatDao directChatDao;
|
|
|
|
private final GroupChatDao groupChatDao;
|
|
|
|
|
|
|
|
private final MessageDao dao;
|
|
|
|
|
|
|
|
|
2019-12-07 02:04:31 +01:00
|
|
|
@Inject
|
2020-06-09 20:49:13 +02:00
|
|
|
public RxMessageRepository(ReactiveEntityStore<Persistable> data,
|
|
|
|
MessageMapping messageMapping,
|
|
|
|
DirectChatMapping directChatMapping,
|
|
|
|
GroupChatMapping groupChatMapping) {
|
|
|
|
super(data);
|
2019-12-07 02:04:31 +01:00
|
|
|
this.messageMapping = messageMapping;
|
|
|
|
this.directChatMapping = directChatMapping;
|
|
|
|
this.groupChatMapping = groupChatMapping;
|
2019-12-08 18:27:34 +01:00
|
|
|
this.directChatDao = new DirectChatDao(data);
|
|
|
|
this.groupChatDao = new GroupChatDao(data);
|
|
|
|
this.dao = new MessageDao(data);
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Single<Message> insertMessage(DirectChat chat, Message message) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return directChatDao.get(chat.getId()).maybe()
|
|
|
|
.switchIfEmpty(directChatDao.insert(directChatMapping.toModel(chat)))
|
|
|
|
.map(chatModel -> toRelation(chatModel, messageMapping.toModel(message)))
|
|
|
|
.flatMap(data()::insert)
|
2019-12-07 02:04:31 +01:00
|
|
|
.map(DirectMessagesRelation::getMessage)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(messageModel -> messageMapping.toEntity(messageModel, message));
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Single<Message> insertMessage(GroupChat chat, Message message) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return groupChatDao.get(chat.getId()).maybe()
|
|
|
|
.switchIfEmpty(groupChatDao.insert(groupChatMapping.toModel(chat)))
|
|
|
|
.map(chatModel -> toRelation(chatModel, messageMapping.toModel(message)))
|
|
|
|
.flatMap(data()::insert)
|
|
|
|
.map(GroupMessagesRelation::getMessage)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(messageModel -> messageMapping.toEntity(messageModel, message));
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Observable<List<Message>> observeMessages(DirectChat chat) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return data().select(MessageModel.class)
|
|
|
|
.from(MessageModel.class)
|
|
|
|
.join(DirectMessagesRelation.class)
|
|
|
|
.on(DirectMessagesRelation.MESSAGE_ID.eq(MessageModel.ID))
|
2020-06-05 16:35:16 +02:00
|
|
|
.where(DirectMessagesRelation.CHAT_ID.eq(chat.getId()))
|
2019-12-08 18:27:34 +01:00
|
|
|
.get().observableResult()
|
|
|
|
.map(ResultDelegate::toList)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(this::messageModelsToEntities);
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Observable<List<Message>> observeMessages(GroupChat chat) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return data().select(MessageModel.class)
|
|
|
|
.from(MessageModel.class)
|
|
|
|
.join(GroupMessagesRelation.class)
|
|
|
|
.on(GroupMessagesRelation.MESSAGE_ID.eq(MessageModel.ID))
|
|
|
|
.where(GroupMessagesRelation.CHAT_ID.eq(chat.getId()))
|
|
|
|
.get().observableResult()
|
|
|
|
.map(ResultDelegate::toList)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(this::messageModelsToEntities);
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Observable<List<Message>> findMessagesWithBody(String body) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return data().select(MessageModel.class)
|
|
|
|
.from(MessageModel.class)
|
2020-06-05 16:35:16 +02:00
|
|
|
.where(MessageModel.BODY.eq(body))
|
2019-12-08 18:27:34 +01:00
|
|
|
.get().observableResult()
|
|
|
|
.map(ResultDelegate::toList)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(this::messageModelsToEntities);
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Observable<List<Message>> findMessagesWithBody(DirectChat chat, String body) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return data().select(MessageModel.class)
|
|
|
|
|
|
|
|
.from(MessageModel.class)
|
|
|
|
.join(DirectMessagesRelation.class)
|
|
|
|
.on(DirectMessagesRelation.MESSAGE_ID.eq(MessageModel.ID))
|
|
|
|
|
2020-06-05 16:35:16 +02:00
|
|
|
.where(MessageModel.BODY.eq(body))
|
2019-12-08 18:27:34 +01:00
|
|
|
.and(DirectMessagesRelation.CHAT_ID.eq(chat.getId()))
|
|
|
|
.get().observableResult()
|
|
|
|
.map(ResultDelegate::toList)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(this::messageModelsToEntities);
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Observable<List<Message>> findMessagesWithBody(GroupChat chat, String body) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return data().select(MessageModel.class)
|
|
|
|
|
|
|
|
.from(MessageModel.class)
|
|
|
|
.join(GroupMessagesRelation.class)
|
|
|
|
.on(GroupMessagesRelation.MESSAGE_ID.eq(MessageModel.ID))
|
|
|
|
|
2020-06-05 16:35:16 +02:00
|
|
|
.where(MessageModel.BODY.eq(body))
|
2019-12-08 18:27:34 +01:00
|
|
|
.and(GroupMessagesRelation.CHAT_ID.eq(chat.getId()))
|
|
|
|
.get().observableResult()
|
|
|
|
.map(ResultDelegate::toList)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(this::messageModelsToEntities);
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Single<Message> upsertMessage(DirectChat chat, Message message) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Single<Message> upsertMessage(GroupChat chat, Message message) {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Single<Message> updateMessage(Message message) {
|
2019-12-08 18:27:34 +01:00
|
|
|
return dao.get(message.getId()).maybe().toSingle()
|
|
|
|
.map(model -> messageMapping.toModel(message, model))
|
|
|
|
.flatMap(data()::update)
|
2020-06-09 20:49:13 +02:00
|
|
|
.map(model -> messageMapping.toEntity(model, message));
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public Completable deleteMessage(Message message) {
|
2019-12-08 22:49:42 +01:00
|
|
|
return data().delete(MessageModel.class)
|
|
|
|
.where(MessageModel.ID.eq(message.getId()))
|
|
|
|
.get().single().ignoreElement();
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|
2019-12-08 18:27:34 +01:00
|
|
|
|
|
|
|
private DirectMessagesRelation toRelation(DirectChatModel chat, MessageModel message) {
|
|
|
|
DirectMessagesRelation relation = new DirectMessagesRelation();
|
|
|
|
relation.setChat(chat);
|
|
|
|
relation.setMessage(message);
|
|
|
|
return relation;
|
|
|
|
}
|
|
|
|
|
|
|
|
private GroupMessagesRelation toRelation(GroupChatModel chat, MessageModel message) {
|
|
|
|
GroupMessagesRelation relation = new GroupMessagesRelation();
|
|
|
|
relation.setChat(chat);
|
|
|
|
relation.setMessage(message);
|
|
|
|
return relation;
|
|
|
|
}
|
|
|
|
|
|
|
|
private List<Message> messageModelsToEntities(List<MessageModel> models) {
|
|
|
|
List<Message> entities = new ArrayList<>(models.size());
|
|
|
|
for (MessageModel model : models) {
|
|
|
|
entities.add(messageMapping.toEntity(model));
|
|
|
|
}
|
|
|
|
return entities;
|
|
|
|
}
|
2019-12-07 02:04:31 +01:00
|
|
|
}
|