From 110fe0795e500bc2f7cb31f249ae9818c7185b16 Mon Sep 17 00:00:00 2001 From: nk Date: Mon, 1 Jun 2026 12:12:55 +0300 Subject: [PATCH] feat(data): add Room entities, DAOs and AppDatabase --- .../com/radiola/data/local/AppDatabase.kt | 17 ++++++++++ .../com/radiola/data/local/dao/StationDao.kt | 34 +++++++++++++++++++ .../radiola/data/local/dao/TrackHistoryDao.kt | 26 ++++++++++++++ .../data/local/entity/StationEntity.kt | 17 ++++++++++ .../data/local/entity/TrackHistoryEntity.kt | 14 ++++++++ 5 files changed, 108 insertions(+) create mode 100644 app/src/main/java/com/radiola/data/local/AppDatabase.kt create mode 100644 app/src/main/java/com/radiola/data/local/dao/StationDao.kt create mode 100644 app/src/main/java/com/radiola/data/local/dao/TrackHistoryDao.kt create mode 100644 app/src/main/java/com/radiola/data/local/entity/StationEntity.kt create mode 100644 app/src/main/java/com/radiola/data/local/entity/TrackHistoryEntity.kt diff --git a/app/src/main/java/com/radiola/data/local/AppDatabase.kt b/app/src/main/java/com/radiola/data/local/AppDatabase.kt new file mode 100644 index 0000000..f38bd07 --- /dev/null +++ b/app/src/main/java/com/radiola/data/local/AppDatabase.kt @@ -0,0 +1,17 @@ +package com.radiola.data.local + +import androidx.room.Database +import androidx.room.RoomDatabase +import com.radiola.data.local.dao.StationDao +import com.radiola.data.local.dao.TrackHistoryDao +import com.radiola.data.local.entity.StationEntity +import com.radiola.data.local.entity.TrackHistoryEntity + +@Database( + entities = [StationEntity::class, TrackHistoryEntity::class], + version = 1 +) +abstract class AppDatabase : RoomDatabase() { + abstract fun stationDao(): StationDao + abstract fun trackHistoryDao(): TrackHistoryDao +} diff --git a/app/src/main/java/com/radiola/data/local/dao/StationDao.kt b/app/src/main/java/com/radiola/data/local/dao/StationDao.kt new file mode 100644 index 0000000..f3ba20a --- /dev/null +++ b/app/src/main/java/com/radiola/data/local/dao/StationDao.kt @@ -0,0 +1,34 @@ +package com.radiola.data.local.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import androidx.room.Update +import com.radiola.data.local.entity.StationEntity +import kotlinx.coroutines.flow.Flow + +@Dao +interface StationDao { + + @Query("SELECT * FROM stations ORDER BY sortOrder ASC") + fun getAll(): Flow> + + @Query("SELECT * FROM stations WHERE isFavorite = 1 ORDER BY sortOrder ASC") + fun getFavorites(): Flow> + + @Query("SELECT * FROM stations WHERE id = :id") + fun getById(id: Int): Flow + + @Insert(onConflict = OnConflictStrategy.REPLACE) + suspend fun insertAll(stations: List) + + @Update + suspend fun update(station: StationEntity) + + @Query("UPDATE stations SET isFavorite = :isFavorite WHERE id = :id") + suspend fun setFavorite(id: Int, isFavorite: Boolean) + + @Query("SELECT isFavorite FROM stations WHERE id = :id") + fun isFavorite(id: Int): Flow +} diff --git a/app/src/main/java/com/radiola/data/local/dao/TrackHistoryDao.kt b/app/src/main/java/com/radiola/data/local/dao/TrackHistoryDao.kt new file mode 100644 index 0000000..c9a99b8 --- /dev/null +++ b/app/src/main/java/com/radiola/data/local/dao/TrackHistoryDao.kt @@ -0,0 +1,26 @@ +package com.radiola.data.local.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.Query +import com.radiola.data.local.entity.TrackHistoryEntity +import kotlinx.coroutines.flow.Flow + +@Dao +interface TrackHistoryDao { + + @Query("SELECT * FROM track_history ORDER BY timestamp DESC LIMIT 200") + fun getAll(): Flow> + + @Insert + suspend fun insert(track: TrackHistoryEntity) + + @Query("DELETE FROM track_history WHERE id = :id") + suspend fun deleteById(id: Int) + + @Query("DELETE FROM track_history WHERE id NOT IN (SELECT id FROM track_history ORDER BY timestamp DESC LIMIT 200)") + suspend fun cleanupOld() + + @Query("SELECT * FROM track_history WHERE artist LIKE '%' || :query || '%' OR song LIKE '%' || :query || '%' ORDER BY timestamp DESC") + suspend fun search(query: String): List +} diff --git a/app/src/main/java/com/radiola/data/local/entity/StationEntity.kt b/app/src/main/java/com/radiola/data/local/entity/StationEntity.kt new file mode 100644 index 0000000..c61c32b --- /dev/null +++ b/app/src/main/java/com/radiola/data/local/entity/StationEntity.kt @@ -0,0 +1,17 @@ +package com.radiola.data.local.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "stations") +data class StationEntity( + @PrimaryKey val id: Int, + val name: String, + val prefix: String, + val streamUrl: String, + val coverUrl: String, + val genre: String, + val tags: String, + val sortOrder: Int, + val isFavorite: Boolean = false +) diff --git a/app/src/main/java/com/radiola/data/local/entity/TrackHistoryEntity.kt b/app/src/main/java/com/radiola/data/local/entity/TrackHistoryEntity.kt new file mode 100644 index 0000000..bb5d042 --- /dev/null +++ b/app/src/main/java/com/radiola/data/local/entity/TrackHistoryEntity.kt @@ -0,0 +1,14 @@ +package com.radiola.data.local.entity + +import androidx.room.Entity +import androidx.room.PrimaryKey + +@Entity(tableName = "track_history") +data class TrackHistoryEntity( + @PrimaryKey(autoGenerate = true) val id: Int = 0, + val artist: String, + val song: String, + val stationName: String, + val coverUrl: String?, + val timestamp: Long +)