package com.code44.finance.api.requests; import android.content.Context; import android.database.Cursor; import android.net.Uri; import com.code44.finance.api.User; import com.code44.finance.backend.endpoint.accounts.Accounts; import com.code44.finance.backend.endpoint.accounts.model.AccountEntity; import com.code44.finance.common.utils.Preconditions; import com.code44.finance.data.Query; import com.code44.finance.data.db.Tables; import com.code44.finance.data.model.Currency; import com.code44.finance.data.model.Model; import com.code44.finance.data.providers.AccountsProvider; import com.code44.finance.data.providers.CurrenciesProvider; import com.code44.finance.utils.IOUtils; import java.util.HashMap; import java.util.List; import java.util.Map; public class GetAccountsRequest extends GetRequest<AccountEntity> { private final Accounts accountsService; private final Map<String, Currency> currencies; public GetAccountsRequest(Context context, User user, Accounts accountsService) { super(null, context, user); Preconditions.notNull(accountsService, "Accounts cannot be null."); this.accountsService = accountsService; currencies = new HashMap<>(); } @Override protected long getLastTimestamp(User user) { return user.getAccountsTimestamp(); } @Override protected List<AccountEntity> performRequest(long timestamp) throws Exception { return accountsService.list(timestamp).execute().getItems(); } @Override protected Model getModelFrom(AccountEntity entity) { return null; } @Override protected void saveNewTimestamp(User user, long newTimestamp) { user.setAccountsTimestamp(newTimestamp); } @Override protected Uri getSaveUri() { return AccountsProvider.uriAccounts(); } private Currency getCurrencyFor(AccountEntity entity) { Currency currency = currencies.get(entity.getCurrencyId()); if (currency == null) { final Cursor cursor = Query.create() .projectionLocalId(Tables.Currencies.LOCAL_ID) .projection(Tables.Currencies.PROJECTION) .selection(Tables.Currencies.ID + "=?", entity.getCurrencyId()) .from(getContext(), CurrenciesProvider.uriCurrencies()) .execute(); currency = Currency.from(cursor); IOUtils.closeQuietly(cursor); currencies.put(entity.getCurrencyId(), currency); } return currency; } }