Files
xiaobaifupan/next/backend/features/mentor/repository.py
T

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