from core.dal.base_repository import BaseRepository class LogRepository(BaseRepository): def insert(self, server_id: int, entry: dict) -> None: """entry = {timestamp, level, message}""" self._execute( """ INSERT INTO logs (server_id, timestamp, level, message) VALUES (:sid, :ts, :level, :msg) """, { "sid": server_id, "ts": entry.get("timestamp", ""), "level": entry.get("level", "info"), "msg": entry.get("message", ""), }, ) def query( self, server_id: int, limit: int = 200, offset: int = 0, level: str | None = None, since: str | None = None, search: str | None = None, ) -> tuple[int, list[dict]]: conditions = ["server_id = :sid"] params: dict = {"sid": server_id, "limit": limit, "offset": offset} if level: conditions.append("level = :level") params["level"] = level if since: conditions.append("timestamp >= :since") params["since"] = since if search: conditions.append("message LIKE :search") params["search"] = f"%{search}%" where = " AND ".join(conditions) total_row = self._fetchone(f"SELECT COUNT(*) as cnt FROM logs WHERE {where}", params) total = total_row["cnt"] if total_row else 0 rows = self._fetchall( f"SELECT * FROM logs WHERE {where} ORDER BY timestamp DESC LIMIT :limit OFFSET :offset", params, ) return total, rows def clear(self, server_id: int) -> int: result = self._execute( "DELETE FROM logs WHERE server_id = :sid", {"sid": server_id} ) return result.rowcount def cleanup_old(self, retention_days: int) -> None: self._execute( "DELETE FROM logs WHERE created_at < datetime('now', :delta)", {"delta": f"-{retention_days} days"}, )