feat(database): add schema.sql with all database tables and indexes
This commit is contained in:
@@ -0,0 +1,198 @@
|
||||
PRAGMA foreign_keys = ON;
|
||||
|
||||
-- Users table
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id TEXT PRIMARY KEY,
|
||||
email TEXT UNIQUE NOT NULL,
|
||||
password_hash TEXT NOT NULL,
|
||||
display_name TEXT NOT NULL,
|
||||
role TEXT NOT NULL DEFAULT 'planner',
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
created_at TEXT,
|
||||
updated_at TEXT
|
||||
);
|
||||
|
||||
-- Sessions table
|
||||
CREATE TABLE IF NOT EXISTS sessions (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT NOT NULL REFERENCES users(id),
|
||||
token_hash TEXT UNIQUE NOT NULL,
|
||||
expires_at TEXT NOT NULL,
|
||||
created_at TEXT,
|
||||
ip_address TEXT,
|
||||
user_agent TEXT
|
||||
);
|
||||
|
||||
-- Projects table
|
||||
CREATE TABLE IF NOT EXISTS projects (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
description TEXT,
|
||||
owner_id TEXT NOT NULL REFERENCES users(id),
|
||||
units TEXT NOT NULL DEFAULT 'mm',
|
||||
created_at TEXT NOT NULL DEFAULT datetime('now'),
|
||||
updated_at TEXT NOT NULL DEFAULT datetime('now'),
|
||||
thumbnail_path TEXT
|
||||
);
|
||||
|
||||
-- Project members table
|
||||
CREATE TABLE IF NOT EXISTS project_members (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
user_id TEXT NOT NULL REFERENCES users(id),
|
||||
role TEXT NOT NULL DEFAULT 'betrachter',
|
||||
invited_at TEXT,
|
||||
accepted_at TEXT,
|
||||
UNIQUE(project_id, user_id)
|
||||
);
|
||||
|
||||
-- Layers table
|
||||
CREATE TABLE IF NOT EXISTS layers (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
name TEXT NOT NULL,
|
||||
visible INTEGER NOT NULL DEFAULT 1,
|
||||
locked INTEGER NOT NULL DEFAULT 0,
|
||||
color TEXT,
|
||||
line_type TEXT,
|
||||
transparency REAL NOT NULL DEFAULT 0.0,
|
||||
sort_order INTEGER NOT NULL DEFAULT 0,
|
||||
created_at TEXT
|
||||
);
|
||||
|
||||
-- Elements table
|
||||
CREATE TABLE IF NOT EXISTS elements (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
layer_id TEXT REFERENCES layers(id),
|
||||
element_type TEXT NOT NULL,
|
||||
geometry TEXT NOT NULL,
|
||||
style TEXT,
|
||||
metadata TEXT,
|
||||
created_at TEXT,
|
||||
updated_at TEXT
|
||||
);
|
||||
|
||||
-- Blocks table
|
||||
CREATE TABLE IF NOT EXISTS blocks (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
name TEXT UNIQUE NOT NULL,
|
||||
base_element_ids TEXT NOT NULL,
|
||||
created_at TEXT
|
||||
);
|
||||
|
||||
-- Block instances table
|
||||
CREATE TABLE IF NOT EXISTS block_instances (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
block_id TEXT NOT NULL REFERENCES blocks(id) ON DELETE CASCADE,
|
||||
layer_id TEXT REFERENCES layers(id),
|
||||
position_x REAL NOT NULL,
|
||||
position_y REAL NOT NULL,
|
||||
rotation REAL NOT NULL DEFAULT 0.0,
|
||||
scale_x REAL NOT NULL DEFAULT 1.0,
|
||||
scale_y REAL NOT NULL DEFAULT 1.0,
|
||||
created_at TEXT
|
||||
);
|
||||
|
||||
-- Background images table
|
||||
CREATE TABLE IF NOT EXISTS background_images (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
file_path TEXT NOT NULL,
|
||||
position_x REAL NOT NULL DEFAULT 0.0,
|
||||
position_y REAL NOT NULL DEFAULT 0.0,
|
||||
scale REAL NOT NULL DEFAULT 1.0,
|
||||
rotation REAL NOT NULL DEFAULT 0.0,
|
||||
opacity REAL NOT NULL DEFAULT 1.0,
|
||||
created_at TEXT
|
||||
);
|
||||
|
||||
-- Versions table
|
||||
CREATE TABLE IF NOT EXISTS versions (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
label TEXT,
|
||||
description TEXT,
|
||||
snapshot_data BLOB NOT NULL,
|
||||
created_by TEXT REFERENCES users(id),
|
||||
created_at TEXT
|
||||
);
|
||||
|
||||
-- Plugins table
|
||||
CREATE TABLE IF NOT EXISTS plugins (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT UNIQUE NOT NULL,
|
||||
version TEXT NOT NULL,
|
||||
display_name TEXT NOT NULL,
|
||||
description TEXT,
|
||||
manifest TEXT NOT NULL,
|
||||
is_active INTEGER NOT NULL DEFAULT 0,
|
||||
installed_at TEXT,
|
||||
activated_at TEXT
|
||||
);
|
||||
|
||||
-- Settings table
|
||||
CREATE TABLE IF NOT EXISTS settings (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT REFERENCES users(id),
|
||||
key TEXT NOT NULL,
|
||||
value TEXT NOT NULL,
|
||||
updated_at TEXT,
|
||||
UNIQUE(user_id, key)
|
||||
);
|
||||
|
||||
-- AI Config table
|
||||
CREATE TABLE IF NOT EXISTS ai_config (
|
||||
id TEXT PRIMARY KEY,
|
||||
scope TEXT NOT NULL,
|
||||
project_id TEXT REFERENCES projects(id),
|
||||
api_base_url TEXT,
|
||||
api_key_encrypted TEXT,
|
||||
model TEXT NOT NULL DEFAULT 'gpt-4o',
|
||||
created_at TEXT,
|
||||
updated_at TEXT
|
||||
);
|
||||
|
||||
-- Webhooks table
|
||||
CREATE TABLE IF NOT EXISTS webhooks (
|
||||
id TEXT PRIMARY KEY,
|
||||
project_id TEXT NOT NULL REFERENCES projects(id) ON DELETE CASCADE,
|
||||
url TEXT NOT NULL,
|
||||
event TEXT NOT NULL,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
created_at TEXT
|
||||
);
|
||||
|
||||
-- Audit log table
|
||||
CREATE TABLE IF NOT EXISTS audit_log (
|
||||
id TEXT PRIMARY KEY,
|
||||
user_id TEXT REFERENCES users(id),
|
||||
project_id TEXT REFERENCES projects(id),
|
||||
action TEXT NOT NULL,
|
||||
details TEXT,
|
||||
ip_address TEXT,
|
||||
created_at TEXT
|
||||
);
|
||||
|
||||
-- Indexes
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_sessions_token_hash ON sessions(token_hash);
|
||||
CREATE INDEX IF NOT EXISTS idx_projects_owner_id ON projects(owner_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_project_members_project_id ON project_members(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_project_members_user_id ON project_members(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_layers_project_id ON layers(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_elements_project_id ON elements(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_elements_layer_id ON elements(layer_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_blocks_project_id ON blocks(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_block_instances_project_id ON block_instances(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_block_instances_block_id ON block_instances(block_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_background_images_project_id ON background_images(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_versions_project_id ON versions(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_versions_created_by ON versions(created_by);
|
||||
CREATE INDEX IF NOT EXISTS idx_settings_user_id ON settings(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_ai_config_project_id ON ai_config(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_webhooks_project_id ON webhooks(project_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_audit_log_user_id ON audit_log(user_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_audit_log_project_id ON audit_log(project_id);
|
||||
Reference in New Issue
Block a user