| 1 |
-- ZephyrFS Authentication Database Schema |
| 2 |
|
| 3 |
-- Users table with email registration and OAuth support |
| 4 |
CREATE TABLE users ( |
| 5 |
id TEXT PRIMARY KEY, |
| 6 |
email TEXT UNIQUE NOT NULL, |
| 7 |
username TEXT UNIQUE, |
| 8 |
password_hash TEXT, |
| 9 |
user_type TEXT CHECK (user_type IN ('backup', 'volunteer', 'admin')) NOT NULL DEFAULT 'backup', |
| 10 |
email_verified BOOLEAN DEFAULT FALSE, |
| 11 |
email_verification_token TEXT, |
| 12 |
email_verification_expires_at DATETIME, |
| 13 |
password_reset_token TEXT, |
| 14 |
password_reset_expires_at DATETIME, |
| 15 |
github_id TEXT UNIQUE, |
| 16 |
github_username TEXT, |
| 17 |
github_avatar_url TEXT, |
| 18 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 19 |
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 20 |
last_login_at DATETIME, |
| 21 |
profile_data TEXT -- JSON storage for additional profile info |
| 22 |
); |
| 23 |
|
| 24 |
-- OAuth accounts table for multiple providers |
| 25 |
CREATE TABLE oauth_accounts ( |
| 26 |
id TEXT PRIMARY KEY, |
| 27 |
user_id TEXT NOT NULL, |
| 28 |
provider TEXT NOT NULL, |
| 29 |
provider_account_id TEXT NOT NULL, |
| 30 |
access_token TEXT, |
| 31 |
refresh_token TEXT, |
| 32 |
expires_at DATETIME, |
| 33 |
token_type TEXT, |
| 34 |
scope TEXT, |
| 35 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 36 |
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 37 |
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, |
| 38 |
UNIQUE(provider, provider_account_id) |
| 39 |
); |
| 40 |
|
| 41 |
-- User sessions table |
| 42 |
CREATE TABLE user_sessions ( |
| 43 |
id TEXT PRIMARY KEY, |
| 44 |
user_id TEXT NOT NULL, |
| 45 |
session_token TEXT UNIQUE NOT NULL, |
| 46 |
expires_at DATETIME NOT NULL, |
| 47 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 48 |
last_access_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 49 |
ip_address TEXT, |
| 50 |
user_agent TEXT, |
| 51 |
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE |
| 52 |
); |
| 53 |
|
| 54 |
-- Email verification attempts tracking |
| 55 |
CREATE TABLE email_verifications ( |
| 56 |
id TEXT PRIMARY KEY, |
| 57 |
user_id TEXT NOT NULL, |
| 58 |
email TEXT NOT NULL, |
| 59 |
token TEXT NOT NULL, |
| 60 |
attempts INTEGER DEFAULT 0, |
| 61 |
verified_at DATETIME, |
| 62 |
expires_at DATETIME NOT NULL, |
| 63 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 64 |
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE |
| 65 |
); |
| 66 |
|
| 67 |
-- Password reset attempts tracking |
| 68 |
CREATE TABLE password_resets ( |
| 69 |
id TEXT PRIMARY KEY, |
| 70 |
user_id TEXT NOT NULL, |
| 71 |
token TEXT NOT NULL, |
| 72 |
attempts INTEGER DEFAULT 0, |
| 73 |
used_at DATETIME, |
| 74 |
expires_at DATETIME NOT NULL, |
| 75 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 76 |
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE |
| 77 |
); |
| 78 |
|
| 79 |
-- User onboarding progress tracking |
| 80 |
CREATE TABLE user_onboarding ( |
| 81 |
id TEXT PRIMARY KEY, |
| 82 |
user_id TEXT NOT NULL, |
| 83 |
step TEXT NOT NULL, |
| 84 |
completed BOOLEAN DEFAULT FALSE, |
| 85 |
data TEXT, -- JSON storage for step-specific data |
| 86 |
completed_at DATETIME, |
| 87 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 88 |
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE |
| 89 |
); |
| 90 |
|
| 91 |
-- Desktop application sessions for seamless integration |
| 92 |
CREATE TABLE desktop_sessions ( |
| 93 |
id TEXT PRIMARY KEY, |
| 94 |
desktop_token TEXT UNIQUE NOT NULL, |
| 95 |
user_id TEXT, |
| 96 |
user_type TEXT CHECK (user_type IN ('backup', 'volunteer')), |
| 97 |
machine_id TEXT NOT NULL, |
| 98 |
app_version TEXT NOT NULL, |
| 99 |
os TEXT NOT NULL, |
| 100 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 101 |
expires_at DATETIME NOT NULL, |
| 102 |
storage_config TEXT, -- JSON storage for storage configuration |
| 103 |
last_activity DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 104 |
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE SET NULL |
| 105 |
); |
| 106 |
|
| 107 |
-- User preferences for configuration synchronization |
| 108 |
CREATE TABLE user_preferences ( |
| 109 |
id TEXT PRIMARY KEY, |
| 110 |
user_id TEXT NOT NULL, |
| 111 |
key TEXT NOT NULL, |
| 112 |
value TEXT, -- JSON storage for preference values |
| 113 |
created_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 114 |
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP, |
| 115 |
FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE, |
| 116 |
UNIQUE(user_id, key) |
| 117 |
); |
| 118 |
|
| 119 |
-- Indexes for performance |
| 120 |
CREATE INDEX idx_users_email ON users (email); |
| 121 |
CREATE INDEX idx_users_username ON users (username); |
| 122 |
CREATE INDEX idx_users_github_id ON oauth_accounts (provider_account_id); |
| 123 |
CREATE INDEX idx_sessions_token ON user_sessions (session_token); |
| 124 |
CREATE INDEX idx_sessions_user_id ON user_sessions (user_id); |
| 125 |
CREATE INDEX idx_email_verifications_token ON email_verifications (token); |
| 126 |
CREATE INDEX idx_password_resets_token ON password_resets (token); |
| 127 |
CREATE INDEX idx_desktop_sessions_token ON desktop_sessions (desktop_token); |
| 128 |
CREATE INDEX idx_desktop_sessions_user_id ON desktop_sessions (user_id); |
| 129 |
CREATE INDEX idx_desktop_sessions_machine_id ON desktop_sessions (machine_id); |
| 130 |
CREATE INDEX idx_user_preferences_user_key ON user_preferences (user_id, key); |
| 131 |
|
| 132 |
-- Insert default admin user |
| 133 |
INSERT INTO users ( |
| 134 |
id, |
| 135 |
email, |
| 136 |
username, |
| 137 |
password_hash, |
| 138 |
user_type, |
| 139 |
email_verified |
| 140 |
) VALUES ( |
| 141 |
'admin', |
| 142 |
'admin@zephyrfs.org', |
| 143 |
'admin', |
| 144 |
'$2b$10$rKGHZ0aB0qKhP0DqW8qZHu2wF2nF.FqD3tYw1pV6gB2wZ8vY0gG4u', -- 'admin' hashed |
| 145 |
'admin', |
| 146 |
TRUE |
| 147 |
); |
| 148 |
|
| 149 |
INSERT INTO users ( |
| 150 |
id, |
| 151 |
email, |
| 152 |
username, |
| 153 |
password_hash, |
| 154 |
user_type, |
| 155 |
email_verified |
| 156 |
) VALUES ( |
| 157 |
'demo', |
| 158 |
'demo@zephyrfs.org', |
| 159 |
'demo', |
| 160 |
'$2b$10$rKGHZ0aB0qKhP0DqW8qZHu2wF2nF.FqD3tYw1pV6gB2wZ8vY0gG4u', -- 'demo' hashed |
| 161 |
'backup', |
| 162 |
TRUE |
| 163 |
); |