HR-ATS-Portal/backend/s3/app.py

78 lines
2.6 KiB
Python

from fastapi import APIRouter,Depends,File,Form,HTTPException,Query,UploadFile
from fastapi.responses import JSONResponse
from pydantic import BaseModel
from s3.views import S3Storage
from users.permissions import PermissionTag,require_permission
from dotenv import load_dotenv
load_dotenv()
router=APIRouter()
class DeleteObjectBody(BaseModel):
key: str
@router.get("/s3/health")
async def s3_health():
"""Bucket reachability — unauthenticated like GET /sheet/health."""
try:
service=S3Storage()
data=await service.health_check()
return JSONResponse(content={"data":data,"total":1,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.post("/s3/upload")
async def upload_s3_file(
file: UploadFile=File(...),
source: str=Form(...),
record_id: str=Form(...),
owner_id: str=Form(...),
current_user: dict=Depends(require_permission(PermissionTag.CANDIDATES_CREATE,PermissionTag.SETTINGS_EDIT,require_all=False)),
):
"""PDF only. Requires an existing table row — key is {source}/{record_id}/{owner_id}/{file}.pdf."""
try:
service=S3Storage()
data=await service.upload_for_record(file,source=source,record_id=record_id,owner_id=owner_id)
return JSONResponse(content={"data":data,"total":1,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.get("/s3/url")
async def fetch_s3_url(
key: str=Query(...),
current_user: dict=Depends(require_permission(PermissionTag.CANDIDATES_VIEW,PermissionTag.SETTINGS_VIEW,require_all=False)),
):
"""Recompute the permanent URL for an existing key (no S3 round trip)."""
try:
service=S3Storage()
data=await service.object_url(key)
return JSONResponse(content={"data":data,"total":1,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))
@router.post("/s3/delete")
async def delete_s3_file(
payload: DeleteObjectBody,
current_user: dict=Depends(require_permission(PermissionTag.CANDIDATES_DELETE,PermissionTag.SETTINGS_DELETE,require_all=False)),
):
try:
service=S3Storage()
data=await service.delete_file(payload.key)
return JSONResponse(content={"data":data,"total":1,"status_code":200})
except HTTPException:
raise
except Exception as e:
raise HTTPException(status_code=500,detail=str(e))