Fetch all merchants from the webservice.

- Modified the method that fetches the merchants from the webservice to keep requesting the merchants list until nothing is returned, to make sure the whole list of merchants is obtained.
- Modified the time the app waits to update the merchants and tellers list from 24 hours to just 3 hours.
This commit is contained in:
Severiano Jaramillo 2019-10-31 12:13:27 -06:00
parent d14c10c672
commit 0ae587a7aa
2 changed files with 34 additions and 21 deletions

View file

@ -21,13 +21,27 @@ class MerchantRepository internal constructor(val context: Context) : retrofit2.
companion object {
private const val TAG = "MerchantRepository"
private const val MERCHANTS_QUERY_LIMIT = 50
}
private val mMerchantDao: MerchantDao
private val merchantsList = mutableListOf<Merchant>()
private var merchantsSkip = 0
private val bitsyWebservice: BitsyWebservice
init {
val db = BitsyDatabase.getDatabase(context)
mMerchantDao = db!!.merchantDao()
val retrofit = Retrofit.Builder()
.baseUrl(Constants.BITSY_WEBSERVICE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
bitsyWebservice = retrofit.create<BitsyWebservice>(BitsyWebservice::class.java)
}
/** Returns a LiveData object directly from the database while the response from the WebService is obtained. */
@ -45,15 +59,8 @@ class MerchantRepository internal constructor(val context: Context) : retrofit2.
if (lastMerchantUpdate + Constants.MERCHANTS_UPDATE_PERIOD < now) {
Log.d(TAG, "Updating merchants from webservice")
// TODO make sure it works when there are more merchants than those sent back in the first response
val retrofit = Retrofit.Builder()
.baseUrl(Constants.BITSY_WEBSERVICE_URL)
.addConverterFactory(GsonConverterFactory.create())
.build()
val bitsyWebservice = retrofit.create<BitsyWebservice>(BitsyWebservice::class.java)
val call = bitsyWebservice.getMerchants(0)
call.enqueue(this)
val request = bitsyWebservice.getMerchants(merchantsSkip, MERCHANTS_QUERY_LIMIT)
request.enqueue(this)
}
}
@ -61,23 +68,29 @@ class MerchantRepository internal constructor(val context: Context) : retrofit2.
if (response.isSuccessful) {
val res: FeathersResponse<Merchant>? = response.body()
val merchants = res?.data ?: return
insertAllAsyncTask(mMerchantDao).execute(merchants)
if (merchants.isNotEmpty()) {
merchantsList.addAll(merchants)
merchantsSkip += MERCHANTS_QUERY_LIMIT
val request = bitsyWebservice.getMerchants(merchantsSkip, MERCHANTS_QUERY_LIMIT)
request.enqueue(this)
} else {
updateMerchants(merchantsList)
val now = System.currentTimeMillis()
PreferenceManager.getDefaultSharedPreferences(context).edit()
.putLong(Constants.KEY_MERCHANTS_LAST_UPDATE, now).apply()
}
}
}
override fun onFailure(call: Call<FeathersResponse<Merchant>>, t: Throwable) { /* Do nothing */ }
private class insertAllAsyncTask internal constructor(private val mAsyncTaskDao: MerchantDao) :
AsyncTask<List<Merchant>, Void, Void>() {
override fun doInBackground(vararg merchants: List<Merchant>): Void? {
mAsyncTaskDao.deleteAll()
mAsyncTaskDao.insertAll(merchants[0])
return null
private fun updateMerchants(merchants: List<Merchant>) {
AsyncTask.execute {
mMerchantDao.deleteAll()
mMerchantDao.insertAll(merchants)
}
}

View file

@ -117,7 +117,7 @@ object Constants {
const val KEY_TELLERS_LAST_UPDATE = "key_tellers_last_update"
/** Constant used to decide whether or not to update the tellers and merchants info from the webservice */
const val MERCHANTS_UPDATE_PERIOD = 1000L * 60 * 60 + 24 // 1 day
const val MERCHANTS_UPDATE_PERIOD = 1000L * 60 * 60 + 3 // 3 hours
/** Name of the external storage folder used to save files like PDF and CSV exports and Backups **/
const val EXTERNAL_STORAGE_FOLDER = "BiTSy"