234 lines
9.7 KiB
Markdown
234 lines
9.7 KiB
Markdown
# Интеграция 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)
|