This commit is contained in:
2026-02-05 13:47:39 +03:00
commit d4d78ba52b
295 changed files with 24155 additions and 0 deletions
+233
View File
@@ -0,0 +1,233 @@
# Интеграция Supabase - Руководство
## Обзор изменений
Проект был переработан для использования Supabase вместо текущего API для получения данных о радиостанциях и категориях.
## Структура базы данных Supabase
### Таблица `Category`
```sql
CREATE TABLE Category (
id INT PRIMARY KEY,
category_name TEXT NOT NULL,
category_image TEXT,
category_status TEXT,
featured BOOLEAN,
last_update TIMESTAMP
);
```
Поля:
- `id` - ID категории (целое число)
- `category_name` - Название категории
- `category_image` - URL изображения категории (опционально)
- `category_status` - Статус категории (опционально)
- `featured` - Избранная категория (опционально)
- `last_update` - Дата последнего обновления (опционально)
### Таблица `Radio`
```sql
CREATE TABLE Radio (
id INT PRIMARY KEY,
category_id INT,
radio_name TEXT NOT NULL,
radio_image TEXT,
radio_url TEXT NOT NULL,
radio_status TEXT,
view_count INT DEFAULT 0,
featured BOOLEAN,
type TEXT,
last_update TIMESTAMP,
FOREIGN KEY (category_id) REFERENCES Category(id)
);
```
Поля:
- `id` - ID радиостанции (целое число)
- `category_id` - ID категории (внешний ключ)
- `radio_name` - Название радиостанции
- `radio_image` - URL изображения (опционально)
- `radio_url` - URL потока радиостанции
- `radio_status` - Статус радиостанции (опционально)
- `view_count` - Количество просмотров
- `featured` - Избранная станция (опционально)
- `type` - Тип радиостанции (опционально)
- `last_update` - Дата последнего обновления (опционально)
## Конфигурация подключения
**URL:** `https://emxgttrptqqaywszojxu.supabase.co`
**API Key:** `sb_publishable_J9s-q-GiOq2g3v5EHmdYrA_IzVzFLVe`
Эти параметры находятся в файле `SupabaseClient.kt`.
## Добавленные файлы
### 1. `app/src/main/java/com/yaros/RadioUrl/core/supabase/SupabaseClient.kt`
Конфигурация клиента Supabase с установленными модулями Postgrest и Realtime.
### 2. `app/src/main/java/com/yaros/RadioUrl/core/supabase/SupabaseRepository.kt`
Основной репозиторий для работы с Supabase. Содержит методы:
- `getCategories()` - получить все категории
- `getAllStations()` - получить все радиостанции
- `getStationsByCategory(categoryName)` - получить станции по категории
- `searchStations(query)` - поиск радиостанций
- `getStationById(stationId)` - получить станцию по ID
- `updateStationViews(stationId, newViews)` - обновить просмотры
- `getCategoryById(categoryId)` - получить категорию по ID
### 3. `app/src/main/java/com/yaros/RadioUrl/core/supabase/SupabaseApiRepository.kt`
Адаптер для совместимости с существующим `ApiRepository`. Преобразует данные из Supabase в формат, используемый в приложении.
Методы:
- `getHomeData()` - данные для главного экрана
- `getCategories()` - список категорий
- `getRecentRadio()` - последние радиостанции
- `getCategoryDetail(categoryId, filter)` - станции категории
- `search(query)` - поиск станций
- `searchRTL(query)` - RTL поиск
- `updateStationViews(stationId)` - обновить просмотры
## Изменённые файлы
### 1. `app/build.gradle`
Добавлены зависимости:
```gradle
// Supabase
implementation platform('io.github.jan-tennert.supabase:bom:3.0.3')
implementation 'io.github.jan-tennert.supabase:postgrest-kt'
implementation 'io.github.jan-tennert.supabase:realtime-kt'
implementation 'io.ktor:ktor-client-android:3.0.3'
implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.7.3'
```
Добавлен плагин:
```gradle
id 'org.jetbrains.kotlin.plugin.serialization' version '2.1.10'
```
### 2. Fragment файлы
Обновлены для использования `SupabaseApiRepository`:
- `HomeFragment.kt`
- `CategoriesFragment.kt`
- `CategoryStationsFragment.kt`
- `CatalogFragment.kt`
Изменения:
```kotlin
// Было:
import com.yaros.RadioUrl.core.APIInterface.ApiClient
import com.yaros.RadioUrl.core.APIInterface.ApiRepository
private val apiRepository by lazy { ApiRepository(ApiClient.apiService) }
// Стало:
import com.yaros.RadioUrl.core.supabase.SupabaseApiRepository
private val apiRepository by lazy { SupabaseApiRepository() }
```
И обновлены типы результатов:
```kotlin
// Было:
is ApiRepository.NetworkResult.Success -> { ... }
is ApiRepository.NetworkResult.Error -> { ... }
// Стало:
is SupabaseApiRepository.NetworkResult.Success -> { ... }
is SupabaseApiRepository.NetworkResult.Error -> { ... }
```
## Следующие шаги
### 1. Синхронизация Gradle
После внесения изменений необходимо синхронизировать проект с Gradle:
- В Android Studio: File → Sync Project with Gradle Files
- Или нажмите кнопку "Sync Now" в верхней части экрана
### 2. Заполнение базы данных
Необходимо заполнить таблицы `category` и `radio` в Supabase данными.
Пример для категорий:
```sql
INSERT INTO Category (id, category_name, category_image, category_status, featured, last_update) VALUES
(1, 'Rock', 'https://example.com/rock.jpg', 'active', true, NOW()),
(2, 'Pop', 'https://example.com/pop.jpg', 'active', true, NOW()),
(3, 'Jazz', 'https://example.com/jazz.jpg', 'active', false, NOW());
```
Пример для радиостанций:
```sql
INSERT INTO Radio (id, category_id, radio_name, radio_image, radio_url, radio_status, view_count, featured, type, last_update) VALUES
(1, 1, 'Rock FM', 'https://example.com/rockfm.jpg', 'http://stream.rockfm.com/live', 'active', 0, true, 'live', NOW()),
(2, 2, 'Pop Radio', 'https://example.com/popradio.jpg', 'http://stream.popradio.com/live', 'active', 0, false, 'live', NOW());
```
### 3. Настройка прав доступа в Supabase
Убедитесь, что в Supabase настроены правильные политики доступа (RLS - Row Level Security):
```sql
-- Разрешить чтение всем
CREATE POLICY "Allow public read access" ON Category FOR SELECT USING (true);
CREATE POLICY "Allow public read access" ON Radio FOR SELECT USING (true);
-- Разрешить обновление просмотров
CREATE POLICY "Allow update views" ON Radio FOR UPDATE USING (true);
```
### 4. Тестирование
После синхронизации и заполнения базы данных:
1. Запустите приложение
2. Проверьте загрузку категорий на главном экране
3. Проверьте загрузку радиостанций
4. Проверьте поиск
5. Проверьте переход в категории
## Отладка
Если возникают проблемы:
1. **Проверьте логи**: Все ошибки логируются с тегами:
- `SupabaseRepository`
- `SupabaseApiRepository`
- `HomeFragment`
- `CategoriesFragment`
- `CategoryStationsFragment`
- `CatalogFragment`
2. **Проверьте подключение к Supabase**:
- URL и API Key корректны
- Таблицы существуют
- Политики доступа настроены
3. **Проверьте структуру данных**:
- Поля в таблицах соответствуют DTO классам
- Данные в правильном формате
## Возврат к старому API (если нужно)
Если нужно вернуться к старому API, просто измените импорты обратно:
```kotlin
// В каждом Fragment:
import com.yaros.RadioUrl.core.APIInterface.ApiClient
import com.yaros.RadioUrl.core.APIInterface.ApiRepository
private val apiRepository by lazy { ApiRepository(ApiClient.apiService) }
// И верните типы результатов:
is ApiRepository.NetworkResult.Success -> { ... }
is ApiRepository.NetworkResult.Error -> { ... }
```
## Преимущества Supabase
1. **Реальное время**: Возможность подписки на изменения данных
2. **Простота**: Не нужен отдельный backend сервер
3. **Масштабируемость**: Автоматическое масштабирование
4. **Безопасность**: Встроенная аутентификация и авторизация
5. **Бесплатный план**: Достаточно для разработки и небольших проектов
## Контакты и поддержка
При возникновении вопросов обращайтесь к документации:
- [Supabase Documentation](https://supabase.com/docs)
- [Supabase Kotlin Client](https://github.com/supabase-community/supabase-kt)