from __future__ import annotations import mimetypes from fastapi import APIRouter, Depends from fastapi.responses import FileResponse from sqlalchemy.ext.asyncio import AsyncSession from app.api.deps import get_api_current_user from app.api.errors import ApiException from app.db.models import User from app.db.session import get_db_session from app.services.scholars import application as scholar_service from app.services.scholars import uploads as scholar_uploads from app.settings import settings router = APIRouter(tags=["media"]) @router.get("/scholar-images/{scholar_profile_id}/upload") async def get_uploaded_scholar_image( scholar_profile_id: int, db_session: AsyncSession = Depends(get_db_session), current_user: User = Depends(get_api_current_user), ): profile = await scholar_service.get_user_scholar_by_id( db_session, user_id=current_user.id, scholar_profile_id=scholar_profile_id, ) if profile is None: raise ApiException( status_code=404, code="scholar_not_found", message="Scholar not found.", ) if not profile.profile_image_upload_path: raise ApiException( status_code=404, code="scholar_image_not_found", message="Scholar image not found.", ) try: image_path = scholar_uploads.resolve_upload_file_path( upload_dir=settings.scholar_image_upload_dir, relative_path=profile.profile_image_upload_path, ) except scholar_service.ScholarServiceError as exc: raise ApiException( status_code=404, code="scholar_image_not_found", message="Scholar image not found.", ) from exc if not image_path.exists() or not image_path.is_file(): raise ApiException( status_code=404, code="scholar_image_not_found", message="Scholar image not found.", ) media_type = mimetypes.guess_type(str(image_path))[0] or "application/octet-stream" return FileResponse(path=image_path, media_type=media_type)