From 49b51009877024b602be4b67aeb829af88735dc7 Mon Sep 17 00:00:00 2001 From: Shcherbatykh Oleg Date: Sat, 14 Feb 2026 13:43:21 +0300 Subject: [PATCH] code-style fix, fix db code structure --- .../tsudesk/core/database/AppDatabase.kt | 2 +- .../database/builder/AppDatabaseBuilder.kt | 15 ++++++++++ .../core/database/di/DatabaseModule.kt | 10 ++----- .../schedule/{DBConstant.kt => Constants.kt} | 4 +++ .../tsudesk/core/database/schedule/Query.kt | 13 +++++++++ .../core/database/schedule/ScheduleDao.kt | 28 +++++++------------ .../schedule/data/ScheduleRepositoryImpl.kt | 4 +-- .../datasource/ScheduleLocalDataSource.kt | 6 ++-- .../data/local/ScheduleLocalDataSourceImpl.kt | 6 ++-- .../data/mapper/ScheduleStorageMapper.kt | 8 ++++-- 10 files changed, 60 insertions(+), 36 deletions(-) create mode 100644 core/database/src/main/java/ru/fincode/tsudesk/core/database/builder/AppDatabaseBuilder.kt rename core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/{DBConstant.kt => Constants.kt} (75%) create mode 100644 core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/Query.kt diff --git a/core/database/src/main/java/ru/fincode/tsudesk/core/database/AppDatabase.kt b/core/database/src/main/java/ru/fincode/tsudesk/core/database/AppDatabase.kt index cd6336f..081d722 100644 --- a/core/database/src/main/java/ru/fincode/tsudesk/core/database/AppDatabase.kt +++ b/core/database/src/main/java/ru/fincode/tsudesk/core/database/AppDatabase.kt @@ -2,9 +2,9 @@ package ru.fincode.tsudesk.core.database import androidx.room.Database import androidx.room.RoomDatabase -import ru.fincode.tsudesk.core.database.schedule.ScheduleDao import ru.fincode.tsudesk.core.database.schedule.LessonCacheEntity import ru.fincode.tsudesk.core.database.schedule.ScheduleCacheEntity +import ru.fincode.tsudesk.core.database.schedule.ScheduleDao @Database( entities = [ diff --git a/core/database/src/main/java/ru/fincode/tsudesk/core/database/builder/AppDatabaseBuilder.kt b/core/database/src/main/java/ru/fincode/tsudesk/core/database/builder/AppDatabaseBuilder.kt new file mode 100644 index 0000000..000f536 --- /dev/null +++ b/core/database/src/main/java/ru/fincode/tsudesk/core/database/builder/AppDatabaseBuilder.kt @@ -0,0 +1,15 @@ +package ru.fincode.tsudesk.core.database.builder + +import android.content.Context +import androidx.room.Room +import ru.fincode.tsudesk.core.database.AppDatabase + +object AppDatabaseBuilder { + + private const val DB_NAME = "tsudesk.db" + + fun build(context: Context): AppDatabase = + Room.databaseBuilder(context, AppDatabase::class.java, DB_NAME) + .fallbackToDestructiveMigration() + .build() +} diff --git a/core/database/src/main/java/ru/fincode/tsudesk/core/database/di/DatabaseModule.kt b/core/database/src/main/java/ru/fincode/tsudesk/core/database/di/DatabaseModule.kt index 73455fe..9928ef7 100644 --- a/core/database/src/main/java/ru/fincode/tsudesk/core/database/di/DatabaseModule.kt +++ b/core/database/src/main/java/ru/fincode/tsudesk/core/database/di/DatabaseModule.kt @@ -1,13 +1,13 @@ package ru.fincode.tsudesk.core.database.di import android.content.Context -import androidx.room.Room import dagger.Module import dagger.Provides import dagger.hilt.InstallIn import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.components.SingletonComponent import ru.fincode.tsudesk.core.database.AppDatabase +import ru.fincode.tsudesk.core.database.builder.AppDatabaseBuilder import ru.fincode.tsudesk.core.database.schedule.ScheduleDao import javax.inject.Singleton @@ -15,16 +15,12 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) object DatabaseModule { - private const val DB_NAME = "tsudesk.db" - @Provides @Singleton fun provideAppDatabase(@ApplicationContext context: Context): AppDatabase = - Room.databaseBuilder(context, AppDatabase::class.java, DB_NAME) - .fallbackToDestructiveMigration() - .build() + AppDatabaseBuilder.build(context) @Provides - fun provideScheduleCacheDao(db: AppDatabase): ScheduleDao = + fun provideScheduleDao(db: AppDatabase): ScheduleDao = db.scheduleCacheDao() } diff --git a/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/DBConstant.kt b/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/Constants.kt similarity index 75% rename from core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/DBConstant.kt rename to core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/Constants.kt index 6c018d4..fc8e423 100644 --- a/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/DBConstant.kt +++ b/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/Constants.kt @@ -6,4 +6,8 @@ object ScheduleDbConstants { const val COL_SCHEDULE_KEY = "scheduleKey" const val COL_KEY = "key" + + const val GROUP_PRE_KEY = "group:" + const val TEACHER_PRE_KEY = "teacher:" + } diff --git a/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/Query.kt b/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/Query.kt new file mode 100644 index 0000000..ac95a90 --- /dev/null +++ b/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/Query.kt @@ -0,0 +1,13 @@ +package ru.fincode.tsudesk.core.database.schedule + +object Query { + + const val SELECT_LESSON_BY_KEY_QUERY = + "SELECT * FROM lesson_cache WHERE scheduleKey = :key" + + const val SELECT_SCHEDULE_BY_KEY_QUERY = + "SELECT * FROM schedule_cache WHERE `key` = :key LIMIT 1" + + const val DELETE_LESSON_BY_GROUP_KEY_QUERY = + "DELETE FROM lesson_cache WHERE scheduleKey = :key" +} diff --git a/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/ScheduleDao.kt b/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/ScheduleDao.kt index b5c3e2e..895b341 100644 --- a/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/ScheduleDao.kt +++ b/core/database/src/main/java/ru/fincode/tsudesk/core/database/schedule/ScheduleDao.kt @@ -6,52 +6,44 @@ import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Transaction +import ru.fincode.tsudesk.core.database.schedule.Query.DELETE_LESSON_BY_GROUP_KEY_QUERY +import ru.fincode.tsudesk.core.database.schedule.Query.SELECT_LESSON_BY_KEY_QUERY +import ru.fincode.tsudesk.core.database.schedule.Query.SELECT_SCHEDULE_BY_KEY_QUERY @Dao interface ScheduleDao { - @Insert(onConflict = OnConflictStrategy.REPLACE) + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) suspend fun upsertSchedule(schedule: ScheduleCacheEntity) - @Insert(onConflict = OnConflictStrategy.REPLACE) + @Insert(onConflict = OnConflictStrategy.Companion.REPLACE) suspend fun insertLessons(lessons: List) - - @Query("SELECT * FROM schedule_cache WHERE `key` = :key LIMIT 1") + @Query(SELECT_SCHEDULE_BY_KEY_QUERY) suspend fun getSchedule(key: String): ScheduleCacheEntity? - @Query("SELECT * FROM lesson_cache WHERE scheduleKey = :key") + @Query(SELECT_LESSON_BY_KEY_QUERY) suspend fun getLessons(key: String): List - // Bulk delete уроков по ключу — самый простой/эффективный путь в Room это @Query - @Query("DELETE FROM lesson_cache WHERE scheduleKey = :key") + @Query(DELETE_LESSON_BY_GROUP_KEY_QUERY) suspend fun deleteLessonsByKey(key: String) - // Удаление schedule_cache без SQL: типобезопасно @Delete suspend fun deleteSchedule(entity: ScheduleCacheEntity) - /** - * Обновить кэш расписания (header + lessons) атомарно. - */ @Transaction suspend fun replaceSchedule( - key: String, - schedule: ScheduleCacheEntity, - lessons: List + key: String, schedule: ScheduleCacheEntity, lessons: List ) { upsertSchedule(schedule) deleteLessonsByKey(key) insertLessons(lessons) } - /** - * Полная очистка кэша по ключу без прямого DELETE для schedule_cache. - */ @Transaction suspend fun clearSchedule(key: String) { deleteLessonsByKey(key) val header = getSchedule(key) ?: return deleteSchedule(header) } -} +} \ No newline at end of file diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt index 5fbf610..5de7a4a 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/ScheduleRepositoryImpl.kt @@ -19,7 +19,7 @@ class ScheduleRepositoryImpl @Inject constructor( override suspend fun loadScheduleByGroup(number: String): NetworkResult { val result = remote.loadScheduleByGroup(number).map(mapper::invoke) if (result is NetworkResult.Success) { - local.save(ScheduleCacheKey.group(number), result.data) + local.saveSchedule(ScheduleCacheKey.group(number), result.data) } return result } @@ -27,7 +27,7 @@ class ScheduleRepositoryImpl @Inject constructor( override suspend fun loadScheduleByTeacher(name: String): NetworkResult { val result = remote.loadScheduleByTeacher(name).map(mapper::invoke) if (result is NetworkResult.Success) { - local.save(ScheduleCacheKey.teacher(name), result.data) + local.saveSchedule(ScheduleCacheKey.teacher(name), result.data) } return result } diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/datasource/ScheduleLocalDataSource.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/datasource/ScheduleLocalDataSource.kt index 4c5b601..1c475b1 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/datasource/ScheduleLocalDataSource.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/datasource/ScheduleLocalDataSource.kt @@ -3,7 +3,7 @@ package ru.fincode.tsudesk.feature.schedule.data.datasource import ru.fincode.tsudesk.feature.schedule.domain.model.ScheduleEntity interface ScheduleLocalDataSource { - suspend fun save(key: String, schedule: ScheduleEntity) - suspend fun load(key: String): ScheduleEntity? - suspend fun clear(key: String) + suspend fun saveSchedule(key: String, schedule: ScheduleEntity) + suspend fun loadSchedule(key: String): ScheduleEntity? + suspend fun removeSchedule(key: String) } diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt index b9d9aea..3786d09 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/local/ScheduleLocalDataSourceImpl.kt @@ -11,18 +11,18 @@ class ScheduleLocalDataSourceImpl @Inject constructor( private val dao: ScheduleDao ) : ScheduleLocalDataSource { - override suspend fun save(key: String, schedule: ScheduleEntity) { + override suspend fun saveSchedule(key: String, schedule: ScheduleEntity) { val (scheduleCache, lessonsCache) = schedule.toCache(key) dao.replaceSchedule(key, scheduleCache, lessonsCache) } - override suspend fun load(key: String): ScheduleEntity? { + override suspend fun loadSchedule(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) { + override suspend fun removeSchedule(key: String) { dao.deleteLessonsByKey(key) } } diff --git a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/mapper/ScheduleStorageMapper.kt b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/mapper/ScheduleStorageMapper.kt index c26160f..3266da9 100644 --- a/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/mapper/ScheduleStorageMapper.kt +++ b/feature/schedule/src/main/java/ru/fincode/tsudesk/feature/schedule/data/mapper/ScheduleStorageMapper.kt @@ -2,13 +2,17 @@ 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.core.database.schedule.ScheduleDbConstants.GROUP_PRE_KEY +import ru.fincode.tsudesk.core.database.schedule.ScheduleDbConstants.TEACHER_PRE_KEY 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 group(number: String) = "$GROUP_PRE_KEY$number" + fun teacher(name: String) = "$TEACHER_PRE_KEY$name" }