66 lines
2.1 KiB
SQL
66 lines
2.1 KiB
SQL
-- Users table
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id TEXT PRIMARY KEY,
|
|
username TEXT UNIQUE NOT NULL,
|
|
email TEXT,
|
|
password_hash TEXT,
|
|
role TEXT NOT NULL DEFAULT 'viewer',
|
|
provider TEXT NOT NULL DEFAULT 'local',
|
|
provider_id TEXT,
|
|
created_at DATETIME NOT NULL,
|
|
last_login DATETIME,
|
|
is_active BOOLEAN NOT NULL DEFAULT true
|
|
);
|
|
|
|
-- Sessions table
|
|
CREATE TABLE IF NOT EXISTS sessions (
|
|
id TEXT PRIMARY KEY,
|
|
user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
token TEXT UNIQUE NOT NULL,
|
|
created_at DATETIME NOT NULL,
|
|
expires_at DATETIME NOT NULL,
|
|
is_active BOOLEAN NOT NULL DEFAULT true
|
|
);
|
|
|
|
-- Access rules table for path-based permissions
|
|
CREATE TABLE IF NOT EXISTS access_rules (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
path_pattern TEXT NOT NULL,
|
|
required_role TEXT NOT NULL,
|
|
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Create indexes (SQLite ignores IF NOT EXISTS for indexes, so we'll use a different approach)
|
|
CREATE INDEX IF NOT EXISTS idx_users_username ON users(username);
|
|
CREATE INDEX IF NOT EXISTS idx_users_provider ON users(provider, provider_id);
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_token ON sessions(token);
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_user_id ON sessions(user_id);
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_expires_at ON sessions(expires_at);
|
|
CREATE INDEX IF NOT EXISTS idx_access_rules_path ON access_rules(path_pattern);
|
|
|
|
-- Insert default admin user (password: admin123) - only if it doesn't exist
|
|
INSERT OR IGNORE INTO users (
|
|
id,
|
|
username,
|
|
email,
|
|
password_hash,
|
|
role,
|
|
provider,
|
|
created_at,
|
|
is_active
|
|
) VALUES (
|
|
'550e8400-e29b-41d4-a716-446655440000',
|
|
'admin',
|
|
'admin@obswiki.local',
|
|
'$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/Xh4XoKjKS6J8G7/gS',
|
|
'admin',
|
|
'local',
|
|
'2024-01-01 00:00:00',
|
|
true
|
|
);
|
|
|
|
-- Insert some default access rules - only if they don't exist
|
|
INSERT OR IGNORE INTO access_rules (id, path_pattern, required_role) VALUES
|
|
(1, 'admin/*', 'admin'),
|
|
(2, 'private/*', 'editor'),
|
|
(3, '*', 'viewer'); |