CampFireCritics/supabase/migrations/20250705112600_update_schema.sql
degradin 067caac806 Зависимости и конфиги
Добавлены необходимые зависимости и конфигурационные файлы проекта
2025-05-07 13:29:57 +03:00

111 lines
3.4 KiB
SQL

-- Создаем таблицу users, если она не существует
CREATE TABLE IF NOT EXISTS users (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
email text UNIQUE NOT NULL,
username text UNIQUE NOT NULL,
role text NOT NULL DEFAULT 'user',
is_critic boolean DEFAULT false,
profile_picture text,
bio text,
created_at timestamptz DEFAULT now()
);
-- Создаем таблицу media, если она не существует
CREATE TABLE IF NOT EXISTS media (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
title text NOT NULL,
type text NOT NULL DEFAULT 'movie',
poster_url text,
backdrop_url text,
overview text,
release_date date,
created_at timestamptz DEFAULT now(),
created_by uuid REFERENCES users(id),
is_published boolean DEFAULT false
);
-- Создаем таблицу reviews, если она не существует
CREATE TABLE IF NOT EXISTS reviews (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
user_id uuid REFERENCES users(id),
media_id uuid REFERENCES media(id),
content text NOT NULL,
ratings jsonb NOT NULL,
created_at timestamptz DEFAULT now(),
has_spoilers boolean DEFAULT false
);
-- Создаем индексы для оптимизации запросов
CREATE INDEX IF NOT EXISTS idx_media_type ON media(type);
CREATE INDEX IF NOT EXISTS idx_media_created_by ON media(created_by);
CREATE INDEX IF NOT EXISTS idx_reviews_user_id ON reviews(user_id);
CREATE INDEX IF NOT EXISTS idx_reviews_media_id ON reviews(media_id);
-- Обновляем политики безопасности
DROP POLICY IF EXISTS "Users can read all users" ON users;
DROP POLICY IF EXISTS "Users can update own profile" ON users;
DROP POLICY IF EXISTS "Anyone can read published media" ON media;
DROP POLICY IF EXISTS "Admins and editors can manage all media" ON media;
DROP POLICY IF EXISTS "Anyone can read reviews" ON reviews;
DROP POLICY IF EXISTS "Users can create reviews" ON reviews;
DROP POLICY IF EXISTS "Users can update own reviews" ON reviews;
DROP POLICY IF EXISTS "Users can delete own reviews" ON reviews;
-- Политики для users
CREATE POLICY "Users can read all users"
ON users FOR SELECT
TO authenticated
USING (true);
CREATE POLICY "Users can update own profile"
ON users FOR UPDATE
TO authenticated
USING (auth.uid() = id);
CREATE POLICY "Users can insert own profile"
ON users FOR INSERT
TO authenticated
WITH CHECK (auth.uid() = id);
-- Политики для media
CREATE POLICY "Anyone can read published media"
ON media FOR SELECT
TO authenticated
USING (is_published = true);
CREATE POLICY "Admins and editors can manage all media"
ON media FOR ALL
TO authenticated
USING (
EXISTS (
SELECT 1 FROM users
WHERE id = auth.uid()
AND role IN ('admin', 'editor')
)
);
-- Политики для reviews
CREATE POLICY "Anyone can read reviews"
ON reviews FOR SELECT
TO authenticated
USING (true);
CREATE POLICY "Users can create reviews"
ON reviews FOR INSERT
TO authenticated
WITH CHECK (auth.uid() = user_id);
CREATE POLICY "Users can update own reviews"
ON reviews FOR UPDATE
TO authenticated
USING (auth.uid() = user_id);
CREATE POLICY "Users can delete own reviews"
ON reviews FOR DELETE
TO authenticated
USING (auth.uid() = user_id);
-- Включаем Row Level Security
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
ALTER TABLE media ENABLE ROW LEVEL SECURITY;
ALTER TABLE reviews ENABLE ROW LEVEL SECURITY;