Files
postcard-api/migrations/001_initial.sql
T
2026-03-22 12:57:16 -05:00

57 lines
1.8 KiB
SQL

CREATE TABLE users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
username VARCHAR(32) UNIQUE NOT NULL,
display_name VARCHAR(64) NOT NULL,
avatar_url TEXT,
password_hash TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE conversations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
next_sequence BIGINT NOT NULL DEFAULT 0
);
CREATE TABLE conversation_participants (
conversation_id UUID REFERENCES conversations(id),
user_id UUID REFERENCES users(id),
last_read_seq BIGINT NOT NULL DEFAULT 0,
joined_at TIMESTAMPTZ NOT NULL DEFAULT now(),
PRIMARY KEY (conversation_id, user_id),
UNIQUE (conversation_id, user_id)
);
CREATE TABLE messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
conversation_id UUID REFERENCES conversations(id) NOT NULL,
sender_id UUID REFERENCES users(id) NOT NULL,
sequence BIGINT NOT NULL,
message_type VARCHAR(16) NOT NULL,
body TEXT,
media_metadata JSONB,
client_msg_id UUID NOT NULL,
status VARCHAR(16) NOT NULL DEFAULT 'sent',
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
UNIQUE (conversation_id, sequence),
UNIQUE (client_msg_id)
);
CREATE TABLE sticker_packs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name VARCHAR(64) NOT NULL,
author VARCHAR(64),
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE TABLE stickers (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
pack_id UUID REFERENCES sticker_packs(id) NOT NULL,
emoji_tag VARCHAR(8),
image_url TEXT NOT NULL,
thumbnail_url TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);