Parcourir la source

add url api for Measure
add MeasureResponse.kt
add remoteDataSource
fix repository

MrOzOn il y a 5 ans
Parent
commit
901f8ad75c

+ 15 - 17
core_api/src/main/java/com/mrozon/core_api/db/dao/MeasureDao.kt

@@ -1,6 +1,7 @@
 package com.mrozon.core_api.db.dao
 
 import androidx.room.*
+import com.mrozon.core_api.db.model.MeasureDb
 import com.mrozon.core_api.db.model.MeasureTypeDb
 import com.mrozon.core_api.db.model.PersonDb
 import kotlinx.coroutines.flow.Flow
@@ -8,22 +9,19 @@ import kotlinx.coroutines.flow.Flow
 @Dao
 interface MeasureDao {
 
-//    @Insert(onConflict = OnConflictStrategy.REPLACE)
-//    suspend fun insertAllMeasureType(persons: List<MeasureTypeDb>)
-//
-//    @Query("DELETE FROM measure_type_table")
-//    suspend fun deleteAllMeasureType()
-//
-//    @Transaction
-//    suspend fun reloadMeasureType(measureTypes: List<MeasureTypeDb>) {
-//        deleteAllMeasureType()
-//        insertAllMeasureType(measureTypes)
-//    }
-//
-//    @Query("SELECT * FROM measure_type_table")
-//    fun getMeasureTypes(): Flow<List<MeasureTypeDb>>
-//
-//    @Query("SELECT * FROM measure_type_table")
-//    fun getListMeasureTypes(): List<MeasureTypeDb>
+    @Query("SELECT * FROM measure_table WHERE measure_person=:personId AND measure_mtype=:measureTypeId ORDER BY measure_value_added LIMIT 100")
+    fun getMeasures(personId: Long, measureTypeId: Long): List<MeasureDb>
+
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
+    suspend fun insertAllMeasure(measures: List<MeasureDb>)
+
+    @Query("DELETE FROM measure_table")
+    suspend fun deleteAllMeasure()
+
+    @Transaction
+    suspend fun reloadMeasure(measures: List<MeasureDb>) {
+        deleteAllMeasure()
+        insertAllMeasure(measures)
+    }
 
 }

+ 3 - 0
core_api/src/main/java/com/mrozon/core_api/db/dao/MeasureTypeDao.kt

@@ -26,4 +26,7 @@ interface MeasureTypeDao {
     @Query("SELECT * FROM measure_type_table")
     fun getListMeasureTypes(): List<MeasureTypeDb>
 
+    @Query("SELECT * FROM measure_type_table WHERE measure_type_id=:id LIMIT 1")
+    fun getMeasureType(id: Long): MeasureTypeDb
+
 }

+ 3 - 1
core_api/src/main/java/com/mrozon/core_api/entity/Measure.kt

@@ -10,4 +10,6 @@ data class Measure (
     val comment: String,
     val personId: Long,
     val measureTypeId: Long
-)
+)
+
+typealias MeasureHistory = Triple<Person, MeasureType, List<Measure>>

+ 4 - 0
core_api/src/main/java/com/mrozon/core_api/network/HealthDiaryService.kt

