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

9.7 KiB
Raw Permalink Blame History

Интеграция Supabase - Руководство

Обзор изменений

Проект был переработан для использования Supabase вместо текущего API для получения данных о радиостанциях и категориях.

Структура базы данных Supabase

Таблица Category

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

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

Добавлены зависимости:

// 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'

Добавлен плагин:

id 'org.jetbrains.kotlin.plugin.serialization' version '2.1.10'

2. Fragment файлы

Обновлены для использования SupabaseApiRepository:

  • HomeFragment.kt
  • CategoriesFragment.kt
  • CategoryStationsFragment.kt
  • CatalogFragment.kt

Изменения:

// Было:
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() }

И обновлены типы результатов:

// Было:
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 данными.

Пример для категорий:

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());

Пример для радиостанций:

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):

-- Разрешить чтение всем
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, просто измените импорты обратно:

// В каждом 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. Бесплатный план: Достаточно для разработки и небольших проектов

Контакты и поддержка

При возникновении вопросов обращайтесь к документации: