Ver código fonte

add new entity MeasureType (also add corresponding enities for Room, Retrofit)
fot first start app automatic loads all MeasureTypes in db

MrOzOn 5 anos atrás
pai
commit
6096dc736e

+ 2 - 1
core_api/src/main/java/com/mrozon/core_api/db/HealthDiaryDao.kt

@@ -1,8 +1,9 @@
 package com.mrozon.core_api.db
 
 import androidx.room.Dao
+import com.mrozon.core_api.db.dao.MeasureTypeDao
 import com.mrozon.core_api.db.dao.PersonDao
 import com.mrozon.core_api.db.dao.UserDao
 
 @Dao
-interface HealthDiaryDao: UserDao, PersonDao
+interface HealthDiaryDao: UserDao, PersonDao, MeasureTypeDao

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

@@ -0,0 +1,22 @@
+package com.mrozon.core_api.db.dao
+
+import androidx.room.*
+import com.mrozon.core_api.db.model.MeasureTypeDb
+import com.mrozon.core_api.db.model.PersonDb
+
+@Dao
+interface MeasureTypeDao {
+
+    @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)
+    }
+
+}

+ 27 - 0
core_api/src/main/java/com/mrozon/core_api/db/model/MeasureTypeDb.kt

@@ -0,0 +1,27 @@
+package com.mrozon.core_api.db.model
+
+import androidx.room.ColumnInfo
+import androidx.room.Entity
+import androidx.room.PrimaryKey
+
+@Entity(tableName = "measure_type_table")
+data class MeasureTypeDb (
+    @PrimaryKey(autoGenerate = true)
+    @ColumnInfo(name = "measure_type_id")
+    var id: Long = 0L,
+
+    @ColumnInfo(name = "measure_type_name")
+    val name: String = "",
+
+    @ColumnInfo(name = "measure_type_mark")
+    val mark: String = "",
+
+    @ColumnInfo(name = "measure_type_regexp")
+    val regexp: String = "",
+
+    @ColumnInfo(name = "measure_type_hint")
+    val hint: String = "",
+
+    @ColumnInfo(name = "measure_type_url")
+    val url: String = ""
+)

+ 11 - 0
core_api/src/main/java/com/mrozon/core_api/entity/MeasureType.kt

@@ -0,0 +1,11 @@
+package com.mrozon.core_api.entity
+
+
+data class MeasureType (
+    val id: Long = 0L,
+    val name: String = "",
+    val mark: String = "",
+    val regexp: String = "",
+    val hint: String = "",
+    val url: String = ""
+)

+ 40 - 0
core_api/src/main/java/com/mrozon/core_api/mapper/MeasureTypeToMeasureTypeDbMapper.kt

@@ -0,0 +1,40 @@
+package com.mrozon.core_api.mapper
+
+import com.mrozon.core_api.db.model.MeasureTypeDb
+import com.mrozon.core_api.db.model.PersonDb
+import com.mrozon.core_api.entity.Gender
+import com.mrozon.core_api.entity.MeasureType
+import com.mrozon.core_api.entity.Person
+import com.mrozon.utils.base.BaseMapper
+import javax.inject.Inject
+import javax.inject.Singleton
+
+@Singleton
+class MeasureTypeToMeasureTypeDbMapper @Inject constructor(): BaseMapper<MeasureType, MeasureTypeDb>()  {
+
+    override fun map(entity: MeasureType?): MeasureTypeDb? {
+        entity?.let {
+            return MeasureTypeDb(id = it.id,
+                name = it.name,
+                hint = it.hint,
+                regexp = it.regexp,
+                url = it.url,
+                mark = it.mark
+            )
+        }
+        return null
+    }
+
+    override fun reverseMap(model: MeasureTypeDb?): MeasureType? {
+        model?.let {
+            return MeasureType(id = it.id,
+                name = it.name,
+                hint = it.hint,
+                regexp = it.regexp,
+                url = it.url,
+                mark = it.mark
+            )
+        }
+        return null
+    }
+}

+ 5 - 2
core_api/src/main/java/com/mrozon/core_api/network/HealthDiaryService.kt

