1+ from http import HTTPStatus
12from typing import Any
23from uuid import UUID
34
4- from fastapi import APIRouter , Depends
5+ from fastapi import APIRouter , Depends , HTTPException , Request
56from fastapi .responses import RedirectResponse
67from sqlalchemy .ext .asyncio import AsyncSession
78
9+ from app .core .audit_log .service import audit_log_service
810from app .core .database import get_session
911from app .core .s3 import get_s3_client
1012from app .services .media .schemas import (
1517from app .services .media .service import (
1618 generate_presigned_get_url ,
1719 generate_upload_url ,
20+ get_secure_file_path ,
1821 handle_minio_webhook ,
1922)
2023from app .services .user .models import User , UserRole
@@ -36,23 +39,38 @@ async def create_upload_url(
3639
3740@router_v1 .post ('/webhook/minio' )
3841async def minio_webhook (
42+ request : Request ,
3943 event : MinioWebhookEvent ,
4044 session : AsyncSession = Depends (get_session ),
4145) -> dict [str , str ]:
42- await handle_minio_webhook (session , event )
46+ await handle_minio_webhook (session , event , arq_redis = request . app . state . arq_redis )
4347 return {'status' : 'ok' }
4448
4549
46- @router_v1 .get ('/view' , response_class = RedirectResponse )
50+ @router_v1 .get ('/view/{target_type}/{target_id} ' , response_class = RedirectResponse )
4751async def view_private_file (
48- key : str ,
52+ target_type : str ,
53+ target_id : UUID ,
54+ doc_key : str | None = None ,
55+ session : AsyncSession = Depends (get_session ),
4956 s3_client : Any = Depends (get_s3_client ),
5057 current_user : User = Depends (get_current_user ),
5158) -> RedirectResponse :
5259 if current_user .role not in (UserRole .ADMIN , UserRole .MODERATOR ):
53- from fastapi import HTTPException
54-
55- raise HTTPException (status_code = 403 , detail = 'Not authorized to view this file' )
56-
57- url = await generate_presigned_get_url (s3_client , key )
58- return RedirectResponse (url = url , status_code = 307 )
60+ raise HTTPException (
61+ status_code = HTTPStatus .FORBIDDEN , detail = 'Not authorized to view this file'
62+ )
63+ file_path = await get_secure_file_path (session , target_type , target_id , doc_key )
64+ if not file_path :
65+ raise HTTPException (status_code = HTTPStatus .NOT_FOUND , detail = 'File not found' )
66+ if target_type == 'verification_doc' :
67+ await audit_log_service .log_pii_access (
68+ session = session ,
69+ actor_id = current_user .id ,
70+ target_id = target_id ,
71+ target_type = 'verification_request' ,
72+ reason = f'viewing_doc_{ doc_key } ' if doc_key else 'viewing_verification_doc' ,
73+ )
74+ await session .commit ()
75+ url = await generate_presigned_get_url (s3_client , file_path )
76+ return RedirectResponse (url = url , status_code = HTTPStatus .TEMPORARY_REDIRECT )
0 commit comments