Files
service-finder/backend/app/services/document_service.py
2026-02-26 08:19:25 +01:00

65 lines
2.5 KiB
Python

# /opt/docker/dev/service_finder/backend/app/services/document_service.py
import os
from PIL import Image
from uuid import uuid4
from fastapi import UploadFile, BackgroundTasks
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.document import Document
from app.core.config import settings
class DocumentService:
@staticmethod
async def process_upload(
file: UploadFile, parent_type: str, parent_id: str,
db: AsyncSession, background_tasks: BackgroundTasks
):
""" Kép optimalizálás, Thumbnail generálás és NAS tárolás. """
file_uuid = str(uuid4())
ext = file.filename.split('.')[-1].lower() if '.' in file.filename else "webp"
# Útvonalak a settings-ből (vagy fallback)
nas_base = getattr(settings, "NAS_STORAGE_PATH", "/mnt/nas/app_data")
vault_dir = os.path.join(nas_base, parent_type, parent_id, "vault")
thumb_dir = os.path.join(settings.STATIC_DIR, "previews", parent_type, parent_id)
os.makedirs(vault_dir, exist_ok=True)
os.makedirs(thumb_dir, exist_ok=True)
content = await file.read()
temp_path = f"/tmp/{file_uuid}_{file.filename}"
with open(temp_path, "wb") as f: f.write(content)
# Képfeldolgozás
img = Image.open(temp_path)
# Thumbnail (SSD)
thumb_filename = f"{file_uuid}_thumb.webp"
thumb_path = os.path.join(thumb_dir, thumb_filename)
thumb_img = img.copy()
thumb_img.thumbnail((300, 300))
thumb_img.save(thumb_path, "WEBP", quality=80)
# Optimalizált eredeti (NAS)
vault_filename = f"{file_uuid}.webp"
vault_path = os.path.join(vault_dir, vault_filename)
if img.width > 1600:
img = img.resize((1600, int(img.height * (1600 / img.width))), Image.Resampling.LANCZOS)
img.save(vault_path, "WEBP", quality=85)
# Mentés az új Document modellbe
new_doc = Document(
id=uuid4(),
parent_type=parent_type,
parent_id=parent_id,
original_name=file.filename,
file_hash=file_uuid,
file_ext="webp",
mime_type="image/webp",
file_size=os.path.getsize(vault_path),
has_thumbnail=True,
thumbnail_path=f"/static/previews/{parent_type}/{parent_id}/{thumb_filename}"
)
db.add(new_doc)
await db.commit()
os.remove(temp_path)
return new_doc