package com.code44.finance.api.requests;
import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import com.code44.finance.api.Request;
import com.code44.finance.api.User;
import com.code44.finance.common.utils.Preconditions;
import com.code44.finance.data.DataStore;
import com.code44.finance.data.model.Model;
import com.code44.finance.utils.EventBus;
import com.google.api.client.json.GenericJson;
import java.util.ArrayList;
import java.util.List;
public abstract class GetRequest<T extends GenericJson> extends Request {
private final Context context;
private final User user;
public GetRequest(EventBus eventBus, Context context, User user) {
super(eventBus);
Preconditions.notNull(context, "Context cannot be null.");
Preconditions.notNull(user, "User cannot be null.");
this.context = context;
this.user = user;
}
@Override protected void performRequest() throws Exception {
long timestamp = getLastTimestamp(user);
final List<T> entities = performRequest(timestamp);
final List<ContentValues> valuesList = new ArrayList<>();
for (T entity : entities) {
final Model model = getModelFrom(entity);
final ContentValues values = model.asValues();
onValuesCreated(values);
valuesList.add(values);
final long entityEditTimestamp = (Long) entity.get("edit_ts");
if (timestamp < entityEditTimestamp) {
timestamp = entityEditTimestamp;
}
}
DataStore.bulkInsert().values(valuesList).into(context, getSaveUri());
saveNewTimestamp(user, timestamp);
}
protected abstract long getLastTimestamp(User user);
protected abstract List<T> performRequest(long timestamp) throws Exception;
protected abstract Model getModelFrom(T entity);
protected abstract void saveNewTimestamp(User user, long newTimestamp);
protected abstract Uri getSaveUri();
protected void onValuesCreated(ContentValues values) {
}
protected Context getContext() {
return context;
}
protected User getUser() {
return user;
}
}