@@ -6,8 +6,8 @@ import retrofit2.http.*
 
 interface HealthDiaryService {
     companion object {
-//        const val ENDPOINT = "http://10.0.2.2:8000/"
-        const val ENDPOINT = "https://hdb.mr-ozon-1982.tk/"
+        const val ENDPOINT = "http://10.0.2.2:8000/"
+//        const val ENDPOINT = "https://hdb.mr-ozon-1982.tk/"
     }
 
     @POST("login/")
@@ -32,6 +32,9 @@ interface HealthDiaryService {
     @POST("add-user-to-patient/")
     suspend fun sharePerson(@Body body: SharePersonRequest): Response<PersonResponse>
 
+    @GET("indicatortypes/")
+    suspend fun getMeasureTypes(): Response<List<MeasureTypeResponse>>
+
 //    @GET("lego/themes/")
 //    suspend fun getThemes(@Query("page") page: Int? = null,
 //                          @Query("page_size") pageSize: Int? = null,

+ 26 - 0
core_api/src/main/java/com/mrozon/core_api/network/model/MeasureTypeResponse.kt

@@ -0,0 +1,26 @@
+package com.mrozon.core_api.network.model
+
+import com.mrozon.core_api.entity.Gender
+import com.mrozon.core_api.entity.MeasureType
+import com.mrozon.core_api.entity.Person
+import com.mrozon.utils.extension.toSimpleDate
+
+data class MeasureTypeResponse(
+	val regexp: String,
+	val hint: String,
+	val name: String,
+	val id: Int,
+	val mark: String,
+	val url: String
+)
+
+fun MeasureTypeResponse.toMeasureType(): MeasureType {
+	return MeasureType(
+		id = id.toLong(),
+		name = name,
+		mark = mark,
+		hint = hint,
+		url = url,
+		regexp = regexp
+	)
+}

+ 2 - 1
core_impl/src/main/java/com/mrozon/core_impl/db/HealthDiaryDb.kt

@@ -3,8 +3,9 @@ package com.mrozon.core_impl.db
 import androidx.room.Database
 import androidx.room.RoomDatabase
 import com.mrozon.core_api.db.HealthDiaryDatabaseContract
+import com.mrozon.core_api.db.model.MeasureTypeDb
 import com.mrozon.core_api.db.model.PersonDb
 import com.mrozon.core_api.db.model.UserDb
 
-@Database(entities = [UserDb::class, PersonDb::class], version = 1)
+@Database(entities = [UserDb::class, PersonDb::class, MeasureTypeDb::class], version = 1)
 abstract class HealthDiaryDb : RoomDatabase(), HealthDiaryDatabaseContract

+ 1 - 0
feature_splash/build.gradle

@@ -50,6 +50,7 @@ dependencies {
     //Timber
     implementation timber
     implementation navigationFragment
+    implementation retrofit
 
 //    implementation 'androidx.core:core-ktx:1.3.1'
     implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'

+ 17 - 0
feature_splash/src/main/java/com/mrozon/feature_splash/data/PreloadDataRemoteDataSource.kt

@@ -0,0 +1,17 @@
+package com.mrozon.feature_splash.data
+
+import com.mrozon.core_api.db.HealthDiaryDao
+import com.mrozon.core_api.network.HealthDiaryService
+import com.mrozon.core_api.network.model.PersonRequest
+import com.mrozon.core_api.network.model.SharePersonRequest
+import com.mrozon.utils.base.BaseDataSource
+import javax.inject.Inject
+
+class PreloadDataRemoteDataSource @Inject constructor(private val service: HealthDiaryService): BaseDataSource() {
+
+    suspend fun getMeasureTypes()
+            = getResult {
+                service.getMeasureTypes()
+            }
+
+}

+ 1 - 1
feature_splash/src/main/java/com/mrozon/feature_splash/data/PreloadDataRepository.kt

@@ -7,5 +7,5 @@ import kotlinx.coroutines.flow.Flow
 
 interface PreloadDataRepository {
 
-    fun getLocalUser(): Flow<Result<User?>>
+    fun getPreloadData(): Flow<Result<User?>>
 }

+ 15 - 3
feature_splash/src/main/java/com/mrozon/feature_splash/data/PreloadDataRepositoryImp.kt

@@ -4,7 +4,9 @@ import androidx.lifecycle.LiveData
 import androidx.lifecycle.Transformations
 import com.mrozon.core_api.db.HealthDiaryDao
 import com.mrozon.core_api.entity.User
+import com.mrozon.core_api.mapper.MeasureTypeToMeasureTypeDbMapper
 import com.mrozon.core_api.mapper.UserToUserDbMapper
+import com.mrozon.core_api.network.model.toMeasureType
 import com.mrozon.core_api.network.model.toPerson
 import com.mrozon.utils.network.Result
 import kotlinx.coroutines.flow.Flow
@@ -16,12 +18,23 @@ import javax.inject.Singleton
 @Singleton
 class PreloadDataRepositoryImp @Inject constructor(
     private val dao: HealthDiaryDao,
-    private val mapper: UserToUserDbMapper
+    private val remoteDataSource: PreloadDataRemoteDataSource,
+    private val mapper: UserToUserDbMapper,
+    private val mapperMT: MeasureTypeToMeasureTypeDbMapper
 ): PreloadDataRepository {
 
-    override fun getLocalUser(): Flow<Result<User?>> {
+    override fun getPreloadData(): Flow<Result<User?>> {
         return flow {
             emit(Result.loading())
+            val networkResult = remoteDataSource.getMeasureTypes()
+            if (networkResult.status == Result.Status.SUCCESS) {
+                val data = networkResult.data!!
+                val measureTypes = data.map { measureType ->
+                    measureType.toMeasureType()
+                }
+                val measureTypesDb = mapperMT.map(measureTypes)
+                dao.reloadMeasureType(measureTypesDb)
+            }
             val query = dao.getUser()
             val userDb = query.firstOrNull()
             if(userDb==null){
@@ -29,7 +42,6 @@ class PreloadDataRepositoryImp @Inject constructor(
             }
             else
             {
-                //TODO load additional entities from network - measure types
                 emit(Result.success(mapper.reverseMap(userDb)))
             }
         }

+ 1 - 1
feature_splash/src/main/java/com/mrozon/feature_splash/presentation/SplashFragmentViewModel.kt

@@ -27,7 +27,7 @@ class SplashFragmentViewModel @Inject constructor(
 
     init {
         viewModelScope.launch(coroutineContextProvider.IO){
-            repository.getLocalUser().collect {
+            repository.getPreloadData().collect {
                 withContext(coroutineContextProvider.Main) {
                     _currentUser.value = Event(it)
                 }