|
|
| DROP TABLE IF EXISTS room_messages CASCADE; |
| DROP TABLE IF EXISTS logs CASCADE; |
| DROP TABLE IF EXISTS codes CASCADE; |
| DROP TABLE IF EXISTS users CASCADE; |
| DROP TABLE IF EXISTS rooms CASCADE; |
|
|
|
|
| CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
| CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
|
|
| CREATE TABLE rooms ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| name VARCHAR, |
| description VARCHAR(255), |
| status INTEGER DEFAULT 1, |
| date_created TIMESTAMP DEFAULT NOW(), |
| date_last_message TIMESTAMP, |
| updated_at TIMESTAMP DEFAULT NOW(), |
| creator_id UUID |
| );
|
|
|
|
|
|
|
| CREATE TABLE users (
|
| id UUID PRIMARY KEY,
|
| email VARCHAR UNIQUE NOT NULL,
|
| token VARCHAR UNIQUE NOT NULL DEFAULT gen_random_uuid()::text,
|
| status INTEGER DEFAULT 1,
|
| fname VARCHAR NOT NULL,
|
| sname VARCHAR NOT NULL,
|
| sex INTEGER,
|
| nickname VARCHAR,
|
| birth_date DATE,
|
| photo_url VARCHAR,
|
| lang VARCHAR DEFAULT 'cs',
|
| created_at TIMESTAMP DEFAULT NOW(),
|
| updated_at TIMESTAMP DEFAULT NOW()
|
| );
|
|
|
|
|
| CREATE TABLE codes (
|
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
| code VARCHAR(5) UNIQUE NOT NULL,
|
| linked_to UUID,
|
| used INTEGER,
|
| user_id UUID,
|
| room_id UUID,
|
| pin_hash VARCHAR,
|
| session_hash VARCHAR,
|
| date_first TIMESTAMP,
|
| date_last TIMESTAMP,
|
| used_count INTEGER DEFAULT 0,
|
| created_at TIMESTAMP DEFAULT NOW()
|
| );
|
|
|
|
|
| CREATE TABLE room_messages ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| room_id UUID, |
| code_id UUID, |
| user_id UUID, |
| content TEXT NOT NULL, |
| image_url VARCHAR, |
| created_at TIMESTAMP DEFAULT NOW() |
| ); |
|
|
| |
| CREATE TABLE logs ( |
| id UUID PRIMARY KEY DEFAULT gen_random_uuid(), |
| created_at TIMESTAMP DEFAULT NOW(), |
| lang VARCHAR, |
| ip VARCHAR, |
| user_agent VARCHAR, |
| module VARCHAR, |
| operation VARCHAR, |
| data JSONB, |
| error TEXT, |
| level VARCHAR |
| ); |
|
|
| |
| CREATE INDEX idx_codes_code ON codes(code); |
| CREATE INDEX idx_codes_used ON codes(used); |
| CREATE INDEX idx_codes_room_id ON codes(room_id); |
| CREATE INDEX idx_room_messages_room_id ON room_messages(room_id); |
| CREATE INDEX idx_room_messages_created_at ON room_messages(created_at); |
| CREATE INDEX idx_users_email ON users(email); |
| CREATE INDEX idx_users_status ON users(status); |
| CREATE INDEX idx_logs_created_at ON logs(created_at); |
|
|
|
|
|
|
| ALTER TABLE users
|
| ADD CONSTRAINT fk_users_auth FOREIGN KEY (id) REFERENCES auth.users(id) ON DELETE CASCADE;
|
|
|
|
|
| ALTER TABLE codes |
| ADD CONSTRAINT fk_codes_linked_to FOREIGN KEY (linked_to) REFERENCES codes(id); |
| ALTER TABLE codes |
| ADD CONSTRAINT fk_codes_user FOREIGN KEY (user_id) REFERENCES users(id); |
| ALTER TABLE codes |
| ADD CONSTRAINT fk_codes_room FOREIGN KEY (room_id) REFERENCES rooms(id); |
|
|
| |
| ALTER TABLE rooms |
| ADD CONSTRAINT fk_rooms_creator FOREIGN KEY (creator_id) REFERENCES users(id);
|
|
|
| ALTER TABLE room_messages |
| ADD CONSTRAINT fk_room_messages_room FOREIGN KEY (room_id) REFERENCES rooms(id) ON DELETE CASCADE; |
| ALTER TABLE room_messages |
| ADD CONSTRAINT fk_room_messages_code FOREIGN KEY (code_id) REFERENCES codes(id); |
| ALTER TABLE room_messages |
| ADD CONSTRAINT fk_room_messages_user FOREIGN KEY (user_id) REFERENCES users(id); |
|
|
| |
|
|
|
|
| ALTER TABLE users ENABLE ROW LEVEL SECURITY;
|
| ALTER TABLE codes ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE rooms ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE room_messages ENABLE ROW LEVEL SECURITY; |
| ALTER TABLE logs ENABLE ROW LEVEL SECURITY; |
|
|
|
|
| DROP POLICY IF EXISTS "Users can view own profile" ON users;
|
| CREATE POLICY "Users can view own profile" ON users
|
| FOR SELECT USING (auth.uid()::text = id::text);
|
|
|
| DROP POLICY IF EXISTS "Users can insert own profile" ON users;
|
| CREATE POLICY "Users can insert own profile" ON users
|
| FOR INSERT WITH CHECK (auth.role() = 'service_role' OR auth.uid()::text = id::text);
|
|
|
| DROP POLICY IF EXISTS "Users can update own profile" ON users;
|
| CREATE POLICY "Users can update own profile" ON users
|
| FOR UPDATE USING (auth.uid()::text = id::text) WITH CHECK (auth.uid()::text = id::text);
|
|
|
| DROP POLICY IF EXISTS "Users can delete own profile" ON users;
|
| CREATE POLICY "Users can delete own profile" ON users |
| FOR DELETE USING (auth.uid()::text = id::text); |
|
|
| |
| DROP POLICY IF EXISTS "Logs service role only" ON logs; |
| CREATE POLICY "Logs service role only" ON logs |
| USING (auth.role() = 'service_role') |
| WITH CHECK (auth.role() = 'service_role'); |
|
|
| |
| |
|
|