/
Respresso
/
Partygram
Обзор
Документация
Войти
/
Respresso
/
Partygram
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/001-create-tables.sql
119 строк
6 KB
Respresso
first commit
27 июн 2025, 20:23
27 июн 2025, 20:23
240954c
Код
Авторство
О чём код?
-- Удаляем таблицу users, если она существует, так как profiles является основным источником правды DROP TABLE IF EXISTS users CASCADE; -- Таблица для профилей пользователей CREATE TABLE IF NOT EXISTS profiles ( id UUID PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE, telegram_id BIGINT UNIQUE, username TEXT UNIQUE, full_name TEXT, avatar_url TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), created_parties INTEGER DEFAULT 0, attended_parties INTEGER DEFAULT 0, average_rating NUMERIC(2, 1) DEFAULT 0.0, favorite_categories TEXT[] DEFAULT '{}' ); -- Включаем Row Level Security (RLS) ALTER TABLE profiles ENABLE ROW LEVEL SECURITY; -- Политика: пользователи могут видеть только свой профиль CREATE POLICY "Users can view their own profile" ON profiles FOR SELECT USING (auth.uid() = id); -- Политика: пользователи могут создавать свой профиль CREATE POLICY "Users can create their own profile" ON profiles FOR INSERT WITH CHECK (auth.uid() = id); -- Политика: пользователи могут обновлять свой профиль CREATE POLICY "Users can update their own profile" ON profiles FOR UPDATE USING (auth.uid() = id); -- Таблица для вечеринок CREATE TABLE IF NOT EXISTS parties ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), organizer_id UUID REFERENCES profiles(id) ON DELETE CASCADE, name TEXT NOT NULL, description TEXT, location TEXT NOT NULL, max_attendees INTEGER NOT NULL, is_public BOOLEAN DEFAULT TRUE, category TEXT, event_date DATE NOT NULL, event_time TIME WITHOUT TIME ZONE NOT NULL, current_attendees INTEGER DEFAULT 0, status TEXT DEFAULT 'open' CHECK (status IN ('open', 'full', 'completed', 'cancelled')), image_url TEXT, requires_approval BOOLEAN DEFAULT FALSE, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Включаем Row Level Security (RLS) ALTER TABLE parties ENABLE ROW LEVEL SECURITY; -- Политика: все могут видеть публичные вечеринки CREATE POLICY "Public parties are viewable by everyone" ON parties FOR SELECT USING (is_public = TRUE); -- Политика: организатор может видеть свои вечеринки CREATE POLICY "Organizer can view their own parties" ON parties FOR SELECT USING (auth.uid() = organizer_id); -- Политика: организатор может создавать вечеринки CREATE POLICY "Organizer can create parties" ON parties FOR INSERT WITH CHECK (auth.uid() = organizer_id); -- Политика: организатор может обновлять свои вечеринки CREATE POLICY "Organizer can update their own parties" ON parties FOR UPDATE USING (auth.uid() = organizer_id); -- Политика: организатор может удалять свои вечеринки CREATE POLICY "Organizer can delete their own parties" ON parties FOR DELETE USING (auth.uid() = organizer_id); -- Таблица для участников вечеринок CREATE TABLE IF NOT EXISTS party_attendees ( party_id UUID REFERENCES parties(id) ON DELETE CASCADE, profile_id UUID REFERENCES profiles(id) ON DELETE CASCADE, status TEXT DEFAULT 'pending' CHECK (status IN ('pending', 'approved', 'rejected', 'joined', 'left')), joined_at TIMESTAMPTZ DEFAULT NOW(), PRIMARY KEY (party_id, profile_id) -- Композитный первичный ключ ); -- Включаем Row Level Security (RLS) ALTER TABLE party_attendees ENABLE ROW LEVEL SECURITY; -- Политика: пользователи могут видеть свои записи на вечеринки CREATE POLICY "Users can view their own party attendance" ON party_attendees FOR SELECT USING (auth.uid() = profile_id); -- Политика: пользователи могут записываться на вечеринки CREATE POLICY "Users can join parties" ON party_attendees FOR INSERT WITH CHECK (auth.uid() = profile_id); -- Политика: пользователи могут отписываться от вечеринок CREATE POLICY "Users can leave parties" ON party_attendees FOR DELETE USING (auth.uid() = profile_id); -- Политика: организатор может управлять статусом заявок CREATE POLICY "Organizer can manage attendance status" ON party_attendees FOR UPDATE USING ( EXISTS (SELECT 1 FROM parties WHERE parties.id = party_id AND parties.organizer_id = auth.uid()) ); -- Таблица для отзывов CREATE TABLE IF NOT EXISTS reviews ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), party_id UUID REFERENCES parties(id) ON DELETE CASCADE, reviewer_id UUID REFERENCES profiles(id) ON DELETE CASCADE, rating INTEGER NOT NULL CHECK (rating >= 1 AND rating <= 5), comment TEXT, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Включаем Row Level Security (RLS) ALTER TABLE reviews ENABLE ROW LEVEL SECURITY; -- Политика: все могут видеть отзывы CREATE POLICY "Reviews are viewable by everyone" ON reviews FOR SELECT USING (TRUE); -- Политика: пользователи могут создавать отзывы CREATE POLICY "Users can create reviews" ON reviews FOR INSERT WITH CHECK (auth.uid() = reviewer_id); -- Политика: пользователи могут обновлять свои отзывы CREATE POLICY "Users can update their own reviews" ON reviews FOR UPDATE USING (auth.uid() = reviewer_id); -- Политика: пользователи могут удалять свои отзывы CREATE POLICY "Users can delete their own reviews" ON reviews FOR DELETE USING (auth.uid() = reviewer_id);