rspace-online/modules/notes/db/schema.sql

73 lines
2.3 KiB
SQL

-- rNotes module schema
CREATE SCHEMA IF NOT EXISTS rnotes;
-- Users
CREATE TABLE IF NOT EXISTS rnotes.users (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
did TEXT UNIQUE NOT NULL,
username TEXT,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Notebooks
CREATE TABLE IF NOT EXISTS rnotes.notebooks (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title TEXT NOT NULL DEFAULT 'Untitled Notebook',
slug TEXT,
description TEXT,
cover_color TEXT DEFAULT '#3b82f6',
is_public BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Notebook collaborators
CREATE TABLE IF NOT EXISTS rnotes.notebook_collaborators (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES rnotes.users(id) ON DELETE CASCADE,
notebook_id UUID NOT NULL REFERENCES rnotes.notebooks(id) ON DELETE CASCADE,
role TEXT DEFAULT 'EDITOR' CHECK (role IN ('OWNER','EDITOR','VIEWER')),
joined_at TIMESTAMPTZ DEFAULT NOW(),
UNIQUE(user_id, notebook_id)
);
-- Tags
CREATE TABLE IF NOT EXISTS rnotes.tags (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT UNIQUE NOT NULL
);
-- Notes
CREATE TABLE IF NOT EXISTS rnotes.notes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
notebook_id UUID REFERENCES rnotes.notebooks(id) ON DELETE CASCADE,
author_id UUID REFERENCES rnotes.users(id),
title TEXT NOT NULL DEFAULT 'Untitled',
content TEXT DEFAULT '',
content_plain TEXT,
type TEXT DEFAULT 'NOTE' CHECK (type IN ('NOTE','CLIP','BOOKMARK','CODE','IMAGE','FILE','AUDIO')),
url TEXT,
language TEXT,
file_url TEXT,
mime_type TEXT,
file_size INTEGER,
duration INTEGER,
is_pinned BOOLEAN DEFAULT FALSE,
sort_order INTEGER DEFAULT 0,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
-- Note tags (many-to-many)
CREATE TABLE IF NOT EXISTS rnotes.note_tags (
note_id UUID NOT NULL REFERENCES rnotes.notes(id) ON DELETE CASCADE,
tag_id UUID NOT NULL REFERENCES rnotes.tags(id) ON DELETE CASCADE,
PRIMARY KEY (note_id, tag_id)
);
-- Indexes
CREATE INDEX IF NOT EXISTS idx_notes_notebook ON rnotes.notes(notebook_id);
CREATE INDEX IF NOT EXISTS idx_notes_author ON rnotes.notes(author_id);
CREATE INDEX IF NOT EXISTS idx_notes_type ON rnotes.notes(type);
CREATE INDEX IF NOT EXISTS idx_collaborators_notebook ON rnotes.notebook_collaborators(notebook_id);