117 lines
5.1 KiB
SQL
117 lines
5.1 KiB
SQL
-- ===========
|
|
-- Users & Plans
|
|
-- ===========
|
|
|
|
CREATE TABLE users (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
email VARCHAR(255) NOT NULL UNIQUE,
|
|
username VARCHAR(255),
|
|
hashed_password TEXT NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE plans (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL UNIQUE, -- 'Free', 'Pro', 'Enterprise'
|
|
-- Features des Plans als JSON.
|
|
features JSON NOT NULL,
|
|
stripe_price_id VARCHAR(255) UNIQUE,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- ===========
|
|
-- Tenancy (Workspaces & Members)
|
|
-- ===========
|
|
|
|
CREATE TABLE workspaces (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
owner_id INT NOT NULL,
|
|
plan_id INT NOT NULL,
|
|
subscription_status VARCHAR(255) NOT NULL, -- z.B. 'active', 'trialing'
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (owner_id) REFERENCES users(id),
|
|
FOREIGN KEY (plan_id) REFERENCES plans(id)
|
|
);
|
|
|
|
CREATE TABLE workspace_members (
|
|
user_id INT NOT NULL,
|
|
workspace_id INT NOT NULL,
|
|
role_id INT NOT NULL,
|
|
joined_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
PRIMARY KEY (user_id, workspace_id),
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (role_id) REFERENCES roles(id)
|
|
);
|
|
|
|
-- ===========
|
|
-- RBAC (Roles & Permissions)
|
|
-- ===========
|
|
|
|
CREATE TABLE roles (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL UNIQUE -- 'Workspace Owner', 'Admin', 'Developer', 'Viewer'
|
|
);
|
|
|
|
CREATE TABLE permissions (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
action VARCHAR(255) NOT NULL UNIQUE, -- 'project:create', 'route:delete', etc.
|
|
description TEXT
|
|
);
|
|
|
|
CREATE TABLE role_permissions (
|
|
role_id INT NOT NULL,
|
|
permission_id INT NOT NULL,
|
|
PRIMARY KEY (role_id, permission_id),
|
|
FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE,
|
|
FOREIGN KEY (permission_id) REFERENCES permissions(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- ===========
|
|
-- Product Logic (Projects & Routes)
|
|
-- ===========
|
|
|
|
CREATE TABLE projects (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
workspace_id INT NOT NULL,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (workspace_id) REFERENCES workspaces(id) ON DELETE CASCADE
|
|
);
|
|
|
|
CREATE TABLE routes (
|
|
id INT AUTO_INCREMENT PRIMARY KEY,
|
|
project_id INT NOT NULL,
|
|
-- Matching Rules
|
|
method VARCHAR(10) NOT NULL,
|
|
path TEXT NOT NULL,
|
|
request_body_contains TEXT,
|
|
-- Protocol Dispatcher
|
|
protocol VARCHAR(20) NOT NULL CHECK(protocol IN ('REST_JSON', 'GRAPHQL', 'RAW_BYTESTREAM', 'JSON_RPC')),
|
|
schema_definition TEXT,
|
|
-- Response Definition
|
|
response_mode VARCHAR(10) NOT NULL CHECK(response_mode IN ('STATIC', 'DYNAMIC')) DEFAULT 'STATIC',
|
|
response_script TEXT,
|
|
status_code INT NOT NULL DEFAULT 200,
|
|
-- JSON für Header und TEXT für Body
|
|
response_headers JSON,
|
|
response_body TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (project_id) REFERENCES projects(id) ON DELETE CASCADE
|
|
);
|
|
|
|
-- ===========
|
|
-- Indizes für schnelle Abfragen
|
|
-- ===========
|
|
|
|
CREATE INDEX idx_workspaces_owner_id ON workspaces(owner_id);
|
|
CREATE INDEX idx_projects_workspace_id ON projects(workspace_id);
|
|
CREATE INDEX idx_routes_project_id ON routes(project_id);
|