From 615e3435e35f4da7729656f788185c03db3d205c Mon Sep 17 00:00:00 2001 From: nk Date: Wed, 3 Jun 2026 18:04:35 +0300 Subject: [PATCH] =?UTF-8?q?feat(stations):=20=D0=BA=D0=BB=D0=B8=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=20=D1=81=D0=BA=D1=80=D1=8B=D0=B2=D0=B0=D0=B5=D1=82?= =?UTF-8?q?=20=D0=BE=D1=84=D1=84=D0=BB=D0=B0=D0=B9=D0=BD-=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BD=D1=86=D0=B8=D0=B8=20=D1=81=20=D0=B1=D1=8D=D0=BA?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=B0=20(=D1=81=D0=B8=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=D0=BD=D0=BE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit При обновлении каталога тянем GET /stations/offline-ids и удаляем эти станции из локальной БД. Мёртвые плитки теперь пропадают сами (бэк их метит health-check'ом), без пересборки приложения. Фолбэк на статичный enabled, если бэк недоступен. Co-Authored-By: Claude Opus 4.8 --- .../java/com/radiola/data/local/dao/StationDao.kt | 3 +++ .../java/com/radiola/data/remote/RadiolaApi.kt | 4 ++++ .../data/repository/StationRepositoryImpl.kt | 14 ++++++++++++++ 3 files changed, 21 insertions(+) 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 index 6b52ad5..336a759 100644 --- a/app/src/main/java/com/radiola/data/local/dao/StationDao.kt +++ b/app/src/main/java/com/radiola/data/local/dao/StationDao.kt @@ -23,6 +23,9 @@ interface StationDao { @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertAll(stations: List) + @Query("DELETE FROM stations WHERE id IN (:ids)") + suspend fun deleteByIds(ids: List) + @Update suspend fun update(station: StationEntity) diff --git a/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt b/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt index c1604c8..fa37d71 100644 --- a/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt +++ b/app/src/main/java/com/radiola/data/remote/RadiolaApi.kt @@ -30,6 +30,10 @@ interface RadiolaApi { @GET("now-playing") suspend fun getNowPlaying(): List + // station_id оффлайн-станций — скрываем их в каталоге (мёртвые потоки) + @GET("stations/offline-ids") + suspend fun getOfflineStationIds(): List + @GET("users/me") suspend fun getMe(): JsonObject diff --git a/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt b/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt index e857edd..5ee3d01 100644 --- a/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt +++ b/app/src/main/java/com/radiola/data/repository/StationRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.radiola.data.local.AppDatabase import com.radiola.data.local.entity.StationEntity import com.radiola.data.local.entity.TagEntity import com.radiola.data.remote.RecordApi +import com.radiola.data.remote.RadiolaApi import com.radiola.data.remote.ApiMapper.toDomain import com.radiola.domain.model.Station import com.radiola.domain.repository.StationRepository @@ -16,6 +17,7 @@ import javax.inject.Inject class StationRepositoryImpl @Inject constructor( private val api: RecordApi, + private val radiolaApi: RadiolaApi, private val db: AppDatabase, private val localDataSource: LocalStationDataSource ) : StationRepository { @@ -88,6 +90,18 @@ class StationRepositoryImpl @Inject constructor( db.stationDao().insertAll(entities) android.util.Log.d("StationRepo", "Inserted ${entities.size} stations into DB") + // 4b. Скрываем станции, которые бэкенд пометил оффлайн (мёртвые потоки). + // Если бэкенд недоступен — оставляем как есть (фолбэк на статичный enabled). + try { + val offlineIds = radiolaApi.getOfflineStationIds() + if (offlineIds.isNotEmpty()) { + db.stationDao().deleteByIds(offlineIds) + android.util.Log.d("StationRepo", "Скрыто оффлайн-станций: ${offlineIds.size}") + } + } catch (e: Exception) { + android.util.Log.w("StationRepo", "Не удалось получить offline-id: ${e.message}") + } + // 5. Update tags: group names + API tags val groupNames = localGroups.map { it.name }.filter { it.isNotBlank() } val allTags = (groupNames + apiTags).distinct().sorted()