136 lines
3.7 KiB
Python
136 lines
3.7 KiB
Python
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
|