Files
SoundWaveRadio/SUPABASE_INTEGRATION.md
2026-02-05 13:47:39 +03:00

234 lines
9.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Интеграция 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)