package com.novoda.bonfire.user.database;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.novoda.bonfire.rx.FirebaseObservableListeners;
import com.novoda.bonfire.user.data.model.User;
import com.novoda.bonfire.user.data.model.Users;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.functions.Func1;
public class FirebaseUserDatabase implements UserDatabase {
private final DatabaseReference usersDB;
private final FirebaseObservableListeners firebaseObservableListeners;
public FirebaseUserDatabase(FirebaseDatabase firebaseDatabase, FirebaseObservableListeners firebaseObservableListeners) {
usersDB = firebaseDatabase.getReference("users");
this.firebaseObservableListeners = firebaseObservableListeners;
}
@Override
public Observable<Users> observeUsers() {
return firebaseObservableListeners.listenToValueEvents(usersDB, toUsers());
}
@Override
public Observable<User> readUserFrom(String userId) {
return firebaseObservableListeners.listenToSingleValueEvents(usersDB.child(userId), as(User.class));
}
@Override
public Observable<User> observeUser(String userId) {
return firebaseObservableListeners.listenToValueEvents(usersDB.child(userId), as(User.class));
}
@Override
public void writeCurrentUser(User user) {
usersDB.child(user.getId()).setValue(user); //TODO handle errors
}
private Func1<DataSnapshot, Users> toUsers() {
return new Func1<DataSnapshot, Users>() {
@Override
public Users call(DataSnapshot dataSnapshot) {
Iterable<DataSnapshot> children = dataSnapshot.getChildren();
List<User> users = new ArrayList<>();
for (DataSnapshot child : children) {
User message = child.getValue(User.class);
users.add(message);
}
return new Users(users);
}
};
}
private <T> Func1<DataSnapshot, T> as(final Class<T> tClass) {
return new Func1<DataSnapshot, T>() {
@Override
public T call(DataSnapshot dataSnapshot) {
return dataSnapshot.getValue(tClass);
}
};
}
}