package com.badoo.chateau.core.repos.messages;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.badoo.barf.data.repo.Query;
import com.badoo.chateau.core.model.Message;
import com.badoo.chateau.core.repos.messages.MessageDataSource.LoadResult;
import com.badoo.chateau.core.repos.messages.MessageDataSource.Update;
import java.util.List;
/**
* Query class for performing operations on the MessageRepository
*/
public abstract class MessageQueries {
/**
* Query for retrieving messages in a conversation with optional paging.
*/
public static class LoadQuery<M extends Message> implements Query<LoadResult<M>> {
public enum Type {
ALL,
NEWER,
OLDER
}
@NonNull
private final String mConversationId;
@NonNull
private final Type mType;
@Nullable
private final M mOldest;
@Nullable
private final M mNewest;
public LoadQuery(@NonNull String conversationId, @NonNull Type type, @Nullable M oldest, @Nullable M newest) {
mConversationId = conversationId;
mType = type;
mOldest = oldest;
mNewest = newest;
}
@NonNull
public String getConversationId() {
return mConversationId;
}
@NonNull
public Type getType() {
return mType;
}
@Nullable
public M getOldest() {
return mOldest;
}
@Nullable
public M getNewest() {
return mNewest;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
LoadQuery<?> that = (LoadQuery<?>) o;
if (!mConversationId.equals(that.mConversationId)) return false;
if (mType != that.mType) return false;
if (mOldest != null ? !mOldest.equals(that.mOldest) : that.mOldest != null) return false;
return mNewest != null ? mNewest.equals(that.mNewest) : that.mNewest == null;
}
@Override
public int hashCode() {
int result = mConversationId.hashCode();
result = 31 * result + mType.hashCode();
result = 31 * result + (mOldest != null ? mOldest.hashCode() : 0);
result = 31 * result + (mNewest != null ? mNewest.hashCode() : 0);
return result;
}
@Override
public String toString() {
return "LoadQuery{" +
"mConversationId='" + mConversationId + '\'' +
", mType=" + mType +
", mOldest=" + mOldest +
", mNewest=" + mNewest +
'}';
}
}
/**
* Query for retrieving a list of messages that have not been delivered due to errors.
*/
public static class GetUndeliveredQuery<M extends Message> implements Query<List<M>> {
@Override
public boolean equals(Object o) {
if (this == o) return true;
return (o == null || getClass() == o.getClass());
}
@Override
public int hashCode() {
return 42;
}
@Override
public String toString() {
return "GetUndeliveredQuery{}";
}
}
/**
* Query for subscribing to new messages in a conversation, or messages in all conversations
*/
public static class SubscribeQuery<M extends Message> implements Query<Update<M>> {
private final String mConversationId;
public SubscribeQuery() {
mConversationId = null;
}
public SubscribeQuery(@Nullable String conversationId) {
mConversationId = conversationId;
}
public String getConversationId() {
return mConversationId;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof SubscribeQuery)) return false;
SubscribeQuery that = (SubscribeQuery) o;
return mConversationId != null ? mConversationId.equals(that.mConversationId) : that.mConversationId == null;
}
@Override
public int hashCode() {
return mConversationId != null ? mConversationId.hashCode() : 0;
}
@Override
public String toString() {
return "SubscribeQuery{" +
"mConversationId='" + mConversationId + '\'' +
'}';
}
}
/**
* Query for sending a new message
*/
public static class SendQuery<M extends Message> implements Query<Void> {
private final String mConversationId;
private final M mMessage;
public SendQuery(@NonNull String conversationId, @NonNull M message) {
mConversationId = conversationId;
mMessage = message;
}
@NonNull
public String getConversationId() {
return mConversationId;
}
public M getMessage() {
return mMessage;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
SendQuery<?> that = (SendQuery<?>) o;
if (!mConversationId.equals(that.mConversationId)) return false;
return mMessage.equals(that.mMessage);
}
@Override
public int hashCode() {
int result = mConversationId.hashCode();
result = 31 * result + mMessage.hashCode();
return result;
}
@Override
public String toString() {
return "SendQuery{" +
"mConversationId='" + mConversationId + '\'' +
", mMessage=" + mMessage +
'}';
}
}
}