login system
This commit is contained in:
@@ -54,8 +54,18 @@ def _init_db():
|
||||
duration_seconds REAL
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS users (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
username TEXT NOT NULL UNIQUE,
|
||||
password_hash TEXT NOT NULL,
|
||||
role TEXT NOT NULL,
|
||||
is_active INTEGER NOT NULL DEFAULT 1,
|
||||
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
||||
);
|
||||
|
||||
CREATE INDEX IF NOT EXISTS idx_tests_test_id ON tests (test_id);
|
||||
CREATE INDEX IF NOT EXISTS idx_tests_device ON tests (device);
|
||||
CREATE INDEX IF NOT EXISTS idx_users_username ON users (username);
|
||||
"""
|
||||
)
|
||||
|
||||
@@ -278,4 +288,64 @@ def count_tests():
|
||||
return row["n"]
|
||||
|
||||
|
||||
def get_user_by_username(username):
|
||||
with _lock:
|
||||
row = _conn.execute(
|
||||
"""
|
||||
SELECT id, username, password_hash, role, is_active, created_at
|
||||
FROM users
|
||||
WHERE username = ?
|
||||
""",
|
||||
(username,),
|
||||
).fetchone()
|
||||
return dict(row) if row else None
|
||||
|
||||
|
||||
def create_user(username, password_hash, role="viewer", is_active=1):
|
||||
with _tx():
|
||||
cursor = _conn.execute(
|
||||
"""
|
||||
INSERT INTO users (username, password_hash, role, is_active)
|
||||
VALUES (?, ?, ?, ?)
|
||||
""",
|
||||
(username, password_hash, role, is_active),
|
||||
)
|
||||
return cursor.lastrowid
|
||||
|
||||
|
||||
def count_users():
|
||||
with _lock:
|
||||
row = _conn.execute("SELECT COUNT(*) AS n FROM users").fetchone()
|
||||
return row["n"]
|
||||
|
||||
|
||||
def get_user_by_id(user_id):
|
||||
with _lock:
|
||||
row = _conn.execute(
|
||||
"""
|
||||
SELECT id, username, password_hash, role, is_active, created_at
|
||||
FROM users
|
||||
WHERE id = ?
|
||||
""",
|
||||
(user_id,),
|
||||
).fetchone()
|
||||
return dict(row) if row else None
|
||||
|
||||
|
||||
def get_all_users():
|
||||
with _lock:
|
||||
rows = _conn.execute(
|
||||
"""
|
||||
SELECT id, username, role, is_active, created_at
|
||||
FROM users
|
||||
ORDER BY username ASC
|
||||
"""
|
||||
).fetchall()
|
||||
return [dict(row) for row in rows]
|
||||
|
||||
def clear_users():
|
||||
with _tx():
|
||||
_conn.execute("DELETE FROM users")
|
||||
|
||||
|
||||
_init_db()
|
||||
|
||||
Reference in New Issue
Block a user