-- Создаем таблицу 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;