diff --git a/app.py b/app.py index fc67542..d6f402c 100644 --- a/app.py +++ b/app.py @@ -405,6 +405,8 @@ def shared_result(share_id): result = storage.get_result(share_id) if result is None: return render_template("result.html", result=None, error="Результат не найден", video_exists=False, base_url=BASE_URL), 404 + if storage.is_expired(result["created_at"]): + return render_template("result.html", result=None, error="Ссылка устарела. Результат доступен в течение 30 минут после сканирования.", video_exists=False, base_url=BASE_URL), 410 video_exists = bool(glob.glob(os.path.join(VIDEO_DIR, f"{share_id}.*"))) return render_template("result.html", result=result, error=None, video_exists=video_exists, base_url=BASE_URL) @@ -413,6 +415,11 @@ def shared_result(share_id): @app.route("/download//pdf") def download_pdf(share_id): """Скачать результат в PDF.""" + result = storage.get_result(share_id) + if result is None: + return "Результат не найден", 404 + if storage.is_expired(result["created_at"]): + return "Ссылка устарела. Результат доступен в течение 30 минут.", 410 try: data = export.generate_pdf(share_id) except ValueError: @@ -431,6 +438,11 @@ def download_pdf(share_id): @app.route("/download//docx") def download_docx(share_id): """Скачать результат в DOCX.""" + result = storage.get_result(share_id) + if result is None: + return "Результат не найден", 404 + if storage.is_expired(result["created_at"]): + return "Ссылка устарела. Результат доступен в течение 30 минут.", 410 try: data = export.generate_docx(share_id) except ValueError: @@ -449,6 +461,10 @@ def download_docx(share_id): @app.route("/download//video") def download_video(video_id): """Скачать видео, записанное при сканировании (то, что было в кружке).""" + # Если video_id соответствует результату в БД — проверяем срок действия. + result = storage.get_result(video_id) + if result is not None and storage.is_expired(result["created_at"]): + return "Ссылка устарела. Результат доступен в течение 30 минут.", 410 matches = glob.glob(os.path.join(VIDEO_DIR, f"{video_id}.*")) if not matches: return "Видео не найдено", 404 diff --git a/storage.py b/storage.py index ae49acb..beaaf86 100644 --- a/storage.py +++ b/storage.py @@ -17,13 +17,25 @@ import json import os import sqlite3 import uuid -from datetime import datetime +from datetime import datetime, timedelta DB_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), "results.db") # Первый ID результата FIRST_ID = 10005 +# Срок жизни результата: доступен 30 минут, затем становится недоступным (не удаляется). +RESULT_TTL = timedelta(minutes=30) + + +def is_expired(created_at: str) -> bool: + """True, если результат старше RESULT_TTL (30 минут).""" + try: + created = datetime.fromisoformat(created_at) + except (ValueError, TypeError): + return False + return datetime.now() - created > RESULT_TTL + def _connect(): conn = sqlite3.connect(DB_PATH)