diff --git a/main.py b/main.py index a2b7190..01e7b74 100644 --- a/main.py +++ b/main.py @@ -29,6 +29,10 @@ class ParsedData(BaseModel): article_date: str status: Optional[bool] = False viewed: Optional[bool] = False + tematik: Optional[bool] = False + svodka: Optional[bool] = False + donesenie: Optional[bool] = False + bilutene: Optional[bool] = False other: str category: str translation_text: str @@ -51,8 +55,8 @@ def save_parsed_data(data: ParsedData): conn = get_connection() with conn.cursor() as cur: cur.execute(""" - INSERT INTO url (url, parsed_at, title, original_text, article_date, status, viewed, other, category, translation_text, short_text) - VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) + INSERT INTO url (url, parsed_at, title, original_text, article_date, status, viewed, tematik, svodka, donesenie, bilutene, other, category, translation_text, short_text) + VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s) ON CONFLICT (url) DO UPDATE SET parsed_at = EXCLUDED.parsed_at, title = EXCLUDED.title, @@ -60,11 +64,15 @@ def save_parsed_data(data: ParsedData): article_date = EXCLUDED.article_date, status = EXCLUDED.status, viewed = EXCLUDED.viewed, + tematik = EXCLUDED.tematik, + svodka = EXCLUDED.svodka, + donesenie = EXCLUDED.donesenie, + bilutene = EXCLUDED.bilutene, other = EXCLUDED.other, category = EXCLUDED.category, translation_text = EXCLUDED.translation_text, short_text = EXCLUDED.short_text; - """, (data.url, data.parsed_at, data.title, data.original_text, data.article_date, data.status, data.viewed, data.other, data.category, data.translation_text, data.short_text)) + """, (data.url, data.parsed_at, data.title, data.original_text, data.article_date, data.status, data.viewed, data.tematik, data.svodka, data.donesenie, data.bilutene, data.other, data.category, data.translation_text, data.short_text)) conn.commit() return {"status": "success", "message": "Данные успешно сохранены"} except Exception as e: @@ -76,90 +84,79 @@ def save_parsed_data(data: ParsedData): conn.close() +def _update_field_by_url(field_name: str, url: str, value: bool) -> dict: + """ + Внутренняя функция для обновления любого поля в таблице url по URL. + """ + conn = None + try: + conn = get_connection() + with conn.cursor() as cursor: + cursor.execute( + f"UPDATE url SET {field_name} = %s WHERE url = %s", + (value, url) + ) + if cursor.rowcount == 0: + raise HTTPException(status_code=404, detail="Запись с указанным URL не найдена") + conn.commit() + return {"status": "success", "message": f"Поле {field_name} успешно обновлено"} + except HTTPException: + raise + except Exception as e: + if conn: + conn.rollback() + raise HTTPException(status_code=500, detail=f"Ошибка при сохранении данных: {e}") + finally: + if conn: + conn.close() + + @app.post("/update_viewed_status", summary="Обновляет поле viewed") def update_viewed_status(url: str, viewed: bool): """ Обновляет поле 'viewed' записи в БД по заданному URL. """ - conn = None - try: - conn = get_connection() - with conn.cursor() as cursor: - cursor.execute( - """ - UPDATE url - SET viewed = %s - WHERE url = %s - """, - (viewed, url) - ) - if cursor.rowcount == 0: - # Если запись не найдена - raise HTTPException(status_code=404, detail="Запись с указанным URL не найдена") - conn.commit() - except Exception as e: - if conn: - conn.rollback() - raise HTTPException(status_code=500, detail=f"Ошибка при сохранении данных: {e}") - finally: - if conn: - conn.close() + return _update_field_by_url("viewed", url, viewed) - return {"status": "success", "message": "Статус просмотра успешно обновлен"} @app.post("/update_status_status", summary="Обновляет поле status") def update_status_status(url: str, status: bool): """ Обновляет поле 'status' записи в БД по заданному URL. """ - conn = None - try: - conn = get_connection() - with conn.cursor() as cursor: - cursor.execute( - """ - UPDATE url - SET status = %s - WHERE url = %s - """, - (status, url) - ) - if cursor.rowcount == 0: - # Если запись не найдена - raise HTTPException(status_code=404, detail="Запись с указанным URL не найдена") - conn.commit() - except Exception as e: - if conn: - conn.rollback() - raise HTTPException(status_code=500, detail=f"Ошибка при сохранении данных: {e}") - finally: - if conn: - conn.close() - - return {"status": "success", "message": "Статус просмотра успешно обновлен"} + return _update_field_by_url("status", url, status) -@app.get("/check_url_exists", summary="Проверяет url") -def check_url_exists(url: str): +@app.post("/update_tematik_status", summary="Обновляет поле tematik") +def update_tematik_status(url: str, tematik: bool): """ - Проверяет, есть ли указанный URL в базе данных. - Возвращает true, если есть, иначе false. + Обновляет поле 'tematik' записи в БД по заданному URL. """ - conn = None - try: - conn = get_connection() - with conn.cursor() as cursor: - cursor.execute( - "SELECT 1 FROM url WHERE url = %s LIMIT 1", - (url,) - ) - result = cursor.fetchone() - return {"exists": bool(result)} - except Exception as e: - raise HTTPException(status_code=500, detail=f"Ошибка при проверке: {e}") - finally: - if conn: - conn.close() + return _update_field_by_url("tematik", url, tematik) + + +@app.post("/update_svodka_status", summary="Обновляет поле svodka") +def update_svodka_status(url: str, svodka: bool): + """ + Обновляет поле 'svodka' записи в БД по заданному URL. + """ + return _update_field_by_url("svodka", url, svodka) + + +@app.post("/update_donesenie_status", summary="Обновляет поле donesenie") +def update_donesenie_status(url: str, donesenie: bool): + """ + Обновляет поле 'donesenie' записи в БД по заданному URL. + """ + return _update_field_by_url("donesenie", url, donesenie) + + +@app.post("/update_bilutene_status", summary="Обновляет поле bilutene") +def update_bilutene_status(url: str, bilutene: bool): + """ + Обновляет поле 'bilutene' записи в БД по заданному URL. + """ + return _update_field_by_url("bilutene", url, bilutene) @app.get("/records", summary="Получить записи из БД с пагинацией", response_model=List[ParsedData]) def get_records(offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=100)): @@ -171,7 +168,7 @@ def get_records(offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, le=10 conn = get_connection() with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cur: cur.execute(""" - SELECT url, parsed_at, title, original_text, article_date, status, viewed, other, category, translation_text, short_text + SELECT url, parsed_at, title, original_text, article_date, status, viewed, tematik, svodka, donesenie, bilutene, other, category, translation_text, short_text FROM url ORDER BY parsed_at DESC NULLS LAST OFFSET %s LIMIT %s @@ -198,6 +195,16 @@ def get_records_count(item: str = "default"): cur.execute("SELECT COUNT(*) FROM url WHERE viewed = true") elif item == "status": cur.execute("SELECT COUNT(*) FROM url WHERE status = true") + elif item == "tematik": + cur.execute("SELECT COUNT(*) FROM url WHERE tematik = true") + elif item == "svodka": + cur.execute("SELECT COUNT(*) FROM url WHERE svodka = true") + elif item == "donesenie": + cur.execute("SELECT COUNT(*) FROM url WHERE donesenie = true") + elif item == "bilutene": + cur.execute("SELECT COUNT(*) FROM url WHERE bilutene = true") + elif item == "status": + cur.execute("SELECT COUNT(*) FROM url WHERE status = true") elif item == "time": cur.execute("SELECT COUNT(*) FROM url") else: @@ -226,7 +233,15 @@ def get_poisk_count(query: str, item: str = "default"): if item == "viewed": base_query += " AND viewed = true" elif item == "status": - base_query += " AND status = true" + base_query += " AND status = true" + elif item == "tematik": + base_query += " AND tematik = true" + elif item == "svodka": + base_query += " AND svodka = true" + elif item == "donesenie": + base_query += " AND donesenie = true" + elif item == "bilutene": + base_query += " AND bilutene = true" cur.execute(base_query, params) result = cur.fetchone() @@ -254,7 +269,15 @@ def poisk(query: str, offset: int = Query(0, ge=0), limit: int = Query(10, ge=1, base_query += " AND viewed = true" elif item == "status": base_query += " AND status = true" - + elif item == "tematik": + base_query += " AND tematik = true" + elif item == "svodka": + base_query += " AND svodka = true" + elif item == "donesenie": + base_query += " AND donesenie = true" + elif item == "bilutene": + base_query += " AND bilutene = true" + base_query += " ORDER BY article_date DESC OFFSET %s LIMIT %s" params.extend([offset, limit]) @@ -298,6 +321,34 @@ def get_records(item: str = "default", offset: int = Query(0, ge=0), limit: int ORDER BY parsed_at DESC OFFSET %s LIMIT %s """, (offset, limit)) + elif item == "tematik": + cur.execute(""" + SELECT * FROM url + WHERE tematik = true + ORDER BY parsed_at DESC + OFFSET %s LIMIT %s + """, (offset, limit)) + elif item == "svodka": + cur.execute(""" + SELECT * FROM url + WHERE svodka = true + ORDER BY parsed_at DESC + OFFSET %s LIMIT %s + """, (offset, limit)) + elif item == "donesenie": + cur.execute(""" + SELECT * FROM url + WHERE donesenie = true + ORDER BY parsed_at DESC + OFFSET %s LIMIT %s + """, (offset, limit)) + elif item == "bilutene": + cur.execute(""" + SELECT * FROM url + WHERE bilutene = true + ORDER BY parsed_at DESC + OFFSET %s LIMIT %s + """, (offset, limit)) elif item == "Япония" or item == "Корея": cur.execute(""" SELECT * FROM url