first commit
This commit is contained in:
159
repositories/auth_repository.py
Normal file
159
repositories/auth_repository.py
Normal file
@@ -0,0 +1,159 @@
|
||||
from db import get_connection
|
||||
|
||||
|
||||
def get_user_by_username(username: str):
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT id, username, password_hash, is_active, created_at
|
||||
FROM admin_users
|
||||
WHERE username = %s
|
||||
LIMIT 1
|
||||
""",
|
||||
(username,),
|
||||
)
|
||||
return cur.fetchone()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def get_user_by_id(user_id: int):
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT id, username, password_hash, is_active, created_at
|
||||
FROM admin_users
|
||||
WHERE id = %s
|
||||
LIMIT 1
|
||||
""",
|
||||
(user_id,),
|
||||
)
|
||||
return cur.fetchone()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def create_auth_session_record(
|
||||
user_id: int,
|
||||
session_token: str,
|
||||
expires_at,
|
||||
ip_address: str | None = None,
|
||||
user_agent: str | None = None,
|
||||
):
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
INSERT INTO auth_sessions (
|
||||
user_id,
|
||||
session_token,
|
||||
last_activity_at,
|
||||
expires_at,
|
||||
ip_address,
|
||||
user_agent
|
||||
)
|
||||
VALUES (%s, %s, NOW(), %s, %s, %s)
|
||||
RETURNING id
|
||||
""",
|
||||
(user_id, session_token, expires_at, ip_address, user_agent),
|
||||
)
|
||||
row = cur.fetchone()
|
||||
conn.commit()
|
||||
return row[0] if row else None
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def get_auth_session_by_token(session_token: str):
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
SELECT
|
||||
s.id,
|
||||
s.user_id,
|
||||
s.session_token,
|
||||
s.created_at,
|
||||
s.last_activity_at,
|
||||
s.expires_at,
|
||||
s.revoked_at,
|
||||
s.ip_address,
|
||||
s.user_agent,
|
||||
u.username,
|
||||
u.is_active,
|
||||
u.role
|
||||
FROM auth_sessions s
|
||||
JOIN admin_users u ON u.id = s.user_id
|
||||
WHERE s.session_token = %s
|
||||
LIMIT 1
|
||||
""",
|
||||
(session_token,),
|
||||
)
|
||||
return cur.fetchone()
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def touch_auth_session_if_needed(session_token: str, expires_at, throttle_seconds: int = 60):
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
UPDATE auth_sessions
|
||||
SET last_activity_at = NOW(),
|
||||
expires_at = %s
|
||||
WHERE session_token = %s
|
||||
AND revoked_at IS NULL
|
||||
AND last_activity_at < NOW() - (%s || ' seconds')::interval
|
||||
""",
|
||||
(expires_at, session_token, str(throttle_seconds)),
|
||||
)
|
||||
conn.commit()
|
||||
return cur.rowcount
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def revoke_auth_session(session_token: str):
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
UPDATE auth_sessions
|
||||
SET revoked_at = NOW()
|
||||
WHERE session_token = %s
|
||||
AND revoked_at IS NULL
|
||||
""",
|
||||
(session_token,),
|
||||
)
|
||||
conn.commit()
|
||||
return cur.rowcount
|
||||
finally:
|
||||
conn.close()
|
||||
|
||||
|
||||
def revoke_all_user_sessions(user_id: int):
|
||||
conn = get_connection()
|
||||
try:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute(
|
||||
"""
|
||||
UPDATE auth_sessions
|
||||
SET revoked_at = NOW()
|
||||
WHERE user_id = %s
|
||||
AND revoked_at IS NULL
|
||||
""",
|
||||
(user_id,),
|
||||
)
|
||||
conn.commit()
|
||||
return cur.rowcount
|
||||
finally:
|
||||
conn.close()
|
||||
Reference in New Issue
Block a user