"""articles 表:仅负责 SQL 读写,不含业务规则。""" from __future__ import annotations import sqlite3 from typing import Any, List, Optional, Tuple def insert_article( conn: sqlite3.Connection, title: str, body: str, content_html: Optional[str], status: str, source: str, account_id: Optional[str], error_msg: Optional[str], llm_target: Optional[str], extra_json: Optional[str], created_at: int, updated_at: int, ) -> int: cur = conn.cursor() cur.execute( """ INSERT INTO articles ( title, body, content_html, status, source, account_id, error_msg, llm_target, extra_json, created_at, updated_at ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) """, ( title, body, content_html, status, source, account_id, error_msg, llm_target, extra_json, created_at, updated_at, ), ) return int(cur.lastrowid) def update_article_body( conn: sqlite3.Connection, article_id: int, title: str, body: str, updated_at: int, ) -> None: cur = conn.cursor() cur.execute( """ UPDATE articles SET title = ?, body = ?, updated_at = ? WHERE id = ? """, (title, body, updated_at, article_id), ) def fetch_by_id(conn: sqlite3.Connection, article_id: int) -> Optional[Tuple[Any, ...]]: cur = conn.cursor() cur.execute( """ SELECT id, title, body, content_html, status, source, account_id, error_msg, llm_target, extra_json, created_at, updated_at FROM articles WHERE id = ? """, (article_id,), ) return cur.fetchone() def exists_id(conn: sqlite3.Connection, article_id: int) -> bool: cur = conn.cursor() cur.execute("SELECT id FROM articles WHERE id = ?", (article_id,)) return cur.fetchone() is not None def list_recent(conn: sqlite3.Connection, limit: int) -> List[Tuple[Any, ...]]: cur = conn.cursor() cur.execute( """ SELECT id, title, body, content_html, status, source, account_id, error_msg, llm_target, extra_json, created_at, updated_at FROM articles ORDER BY updated_at DESC, id DESC LIMIT ? """, (int(limit),), ) return list(cur.fetchall()) def delete_by_id(conn: sqlite3.Connection, article_id: int) -> int: cur = conn.cursor() cur.execute("DELETE FROM articles WHERE id = ?", (article_id,)) return int(cur.rowcount) def update_feedback( conn: sqlite3.Connection, article_id: int, status: str, account_id: Optional[str], error_msg: Optional[str], updated_at: int, ) -> None: cur = conn.cursor() cur.execute( """ UPDATE articles SET status = ?, account_id = ?, error_msg = ?, updated_at = ? WHERE id = ? """, (status, account_id, error_msg, updated_at, article_id), )