@@ -35,6 +35,10 @@ interface HealthDiaryService {
     @GET("indicatortypes/")
     suspend fun getMeasureTypes(): Response<List<MeasureTypeResponse>>
 
+    @GET("indicators/")
+    suspend fun getMeasure(@Query("type") type: Long,
+                           @Query("patient") patient: Long): Response<List<MeasureResponse>>
+
 //    @GET("lego/themes/")
 //    suspend fun getThemes(@Query("page") page: Int? = null,
 //                          @Query("page_size") pageSize: Int? = null,

+ 30 - 0
core_api/src/main/java/com/mrozon/core_api/network/model/MeasureResponse.kt

@@ -0,0 +1,30 @@
+package com.mrozon.core_api.network.model
+
+import com.mrozon.core_api.entity.Measure
+import com.mrozon.utils.extension.toSimpleDate
+
+data class MeasureResponse(
+	val comments: String? = null,
+	val value2: String? = null,
+	val value1: String,
+	val patient: Int,
+	val observing: Int,
+	val id: Int,
+	val createdDate: String,
+	val valueAdded: String,
+	val type: Int,
+	val lastModified: String
+)
+
+fun MeasureResponse.toMeasure(): Measure {
+	return Measure(
+		id = id.toLong(),
+		value1 = value1,
+		value2 = value2?:"",
+		valueAdded = valueAdded.toSimpleDate(format = "yyyy-MM-dd'T'HH:mm:ss.SSXXX"), //2020-07-23T17:39:02+03:00
+		comment = comments?:"",
+		personId = patient.toLong(),
+		measureTypeId = type.toLong()
+	)
+}
+

+ 14 - 0
feature_measure/src/main/java/com/mrozon/feature_measure/data/MeasureRemoteDataSource.kt

@@ -0,0 +1,14 @@
+package com.mrozon.feature_measure.data
+
+import com.mrozon.core_api.network.HealthDiaryService
+import com.mrozon.utils.base.BaseDataSource
+import javax.inject.Inject
+
+class MeasureRemoteDataSource @Inject constructor(private val service: HealthDiaryService): BaseDataSource() {
+
+    suspend fun getMeasure(personId: Long, measureTypeId: Long)
+            = getResult {
+        service.getMeasure(measureTypeId, personId)
+    }
+
+}

+ 2 - 1
feature_measure/src/main/java/com/mrozon/feature_measure/data/MeasureRepository.kt

@@ -1,6 +1,7 @@
 package com.mrozon.feature_measure.data
 
 import com.mrozon.core_api.entity.Measure
+import com.mrozon.core_api.entity.MeasureHistory
 import com.mrozon.core_api.entity.MeasureType
 import com.mrozon.core_api.entity.Person
 import com.mrozon.utils.network.Result
@@ -10,5 +11,5 @@ interface MeasureRepository {
 
     fun loadProfilePersonAndMeasureTypes(id: Long): Flow<Result<Pair<Person,List<MeasureType>>>>
 
-    fun loadMeasure(personId: Long, measureTypeId: Long): Flow<Result<List<Measure>>>
+    fun loadMeasure(personId: Long, measureTypeId: Long): Flow<Result<MeasureHistory>>
 }

+ 32 - 3
feature_measure/src/main/java/com/mrozon/feature_measure/data/MeasureRepositoryImpl.kt

@@ -2,10 +2,13 @@ package com.mrozon.feature_measure.data
 
 import com.mrozon.core_api.db.HealthDiaryDao
 import com.mrozon.core_api.entity.Measure
+import com.mrozon.core_api.entity.MeasureHistory
 import com.mrozon.core_api.entity.MeasureType
 import com.mrozon.core_api.entity.Person
+import com.mrozon.core_api.mapper.MeasureToMeasureDbMapper
 import com.mrozon.core_api.mapper.MeasureTypeToMeasureTypeDbMapper
 import com.mrozon.core_api.mapper.PersonToPersonDbMapper
+import com.mrozon.core_api.network.model.toMeasure
 import com.mrozon.utils.network.Result
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.flow
@@ -15,8 +18,10 @@ import javax.inject.Singleton
 @Singleton
 class MeasureRepositoryImpl @Inject constructor(
     private val dao: HealthDiaryDao,
+    private val dataSource: MeasureRemoteDataSource,
     private val mapperPerson: PersonToPersonDbMapper,
-    private val mapperMeasureType: MeasureTypeToMeasureTypeDbMapper
+    private val mapperMeasureType: MeasureTypeToMeasureTypeDbMapper,
+    private val mapperMeasure: MeasureToMeasureDbMapper
 ): MeasureRepository {
 
     override fun loadProfilePersonAndMeasureTypes(id: Long): Flow<Result<Pair<Person, List<MeasureType>>>> {
@@ -33,8 +38,32 @@ class MeasureRepositoryImpl @Inject constructor(
         }
     }
 
-    override fun loadMeasure(personId: Long, measureTypeId: Long): Flow<Result<List<Measure>>> {
-        TODO("Not yet implemented")
+    override fun loadMeasure(personId: Long, measureTypeId: Long): Flow<Result<MeasureHistory>> {
+        return  flow {
+            emit(Result.loading())
+            try {
+                val person = mapperPerson.reverseMap(dao.getPerson(personId))!!
+                val measureType = mapperMeasureType.reverseMap(dao.getMeasureType(measureTypeId))!!
+                val measures = mapperMeasure.reverseMap(dao.getMeasures(personId, measureTypeId))
+                emit(Result.success(Triple(person, measureType, measures)))
+
+                val networkResult = dataSource.getMeasure(personId, measureTypeId)
+                if (networkResult.status == Result.Status.SUCCESS) {
+                    val data = networkResult.data!!
+                    val measureList = data.map { measureResponse ->
+                        measureResponse.toMeasure()
+                    }
+                    val measuresDb = mapperMeasure.map(measureList)
+                    dao.reloadMeasure(measuresDb)
+                    emit(Result.success(Triple(person, measureType, measureList)))
+                    } else if (networkResult.status == Result.Status.ERROR) {
+                        emit(Result.error(networkResult.message!!))
+                    }
+                }
+            catch (e: Exception){
+                emit(Result.error(e.message!!))
+            }
+        }
     }