MySQL · 5220 bytes Raw Blame History
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 );