package com.novoda.bonfire.chat.database; import com.google.firebase.database.DataSnapshot; import com.google.firebase.database.DatabaseReference; import com.google.firebase.database.FirebaseDatabase; import com.novoda.bonfire.channel.data.model.Channel; import com.novoda.bonfire.chat.data.model.Chat; import com.novoda.bonfire.chat.data.model.Message; import com.novoda.bonfire.rx.FirebaseObservableListeners; import java.util.ArrayList; import java.util.List; import rx.Observable; import rx.functions.Func1; public class FirebaseChatDatabase implements ChatDatabase { private static final int DEFAULT_LIMIT = 1000; private final DatabaseReference messagesDB; private final FirebaseObservableListeners firebaseObservableListeners; public FirebaseChatDatabase(FirebaseDatabase firebaseDatabase, FirebaseObservableListeners firebaseObservableListeners) { messagesDB = firebaseDatabase.getReference("messages"); this.firebaseObservableListeners = firebaseObservableListeners; } @Override public Observable<Chat> observeChat(Channel channel) { return firebaseObservableListeners.listenToValueEvents(messagesInChannel(channel).limitToLast(DEFAULT_LIMIT), toChat()); } @Override public void sendMessage(Channel channel, Message message) { messagesInChannel(channel).push().setValue(message); //TODO handle errors } private DatabaseReference messagesInChannel(Channel channel) { return messagesDB.child(channel.getName()); } private Func1<DataSnapshot, Chat> toChat() { return new Func1<DataSnapshot, Chat>() { @Override public Chat call(DataSnapshot dataSnapshot) { Iterable<DataSnapshot> children = dataSnapshot.getChildren(); List<Message> messages = new ArrayList<>(); for (DataSnapshot child : children) { Message message = child.getValue(Message.class); messages.add(message); } return new Chat(messages); } }; } }