Advertisement
Guest User

Untitled

a guest
Mar 15th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 5.52 KB | None | 0 0
  1. data class DeleteRequest(
  2.     @SerializedName("obj_type") val type: Int,
  3.     @SerializedName("id") val uuid: String
  4. )
  5.  
  6. data class DeviationRequest(
  7.     @SerializedName("obj_type") val objectType: Int,
  8.     @SerializedName("id") val uuid: String,
  9.     @SerializedName("date") val timestamp: Long, //todo remove 0
  10.     @SerializedName("forecastId") val forecastId: String,
  11.     @SerializedName("measurementId") val measurementId: String,
  12.     @SerializedName("reasonIds") val reasonsIds: List<String>
  13. ) : UpdateRequest
  14.  
  15. data class GlucoseLevelRequest(
  16.     @SerializedName("obj_type") val objectType: Int,
  17.     @SerializedName("id") val uuid: String,
  18.     @SerializedName("date") val timestamp: Long,
  19.     @SerializedName("value") val value: Int,
  20.     @SerializedName("type") val type: Int
  21. ) : UpdateRequest
  22.  
  23.  
  24. data class MedicationRequest(
  25.     @SerializedName("obj_type") val objectType: Int,
  26.     @SerializedName("id") val uuid: String,
  27.     @SerializedName("date") val timestamp: Long,
  28.     @SerializedName("value") val value: Int,
  29.     @SerializedName("drugId") val drugId: String?
  30. ): UpdateRequest
  31.  
  32. data class SyncRequest(
  33.     val userId: String,
  34.     val insert: List<UpdateRequest>,
  35.     val update: List<UpdateRequest>,
  36.     val delete: List<DeleteRequest>
  37. )
  38.  
  39. interface UpdateRequest
  40.  
  41.  
  42. class SyncModel(
  43.     private val repository: RoomControlPointRepository,
  44.     private val serverApi: ServerApi
  45. ) {
  46.  
  47.     companion object {
  48.         val OBJ_TYPE_GLUCOSE = 0
  49.         val OBJ_TYPE_DEVIATION = 1
  50.         val OBJ_TYPE_MEDICATION = 2
  51.         val TYPE_MEASUREMENT = 0
  52.         val TYPE_FORECAST = 1
  53.  
  54.     }
  55.  
  56.     fun syncData(androidId: String): Completable {
  57.         return Maybe.zip(
  58.             getListForUpdate(EntityStatus.NEW),
  59.             getListForUpdate(EntityStatus.UPDATED),
  60.             getListForDelete(),
  61.             Function3 { insert: List<UpdateRequest>, update: List<UpdateRequest>, delete: List<DeleteRequest> ->
  62.                 return@Function3 SyncRequest(androidId, insert, update, delete)
  63.             })
  64.             .flatMapCompletable { serverApi.syncAllData(it) }
  65.             .andThen(finishSync())
  66.             .subscribeOn(Schedulers.io())
  67.     }
  68.  
  69.     private fun getListForUpdate(status: EntityStatus): Maybe<List<UpdateRequest>> {
  70.         val measurements = repository.getMeasurementsByStatus(status).map { measurementList ->
  71.             measurementList.map { measurement ->
  72.                 GlucoseLevelRequest(
  73.                     OBJ_TYPE_GLUCOSE,
  74.                     measurement.measurementId,
  75.                     measurement.time,
  76.                     measurement.value,
  77.                     TYPE_MEASUREMENT
  78.                 )
  79.             }
  80.         }
  81.  
  82.         val forecasts = repository.getForecastsByStatus(status)
  83.             .map { forecastList ->
  84.                 forecastList.map { forecast ->
  85.                     GlucoseLevelRequest(
  86.                         OBJ_TYPE_GLUCOSE,
  87.                         forecast.forecastId,
  88.                         forecast.time,
  89.                         forecast.value,
  90.                         TYPE_FORECAST
  91.                     )
  92.                 }
  93.             }
  94.  
  95.         val deviations = repository.getDeviationsForRequestByStatus(status, OBJ_TYPE_DEVIATION)
  96.  
  97.         val medications = repository.getMedicationsForRequest(status, OBJ_TYPE_MEDICATION)
  98.  
  99.         return Maybe.zip(
  100.             measurements,
  101.             forecasts,
  102.             deviations,
  103.             medications,
  104.             Function4 { m: List<GlucoseLevelRequest>, f: List<GlucoseLevelRequest>, d: List<DeviationRequest>, med: List<MedicationRequest> ->
  105.                 return@Function4 m.plus(f).plus(d).plus(med)
  106.             })
  107.     }
  108.  
  109.     private fun getListForDelete(): Maybe<List<DeleteRequest>> {
  110.         val measurements = repository.getMeasurementsByStatus(EntityStatus.DELETED).map { measurementList ->
  111.             measurementList.map { measurement ->
  112.                 DeleteRequest(
  113.                     OBJ_TYPE_GLUCOSE,
  114.                     measurement.measurementId
  115.                 )
  116.             }
  117.         }
  118.  
  119.         val forecasts = repository.getForecastsByStatus(EntityStatus.DELETED)
  120.             .map { forecastList ->
  121.                 forecastList.map { forecast ->
  122.                     DeleteRequest(
  123.                         OBJ_TYPE_GLUCOSE,
  124.                         forecast.forecastId
  125.                     )
  126.                 }
  127.             }
  128.  
  129.         val deviations = repository.getDeviationsByStatus(EntityStatus.DELETED)
  130.             .map { deviationList ->
  131.                 deviationList.map {
  132.                     DeleteRequest(
  133.                         OBJ_TYPE_DEVIATION,
  134.                         it.deviationId
  135.                     )
  136.                 }
  137.             }
  138.  
  139.         val medications = repository.getMedicationsForRequest(EntityStatus.DELETED, OBJ_TYPE_MEDICATION)
  140.             .map { medicationList ->
  141.                 medicationList.map {
  142.                     DeleteRequest(
  143.                         OBJ_TYPE_MEDICATION,
  144.                         it.uuid
  145.                     )
  146.                 }
  147.             }
  148.  
  149.         return Maybe.zip(
  150.             measurements,
  151.             forecasts,
  152.             deviations,
  153.             medications,
  154.             Function4 { m: List<DeleteRequest>, f: List<DeleteRequest>, d: List<DeleteRequest>, med: List<DeleteRequest> ->
  155.                 return@Function4 m.plus(f).plus(d).plus(med)
  156.             })
  157.     }
  158.  
  159.     fun finishSync(): Completable {
  160.         return repository.removeAllDeleted().andThen(repository.updateDeviationStatus())
  161.     }
  162. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement