CREATE KEYSPACE IF NOT EXISTS payphone WITH replication = { 'class': 'NetworkTopologyStrategy', 'replication_factor': 3 } AND TABLETS = { 'enabled': false }; CREATE TYPE IF NOT EXISTS payphone.message ( id BIGINT, author_id BIGINT, author_name TEXT, author_avatar_url TEXT, author_mask ASCII, content TEXT, attachments LIST, sticker BIGINT, propagation_message_id BIGINT, propagation_channel_id BIGINT, replying_to_id, is_deleted BOOLEAN, is_edited BOOLEAN, is_censored BOOLEAN, ); CREATE TABLE IF NOT EXISTS payphone.users ( user_id BIGINT PRIMARY KEY, name TEXT, email TEXT, is_masked BOOLEAN, is_moderator BOOLEAN, joined_at TIMESTAMP, last_seen_at TIMESTAMP, supporter_since TIMESTAMP, supporter_until TIMESTAMP ); CREATE TABLE IF NOT EXISTS payphone.calls ( call_id BIGINT PRIMARY KEY, channel_ids LIST, started_at TIMESTAMP, finished_at TIMESTAMP, ); CREATE TABLE IF NOT EXISTS payphone.channels ( channel_id BIGINT PRIMARY KEY, server_id BIGINT, call_id BIGINT, is_searching BOOLEAN, recently_called_server_ids LIST, webhook_id BIGINT, webhook_token TEXT ); CREATE MATERIALIZED VIEW IF NOT EXISTS payphone.searching_channels AS SELECT channel_id, server_id, is_searching, recently_called_server_ids FROM payphone.channels WHERE channel_id IS NOT NULL AND is_searching = true PRIMARY KEY (is_searching, channel_id); CREATE TABLE IF NOT EXISTS payphone.participants ( call_id BIGINT, user_id BIGINT, channel_id BIGINT, user_name TEXT, user_avatar_url TEXT, user_mask TEXT, PRIMARY KEY (call_id, user_id, channel_id) ); -- TTL 30 days. CREATE TABLE IF NOT EXISTS payphone.messages ( call_id BIGINT, message_id BIGINT, data FROZEN, PRIMARY KEY (call_id, message_id) ); CREATE TABLE IF NOT EXISTS payphone.servers ( server_id BIGINT PRIMARY KEY, name TEXT, prefix TEXT, ); CREATE TABLE IF NOT EXISTS payphone.reports ( report_id BIGINT, message FROZEN, replying_to FROZEN, created_at TIMESTAMP, reviewed_at TIMESTAMP, created_by_ids SET, reviewed_by_id BIGINT, resolution ASCII, PRIMARY KEY (message_author_id, report_id) ); CREATE TABLE IF NOT EXISTS payphone.user_incidents ( user_id BIGINT, incident_id BIGINT, -- ban, warning type ASCII, call_id BIGINT, report_id BIGINT, message FROZEN, replying_to FROZEN, reason TEXT, created_by_id BIGINT, created_at TIMESTAMP, expires_at TIMESTAMP, duration ASCII, PRIMARY KEY (user_id) ); CREATE TABLE IF NOT EXISTS payphone.server_incidents ( server_id BIGINT PRIMARY KEY, incident_id BIGINT, reason TEXT, created_by_id BIGINT, created_at TIMESTAMP, expires_at TIMESTAMP, duration ASCII );