this repo has no description
1-- A very basic schema to get started. 2-- TODO: PRODUCTIONIZE BABY 3 4CREATE TABLE IF NOT EXISTS users ( 5 id UUID PRIMARY KEY DEFAULT gen_random_uuid(), 6 handle TEXT NOT NULL UNIQUE, 7 email TEXT NOT NULL UNIQUE, 8 did TEXT NOT NULL UNIQUE, 9 password_hash TEXT NOT NULL, 10 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 11 updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 12); 13 14CREATE TABLE IF NOT EXISTS invite_codes ( 15 code TEXT PRIMARY KEY, 16 available_uses INT NOT NULL DEFAULT 1, 17 created_by_user UUID NOT NULL REFERENCES users(id), 18 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 19); 20 21CREATE TABLE IF NOT EXISTS invite_code_uses ( 22 id UUID PRIMARY KEY DEFAULT gen_random_uuid(), 23 code TEXT NOT NULL REFERENCES invite_codes(code), 24 used_by_user UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, 25 used_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 26 UNIQUE(code, used_by_user) 27); 28 29-- OIII THIS TABLE CONTAINS PLAINTEXT PRIVATE KEYS, TODO: encrypt at rest! 30CREATE TABLE IF NOT EXISTS user_keys ( 31 user_id UUID PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, 32 -- Storing as raw bytes 33 -- secp256k1 is 32 bytes 34 key_bytes BYTEA NOT NULL, 35 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 36); 37 38CREATE TABLE IF NOT EXISTS repos ( 39 user_id UUID PRIMARY KEY REFERENCES users(id) ON DELETE CASCADE, 40 repo_root_cid TEXT NOT NULL, 41 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 42 updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 43); 44 45CREATE TABLE IF NOT EXISTS blocks ( 46 cid BYTEA PRIMARY KEY, 47 data BYTEA NOT NULL, 48 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 49); 50 51-- A denormalized table to quickly query for records 52-- TODO: Do I actually need this? 53CREATE TABLE IF NOT EXISTS records ( 54 id UUID PRIMARY KEY DEFAULT gen_random_uuid(), 55 repo_id UUID NOT NULL REFERENCES repos(user_id) ON DELETE CASCADE, 56 collection TEXT NOT NULL, 57 rkey TEXT NOT NULL, 58 record_cid TEXT NOT NULL, 59 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 60 UNIQUE(repo_id, collection, rkey) 61); 62 63CREATE TABLE IF NOT EXISTS blobs ( 64 cid TEXT PRIMARY KEY, 65 mime_type TEXT NOT NULL, 66 size_bytes BIGINT NOT NULL, 67 created_by_user UUID NOT NULL REFERENCES users(id), 68 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), 69 70 -- The key/path in the S3 bucket 71 storage_key TEXT NOT NULL 72); 73 74CREATE TABLE IF NOT EXISTS sessions ( 75 access_jwt TEXT PRIMARY KEY, 76 refresh_jwt TEXT NOT NULL UNIQUE, 77 did TEXT NOT NULL REFERENCES users(did) ON DELETE CASCADE, 78 created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() 79); 80