diff --git a/main.py b/main.py index 03e1771..4228392 100644 --- a/main.py +++ b/main.py @@ -40,8 +40,8 @@ def get_connection(): dbname="parsed_url", user="postgres", password="qwertyqwerty123123", - host="127.0.0.1" - # host ="45.129.78.228" + # host="127.0.0.1" + host ="45.129.78.228" ) @app.post("/save_parsed_data", summary="Сохранить данные парсинга") @@ -185,8 +185,139 @@ def get_records(offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=10 if conn: conn.close() -@app.get("/records_all", summary="Получить все записи из БД + сортирует", response_model=List[ParsedData]) -def get_records(item: str = "default"): +@app.get("/records_all/count", summary="Получить общее количество записей") +def get_records_count(item: str = "default"): + """ + Возвращает общее количество записей в таблице. + """ + conn = None + try: + conn = get_connection() + with conn.cursor() as cur: + if item == "viewed": + cur.execute("SELECT COUNT(*) FROM url WHERE viewed = true") + elif item == "status": + cur.execute("SELECT COUNT(*) FROM url WHERE status = true") + else: + cur.execute("SELECT COUNT(*) FROM url") + result = cur.fetchone() + return {"count": result[0]} + except Exception as e: + raise HTTPException(status_code=500, detail=f"Ошибка при получении количества: {e}") + finally: + if conn: + conn.close() + + +# @app.get("/poisk", summary="Поиск по текстовым полям", response_model=List[ParsedData]) +# def poisk( +# query: str = Query(..., description="Строка для поиска"), +# offset: int = Query(0, ge=0), +# limit: int = Query(10, ge=1, le=500) +# ): +# """ +# Поиск по текстовым полям таблицы url (title, original_text, translation_text, short_text, url, category, other). +# Частичное совпадение без учета регистра (ILIKE). +# """ +# conn = None +# try: +# conn = get_connection() +# with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur: +# search_pattern = f"%{query}%" +# cur.execute(""" +# SELECT * FROM url +# WHERE title ILIKE %s +# OR original_text ILIKE %s +# OR translation_text ILIKE %s +# OR short_text ILIKE %s +# OR url ILIKE %s +# OR category ILIKE %s +# OR other ILIKE %s +# ORDER BY parsed_at DESC +# OFFSET %s LIMIT %s +# """, (search_pattern, search_pattern, search_pattern, search_pattern, +# search_pattern, search_pattern, search_pattern, offset, limit)) +# rows = cur.fetchall() +# results = [dict(row) for row in rows] +# return results +# except Exception as e: +# raise HTTPException(status_code=500, detail=f"Ошибка при поиске: {e}") +# finally: +# if conn: +# conn.close() + +# @app.get("/poisk/count", summary="Получить количество результатов поиска") +# def get_poisk_count(query: str): +# conn = None +# try: +# conn = get_connection() +# with conn.cursor() as cur: +# cur.execute( +# "SELECT COUNT(*) FROM url WHERE title ILIKE %s OR original_text ILIKE %s", +# (f"%{query}%", f"%{query}%") +# ) +# result = cur.fetchone() +# return {"count": result[0]} +# except Exception as e: +# raise HTTPException(status_code=500, detail=f"Ошибка при получении количества: {e}") +# finally: +# if conn: +# conn.close() +@app.get("/poisk/count", summary="Получить количество результатов поиска") +def get_poisk_count(query: str, item: str = "default"): + conn = None + try: + conn = get_connection() + with conn.cursor() as cur: + base_query = "SELECT COUNT(*) FROM url WHERE (title ILIKE %s OR original_text ILIKE %s)" + params = [f"%{query}%", f"%{query}%"] + + if item == "viewed": + base_query += " AND viewed = true" + elif item == "status": + base_query += " AND status = true" + + cur.execute(base_query, params) + result = cur.fetchone() + return {"count": result[0]} + except Exception as e: + raise HTTPException(status_code=500, detail=f"Ошибка при получении количества: {e}") + finally: + if conn: + conn.close() + +@app.get("/poisk", summary="Поиск с пагинацией") +def poisk(query: str, offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=100), item: str = "default"): + conn = None + try: + conn = get_connection() + with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur: + base_query = """ + SELECT * FROM url + WHERE (title ILIKE %s OR original_text ILIKE %s) + """ + params = [f"%{query}%", f"%{query}%"] + + if item == "viewed": + base_query += " AND viewed = true" + elif item == "status": + base_query += " AND status = true" + + base_query += " ORDER BY article_date DESC OFFSET %s LIMIT %s" + params.extend([offset, limit]) + + cur.execute(base_query, params) + rows = cur.fetchall() + results = [dict(row) for row in rows] + return results + except Exception as e: + raise HTTPException(status_code=500, detail=f"Ошибка при поиске: {e}") + finally: + if conn: + conn.close() + +@app.get("/records_all", summary="Получить все записи из БД + сортирует + пагинация", response_model=List[ParsedData]) +def get_records(item: str = "default", offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=500)): """ Возвращает записи из таблицы url с учетом. """ @@ -199,24 +330,28 @@ def get_records(item: str = "default"): cur.execute(""" SELECT * FROM url ORDER BY viewed ASC, parsed_at DESC - """) + OFFSET %s LIMIT %s + """, (offset, limit)) elif item == "viewed": cur.execute(""" SELECT * FROM url WHERE viewed = true ORDER BY article_date DESC - """) + OFFSET %s LIMIT %s + """, (offset, limit)) elif item == "status": cur.execute(""" SELECT * FROM url WHERE status = true ORDER BY parsed_at DESC - """) + OFFSET %s LIMIT %s + """, (offset, limit)) else: cur.execute(""" SELECT * FROM url ORDER BY viewed ASC, article_date DESC - """) + OFFSET %s LIMIT %s + """, (offset, limit)) rows = cur.fetchall() results = [dict(row) for row in rows] # urls = [item['parsed_at'] for item in results] @@ -226,36 +361,10 @@ def get_records(item: str = "default"): finally: if conn: conn.close() - -# @app.get("/records_all_status", summary="Получить все записи избранного", response_model=List[ParsedData]) -# def get_records(): -# """ -# Возвращает записи из таблицы url с избранным. -# """ -# conn = None -# try: -# conn = get_connection() -# with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur: -# cur.execute(""" -# SELECT * FROM url -# WHERE status -# ORDER BY parsed_at DESC -# """) -# rows = cur.fetchall() -# results = [dict(row) for row in rows] -# urls = [item['parsed_at'] for item in results] - -# print(urls) -# return results -# except Exception as e: -# raise HTTPException(status_code=500, detail=f"Ошибка при получении записей из БД: {e}") -# finally: -# if conn: -# conn.close() - -# get_records() - + # Запуск сервера для теста -# if __name__ == "__main__": -# uvicorn.run("main:app", port=8002, reload=True) +if __name__ == "__main__": + uvicorn.run("main:app", port=8002, reload=True) + +