73 lines
2.3 KiB
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);
|