Add Room database, create tables and DAO for schedule
This commit is contained in:
@@ -19,8 +19,7 @@ android {
|
||||
release {
|
||||
isMinifyEnabled = false
|
||||
proguardFiles(
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"),
|
||||
"proguard-rules.pro"
|
||||
getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -40,8 +39,9 @@ dependencies {
|
||||
implementation(libs.androidx.appcompat)
|
||||
implementation(libs.material)
|
||||
|
||||
kapt(libs.hiltcompiler)
|
||||
kapt(libs.hilt.compiler)
|
||||
implementation(libs.hiltandroid)
|
||||
|
||||
implementation(project(":core:network"))
|
||||
implementation(project(":core:database"))
|
||||
}
|
||||
@@ -2,22 +2,33 @@ package ru.fincode.tsudesk.feature.schedule.data
|
||||
|
||||
import ru.fincode.tsudesk.core.network.model.NetworkResult
|
||||
import ru.fincode.tsudesk.core.network.model.map
|
||||
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleLocalDataSource
|
||||
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleRemoteDataSource
|
||||
import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleDtoToDomainMapper
|
||||
import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleCacheKey
|
||||
import ru.fincode.tsudesk.feature.schedule.data.mapper.ScheduleNetworkMapper
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.repository.ScheduleRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class ScheduleRepositoryImpl @Inject constructor(
|
||||
private val remote: ScheduleRemoteDataSource,
|
||||
private val mapper: ScheduleDtoToDomainMapper
|
||||
private val local: ScheduleLocalDataSource,
|
||||
private val mapper: ScheduleNetworkMapper
|
||||
) : ScheduleRepository {
|
||||
|
||||
override suspend fun loadScheduleByGroup(number: String): NetworkResult<ScheduleEntity> =
|
||||
remote.loadScheduleByGroup(number).map(mapper::invoke)
|
||||
|
||||
override suspend fun loadScheduleByTeacher(name: String): NetworkResult<ScheduleEntity> =
|
||||
remote.loadScheduleByTeacher(name).map(mapper::invoke)
|
||||
|
||||
}
|
||||
override suspend fun loadScheduleByGroup(number: String): NetworkResult<ScheduleEntity> {
|
||||
val result = remote.loadScheduleByGroup(number).map(mapper::invoke)
|
||||
if (result is NetworkResult.Success) {
|
||||
local.save(ScheduleCacheKey.group(number), result.data)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
override suspend fun loadScheduleByTeacher(name: String): NetworkResult<ScheduleEntity> {
|
||||
val result = remote.loadScheduleByTeacher(name).map(mapper::invoke)
|
||||
if (result is NetworkResult.Success) {
|
||||
local.save(ScheduleCacheKey.teacher(name), result.data)
|
||||
}
|
||||
return result
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,8 @@ package ru.fincode.tsudesk.feature.schedule.data.datasource
|
||||
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
|
||||
|
||||
|
||||
interface ScheduleLocalDataSource {
|
||||
suspend fun getScheduleByGroup(groupNumber: String): ScheduleEntity?
|
||||
suspend fun getScheduleByTeacher(teacherName: String): ScheduleEntity?
|
||||
suspend fun saveSchedule(entity: ScheduleEntity)
|
||||
suspend fun save(key: String, schedule: ScheduleEntity)
|
||||
suspend fun load(key: String): ScheduleEntity?
|
||||
suspend fun clear(key: String)
|
||||
}
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
package ru.fincode.tsudesk.feature.schedule.data.local;
|
||||
|
||||
public class ScheduleDaoFacade {
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package ru.fincode.tsudesk.feature.schedule.data.local
|
||||
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleDao
|
||||
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleLocalDataSource
|
||||
import ru.fincode.tsudesk.feature.schedule.data.mapper.toCache
|
||||
import ru.fincode.tsudesk.feature.schedule.data.mapper.toDomain
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
|
||||
import javax.inject.Inject
|
||||
|
||||
class ScheduleLocalDataSourceImpl @Inject constructor(
|
||||
private val dao: ScheduleDao
|
||||
) : ScheduleLocalDataSource {
|
||||
|
||||
override suspend fun save(key: String, schedule: ScheduleEntity) {
|
||||
val (scheduleCache, lessonsCache) = schedule.toCache(key)
|
||||
dao.replaceSchedule(key, scheduleCache, lessonsCache)
|
||||
}
|
||||
|
||||
override suspend fun load(key: String): ScheduleEntity? {
|
||||
val schedule = dao.getSchedule(key) ?: return null
|
||||
val lessons = dao.getLessons(key)
|
||||
return schedule.toDomain(lessons)
|
||||
}
|
||||
|
||||
override suspend fun clear(key: String) {
|
||||
dao.deleteLessonsByKey(key)
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,7 @@ import ru.fincode.tsudesk.feature.schedule.domain.model.LessonEntity
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
|
||||
import javax.inject.Inject
|
||||
|
||||
class ScheduleDtoToDomainMapper @Inject constructor() {
|
||||
class ScheduleNetworkMapper @Inject constructor() {
|
||||
|
||||
operator fun invoke(dto: ScheduleDto, meta: NetworkMeta): ScheduleEntity =
|
||||
ScheduleEntity(
|
||||
@@ -0,0 +1,59 @@
|
||||
package ru.fincode.tsudesk.feature.schedule.data.mapper
|
||||
|
||||
import ru.fincode.tsudesk.core.database.schedule.LessonCacheEntity
|
||||
import ru.fincode.tsudesk.core.database.schedule.ScheduleCacheEntity
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.LessonEntity
|
||||
import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity
|
||||
|
||||
|
||||
object ScheduleCacheKey {
|
||||
fun group(number: String) = "group:$number"
|
||||
fun teacher(name: String) = "teacher:$name"
|
||||
}
|
||||
|
||||
|
||||
fun ScheduleEntity.toCache(
|
||||
key: String
|
||||
): Pair<ScheduleCacheEntity, List<LessonCacheEntity>> {
|
||||
|
||||
val scheduleCache = ScheduleCacheEntity(
|
||||
key = key,
|
||||
timestamp = timestamp
|
||||
)
|
||||
|
||||
val lessonsCache = lessons.map { lesson ->
|
||||
LessonCacheEntity(
|
||||
scheduleKey = key,
|
||||
date = lesson.date,
|
||||
time = lesson.time,
|
||||
name = lesson.name,
|
||||
typeName = lesson.typeName,
|
||||
room = lesson.room,
|
||||
teacher = lesson.teacher,
|
||||
groupId = lesson.groupId,
|
||||
type = lesson.type
|
||||
)
|
||||
}
|
||||
|
||||
return scheduleCache to lessonsCache
|
||||
}
|
||||
|
||||
fun ScheduleCacheEntity.toDomain(
|
||||
lessons: List<LessonCacheEntity>
|
||||
): ScheduleEntity =
|
||||
ScheduleEntity(
|
||||
lessons = lessons.map { it.toDomain() },
|
||||
timestamp = timestamp
|
||||
)
|
||||
|
||||
private fun LessonCacheEntity.toDomain(): LessonEntity =
|
||||
LessonEntity(
|
||||
date = date,
|
||||
time = time,
|
||||
name = name,
|
||||
typeName = typeName,
|
||||
room = room,
|
||||
teacher = teacher,
|
||||
groupId = groupId,
|
||||
type = type
|
||||
)
|
||||
@@ -0,0 +1,20 @@
|
||||
package ru.fincode.tsudesk.feature.schedule.di
|
||||
|
||||
import dagger.Binds
|
||||
import dagger.Module
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import ru.fincode.tsudesk.feature.schedule.data.datasource.ScheduleLocalDataSource
|
||||
import ru.fincode.tsudesk.feature.schedule.data.local.ScheduleLocalDataSourceImpl
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
abstract class ScheduleLocalModule {
|
||||
|
||||
@Binds
|
||||
@Singleton
|
||||
abstract fun bindScheduleLocalDataSource(
|
||||
impl: ScheduleLocalDataSourceImpl
|
||||
): ScheduleLocalDataSource
|
||||
}
|
||||
Reference in New Issue
Block a user