101 lines
2.8 KiB
Python
101 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
import sqlite3
|
|
from typing import Any
|
|
|
|
|
|
class MentorRepository:
|
|
@staticmethod
|
|
def preferences(connection: sqlite3.Connection, user_id: int) -> dict[str, dict[str, Any]]:
|
|
return {
|
|
str(row["mentor_id"]): dict(row)
|
|
for row in connection.execute(
|
|
"SELECT * FROM mentor_preferences WHERE user_id = ?", (user_id,)
|
|
)
|
|
}
|
|
|
|
@staticmethod
|
|
def save_preferences(
|
|
connection: sqlite3.Connection,
|
|
user_id: int,
|
|
order: list[str],
|
|
pinned: set[str],
|
|
updated_at: str,
|
|
) -> None:
|
|
connection.execute("DELETE FROM mentor_preferences WHERE user_id = ?", (user_id,))
|
|
connection.executemany(
|
|
"""
|
|
INSERT INTO mentor_preferences (
|
|
user_id, mentor_id, pinned, sort_order, updated_at
|
|
) VALUES (?, ?, ?, ?, ?)
|
|
""",
|
|
(
|
|
(user_id, mentor_id, int(mentor_id in pinned), index, updated_at)
|
|
for index, mentor_id in enumerate(order)
|
|
),
|
|
)
|
|
|
|
@staticmethod
|
|
def messages(
|
|
connection: sqlite3.Connection,
|
|
user_id: int,
|
|
mentor_id: str,
|
|
trade_date: str,
|
|
limit: int = 200,
|
|
) -> tuple[sqlite3.Row, ...]:
|
|
rows = connection.execute(
|
|
"""
|
|
SELECT * FROM mentor_messages
|
|
WHERE user_id = ? AND mentor_id = ? AND trade_date = ?
|
|
ORDER BY id DESC LIMIT ?
|
|
""",
|
|
(user_id, mentor_id, trade_date, limit),
|
|
).fetchall()
|
|
return tuple(reversed(rows))
|
|
|
|
@staticmethod
|
|
def add_message(
|
|
connection: sqlite3.Connection,
|
|
*,
|
|
user_id: int,
|
|
mentor_id: str,
|
|
trade_date: str,
|
|
role: str,
|
|
content: str,
|
|
request_id: str | None,
|
|
status: str,
|
|
created_at: str,
|
|
) -> int:
|
|
cursor = connection.execute(
|
|
"""
|
|
INSERT INTO mentor_messages (
|
|
user_id, mentor_id, trade_date, role, content,
|
|
request_id, status, created_at
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
""",
|
|
(
|
|
user_id,
|
|
mentor_id,
|
|
trade_date,
|
|
role,
|
|
content,
|
|
request_id,
|
|
status,
|
|
created_at,
|
|
),
|
|
)
|
|
return int(cursor.lastrowid)
|
|
|
|
@staticmethod
|
|
def clear_messages(
|
|
connection: sqlite3.Connection, user_id: int, mentor_id: str, trade_date: str
|
|
) -> int:
|
|
cursor = connection.execute(
|
|
"""
|
|
DELETE FROM mentor_messages
|
|
WHERE user_id = ? AND mentor_id = ? AND trade_date = ?
|
|
""",
|
|
(user_id, mentor_id, trade_date),
|
|
)
|
|
return cursor.rowcount
|