Fix no mobile devices on parent account (#1896)

This commit is contained in:
Rafał Borcz 2022-07-02 19:10:57 +02:00 committed by GitHub
parent 0f11f14c3e
commit 1b74bffc06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 2486 additions and 19 deletions

File diff suppressed because it is too large Load Diff

View File

@ -55,7 +55,7 @@ import javax.inject.Singleton
abstract class AppDatabase : RoomDatabase() { abstract class AppDatabase : RoomDatabase() {
companion object { companion object {
const val VERSION_SCHEMA = 49 const val VERSION_SCHEMA = 50
fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf( fun getMigrations(sharedPrefProvider: SharedPrefProvider, appInfo: AppInfo) = arrayOf(
Migration2(), Migration2(),
@ -102,7 +102,8 @@ abstract class AppDatabase : RoomDatabase() {
Migration43(), Migration43(),
Migration44(), Migration44(),
Migration46(), Migration46(),
Migration49() Migration49(),
Migration50()
) )
fun newInstance( fun newInstance(

View File

@ -8,6 +8,6 @@ import kotlinx.coroutines.flow.Flow
@Dao @Dao
interface MobileDeviceDao : BaseDao<MobileDevice> { interface MobileDeviceDao : BaseDao<MobileDevice> {
@Query("SELECT * FROM MobileDevices WHERE student_id = :userLoginId ORDER BY date DESC") @Query("SELECT * FROM MobileDevices WHERE user_login_id = :userLoginId ORDER BY date DESC")
fun loadAll(userLoginId: Int): Flow<List<MobileDevice>> fun loadAll(userLoginId: Int): Flow<List<MobileDevice>>
} }

View File

@ -9,7 +9,7 @@ import java.time.Instant
@Entity(tableName = "MobileDevices") @Entity(tableName = "MobileDevices")
data class MobileDevice( data class MobileDevice(
@ColumnInfo(name = "student_id") @ColumnInfo(name = "user_login_id")
val userLoginId: Int, val userLoginId: Int,
@ColumnInfo(name = "device_id") @ColumnInfo(name = "device_id")

View File

@ -0,0 +1,21 @@
package io.github.wulkanowy.data.db.migrations
import androidx.room.migration.Migration
import androidx.sqlite.db.SupportSQLiteDatabase
class Migration50 : Migration(49, 50) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("DROP TABLE IF EXISTS MobileDevices")
database.execSQL(
"""
CREATE TABLE IF NOT EXISTS `MobileDevices` (
`user_login_id` INTEGER NOT NULL,
`device_id` INTEGER NOT NULL,
`name` TEXT NOT NULL,
`date` INTEGER NOT NULL,
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL)
""".trimIndent()
)
}
}

View File

@ -1,14 +1,14 @@
package io.github.wulkanowy.data.mappers package io.github.wulkanowy.data.mappers
import io.github.wulkanowy.data.db.entities.MobileDevice import io.github.wulkanowy.data.db.entities.MobileDevice
import io.github.wulkanowy.data.db.entities.Semester import io.github.wulkanowy.data.db.entities.Student
import io.github.wulkanowy.data.pojos.MobileDeviceToken import io.github.wulkanowy.data.pojos.MobileDeviceToken
import io.github.wulkanowy.sdk.pojo.Device as SdkDevice import io.github.wulkanowy.sdk.pojo.Device as SdkDevice
import io.github.wulkanowy.sdk.pojo.Token as SdkToken import io.github.wulkanowy.sdk.pojo.Token as SdkToken
fun List<SdkDevice>.mapToEntities(semester: Semester) = map { fun List<SdkDevice>.mapToEntities(student: Student) = map {
MobileDevice( MobileDevice(
userLoginId = semester.studentId, userLoginId = student.userLoginId,
date = it.createDateZoned.toInstant(), date = it.createDateZoned.toInstant(),
deviceId = it.id, deviceId = it.id,
name = it.name name = it.name

View File

@ -39,12 +39,12 @@ class MobileDeviceRepository @Inject constructor(
val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student)) val isExpired = refreshHelper.shouldBeRefreshed(getRefreshKey(cacheKey, student))
it.isEmpty() || forceRefresh || isExpired it.isEmpty() || forceRefresh || isExpired
}, },
query = { mobileDb.loadAll(student.userLoginId.takeIf { it != 0 } ?: student.studentId) }, query = { mobileDb.loadAll(student.userLoginId) },
fetch = { fetch = {
sdk.init(student) sdk.init(student)
.switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear) .switchDiary(semester.diaryId, semester.kindergartenDiaryId, semester.schoolYear)
.getRegisteredDevices() .getRegisteredDevices()
.mapToEntities(semester) .mapToEntities(student)
}, },
saveFetchResult = { old, new -> saveFetchResult = { old, new ->
mobileDb.deleteAll(old uniqueSubtract new) mobileDb.deleteAll(old uniqueSubtract new)

View File

@ -56,8 +56,8 @@ class MobileDeviceRepositoryTest {
// prepare // prepare
coEvery { sdk.getRegisteredDevices() } returns remoteList coEvery { sdk.getRegisteredDevices() } returns remoteList
coEvery { mobileDeviceDb.loadAll(student.studentId) } returnsMany listOf( coEvery { mobileDeviceDb.loadAll(student.studentId) } returnsMany listOf(
flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(student)),
flowOf(remoteList.mapToEntities(semester)) flowOf(remoteList.mapToEntities(student))
) )
coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3)
coEvery { mobileDeviceDb.deleteAll(any()) } just Runs coEvery { mobileDeviceDb.deleteAll(any()) } just Runs
@ -79,9 +79,9 @@ class MobileDeviceRepositoryTest {
// prepare // prepare
coEvery { sdk.getRegisteredDevices() } returns remoteList coEvery { sdk.getRegisteredDevices() } returns remoteList
coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf( coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf(
flowOf(remoteList.dropLast(1).mapToEntities(semester)), flowOf(remoteList.dropLast(1).mapToEntities(student)),
flowOf(remoteList.dropLast(1).mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.dropLast(1).mapToEntities(student)), // after fetch end before save result
flowOf(remoteList.mapToEntities(semester)) flowOf(remoteList.mapToEntities(student))
) )
coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3)
coEvery { mobileDeviceDb.deleteAll(any()) } just Runs coEvery { mobileDeviceDb.deleteAll(any()) } just Runs
@ -96,7 +96,7 @@ class MobileDeviceRepositoryTest {
coVerify { mobileDeviceDb.loadAll(1) } coVerify { mobileDeviceDb.loadAll(1) }
coVerify { coVerify {
mobileDeviceDb.insertAll(match { mobileDeviceDb.insertAll(match {
it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] it.size == 1 && it[0] == remoteList.mapToEntities(student)[1]
}) })
} }
coVerify { mobileDeviceDb.deleteAll(match { it.isEmpty() }) } coVerify { mobileDeviceDb.deleteAll(match { it.isEmpty() }) }
@ -107,9 +107,9 @@ class MobileDeviceRepositoryTest {
// prepare // prepare
coEvery { sdk.getRegisteredDevices() } returns remoteList.dropLast(1) coEvery { sdk.getRegisteredDevices() } returns remoteList.dropLast(1)
coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf( coEvery { mobileDeviceDb.loadAll(1) } returnsMany listOf(
flowOf(remoteList.mapToEntities(semester)), flowOf(remoteList.mapToEntities(student)),
flowOf(remoteList.mapToEntities(semester)), // after fetch end before save result flowOf(remoteList.mapToEntities(student)), // after fetch end before save result
flowOf(remoteList.dropLast(1).mapToEntities(semester)) flowOf(remoteList.dropLast(1).mapToEntities(student))
) )
coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3) coEvery { mobileDeviceDb.insertAll(any()) } returns listOf(1, 2, 3)
coEvery { mobileDeviceDb.deleteAll(any()) } just Runs coEvery { mobileDeviceDb.deleteAll(any()) } just Runs
@ -125,7 +125,7 @@ class MobileDeviceRepositoryTest {
coVerify { mobileDeviceDb.insertAll(match { it.isEmpty() }) } coVerify { mobileDeviceDb.insertAll(match { it.isEmpty() }) }
coVerify { coVerify {
mobileDeviceDb.deleteAll(match { mobileDeviceDb.deleteAll(match {
it.size == 1 && it[0] == remoteList.mapToEntities(semester)[1] it.size == 1 && it[0] == remoteList.mapToEntities(student)[1]
}) })
} }
} }