diff --git a/chain_service/controllers/__main__.py b/chain_service/controllers/__main__.py index 3552275..1c3fa79 100644 --- a/chain_service/controllers/__main__.py +++ b/chain_service/controllers/__main__.py @@ -1,5 +1,6 @@ from .chain import router as chain_router from .run_chain import router as run_chain_router +from .s3 import router as s3_router from fastapi import FastAPI, APIRouter @@ -9,5 +10,6 @@ def setup_controllers(application: FastAPI): router.include_router(chain_router) router.include_router(run_chain_router) + router.include_router(s3_router) application.include_router(router) diff --git a/chain_service/controllers/s3.py b/chain_service/controllers/s3.py new file mode 100644 index 0000000..493cc90 --- /dev/null +++ b/chain_service/controllers/s3.py @@ -0,0 +1,28 @@ +from chain_service.s3 import s3_client +from chain_service.settings import Settings + +from io import BytesIO +from uuid import uuid4 +from loguru import logger +from fastapi import APIRouter, HTTPException, UploadFile + +router = APIRouter() + + +@router.post("/s3") +async def s3_controller(file: UploadFile): + try: + filename = f'{uuid4()}.{file.filename.split(".")[-1]}' + + upload_file_bucket = Settings().s3_upload_file_bucket + upload_file_key = f"files/{filename}" + + s3_client.upload_fileobj( + BytesIO(await file.read()), upload_file_bucket, upload_file_key + ) + + return {"url": Settings().s3_public_url + upload_file_key} + + except Exception: + logger.exception("Error during s3 upload") + return HTTPException(status_code=500, detail="Cannot upload") diff --git a/chain_service/s3.py b/chain_service/s3.py new file mode 100644 index 0000000..7d531b2 --- /dev/null +++ b/chain_service/s3.py @@ -0,0 +1,10 @@ +import boto3 +from chain_service.settings import Settings + +settings = Settings() + +s3_client = boto3.client( + "s3", + aws_access_key_id=settings.s3_access_key, + aws_secret_access_key=settings.s3_secret_access_key, +)