import db def list_users(): conn = db.get_conn() rows = conn.execute( """SELECT id,username,display_name,roles,status,created_at,updated_at,last_login_at FROM admin_users ORDER BY id ASC""" ).fetchall() conn.close() return rows def has_any_user() -> bool: conn = db.get_conn() row = conn.execute("SELECT 1 FROM admin_users LIMIT 1").fetchone() conn.close() return bool(row) def get_user(username: str): conn = db.get_conn() row = conn.execute("SELECT * FROM admin_users WHERE username=?", (username,)).fetchone() conn.close() return row def create_user(username: str, password_hash: str, display_name: str, roles: str, status: str = "active") -> None: conn = db.get_conn() conn.execute( """INSERT INTO admin_users(username,password_hash,display_name,roles,status) VALUES(?,?,?,?,?)""", (username, password_hash, display_name, roles, status), ) conn.commit() conn.close() def update_user_profile(username: str, display_name: str, roles: str) -> int: conn = db.get_conn() cur = conn.execute( "UPDATE admin_users SET display_name=?,roles=?,updated_at=datetime('now') WHERE username=?", (display_name, roles, username), ) conn.commit() count = cur.rowcount conn.close() return count def update_password(username: str, password_hash: str) -> int: conn = db.get_conn() cur = conn.execute( "UPDATE admin_users SET password_hash=?,updated_at=datetime('now') WHERE username=?", (password_hash, username), ) conn.commit() count = cur.rowcount conn.close() return count def count_active_super_admins() -> int: conn = db.get_conn() rows = conn.execute( "SELECT roles FROM admin_users WHERE status='active'" ).fetchall() conn.close() count = 0 for row in rows: if "super_admin" in (row["roles"] or ""): count += 1 return count def set_user_status(username: str, status: str) -> int: conn = db.get_conn() cur = conn.execute( "UPDATE admin_users SET status=?,updated_at=datetime('now') WHERE username=?", (status, username), ) conn.commit() count = cur.rowcount conn.close() return count def revoke_refresh_tokens_for_user(username: str) -> int: conn = db.get_conn() cur = conn.execute( "UPDATE admin_refresh_tokens SET revoked_at=datetime('now') WHERE username=? AND revoked_at IS NULL", (username,), ) conn.commit() count = cur.rowcount conn.close() return count def mark_login(username: str) -> None: conn = db.get_conn() conn.execute("UPDATE admin_users SET last_login_at=datetime('now') WHERE username=?", (username,)) conn.commit() conn.close() def save_refresh_token(token_id: str, username: str, token_hash: str, expires_at: str, user_agent: str, ip: str) -> None: conn = db.get_conn() conn.execute( """INSERT INTO admin_refresh_tokens(token_id,username,token_hash,expires_at,user_agent,ip) VALUES(?,?,?,?,?,?)""", (token_id, username, token_hash, expires_at, user_agent, ip), ) conn.commit() conn.close() def get_refresh_token(token_id: str): conn = db.get_conn() row = conn.execute("SELECT * FROM admin_refresh_tokens WHERE token_id=?", (token_id,)).fetchone() conn.close() return row def revoke_refresh_token(token_id: str) -> int: conn = db.get_conn() cur = conn.execute( "UPDATE admin_refresh_tokens SET revoked_at=datetime('now') WHERE token_id=? AND revoked_at IS NULL", (token_id,), ) conn.commit() count = cur.rowcount conn.close() return count