b88ccf3b4b
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
61 lines
2.1 KiB
Python
61 lines
2.1 KiB
Python
"""Модуль управления изображениями и их очистки."""
|
|
|
|
import logging
|
|
import os
|
|
from datetime import datetime
|
|
|
|
from config import settings
|
|
from database.database import db
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
async def cleanup_expired_images() -> int:
|
|
"""
|
|
Удалить просроченные изображения.
|
|
Возвращает количество удалённых изображений.
|
|
"""
|
|
expired = await db.get_expired_images()
|
|
deleted_count = 0
|
|
|
|
for image in expired:
|
|
# Удаляем файл
|
|
file_path = image["file_path"]
|
|
try:
|
|
if os.path.exists(file_path):
|
|
os.remove(file_path)
|
|
logger.debug(f"Удалён файл: {file_path}")
|
|
except Exception as e:
|
|
logger.error(f"Ошибка удаления файла {file_path}: {e}")
|
|
|
|
# Удаляем запись из БД
|
|
try:
|
|
await db.delete_image_record(image["id"])
|
|
deleted_count += 1
|
|
except Exception as e:
|
|
logger.error(f"Ошибка удаления записи изображения {image['id']}: {e}")
|
|
|
|
if deleted_count > 0:
|
|
logger.info(f"Удалено {deleted_count} просроченных изображдений")
|
|
|
|
return deleted_count
|
|
|
|
|
|
def get_image_path(user_id: int, filename: str) -> str:
|
|
"""
|
|
Получить путь для сохранения изображения.
|
|
Формат: images/{user_id}/{filename}
|
|
"""
|
|
user_dir = os.path.join(settings.IMAGES_DIR, str(user_id))
|
|
os.makedirs(user_dir, exist_ok=True)
|
|
return os.path.join(user_dir, filename)
|
|
|
|
|
|
def cleanup_user_images(user_id: int) -> None:
|
|
"""Удалить все изображения пользователя (при необходимости)."""
|
|
user_dir = os.path.join(settings.IMAGES_DIR, str(user_id))
|
|
if os.path.exists(user_dir):
|
|
import shutil
|
|
shutil.rmtree(user_dir)
|
|
logger.info(f"Удалены все изображения пользователя {user_id}")
|