import os import tempfile import uuid import aioboto3 from starlette.applications import Starlette from starlette.responses import JSONResponse from starlette.routing import Route from starlette.requests import Request from auth import login_required from logger import root_logger as logger from settings import ( PORT, STORJ_ACCESS_KEY, STORJ_SECRET_KEY, CDN_DOMAIN, STORJ_BUCKET_NAME, STORJ_END_POINT, ) async def create_s3_client(): return aioboto3.Session().create_client( "s3", aws_access_key_id=STORJ_ACCESS_KEY, aws_secret_access_key=STORJ_SECRET_KEY, endpoint_url=STORJ_END_POINT, ) @login_required async def upload_handler(request: Request): logger.debug("Received upload request") form = await request.form() file = form.get("file") if file is None: logger.error("No file uploaded") return JSONResponse({"error": "No file uploaded"}, status_code=400) file_name, file_extension = os.path.splitext(file.filename) key = str(uuid.uuid4()) + file_extension logger.debug(f"Generated file key: {key}") async with create_s3_client() as s3: with tempfile.NamedTemporaryFile() as tmp_file: while True: chunk = await file.read(8192) if not chunk: break tmp_file.write(chunk) tmp_file.flush() logger.debug("Starting file upload to S3") await s3.upload_file( Filename=tmp_file.name, Bucket=STORJ_BUCKET_NAME, Key=key, ExtraArgs={"ContentType": file.content_type}, ) logger.debug("File upload completed") url = f"http://{CDN_DOMAIN}/{key}" logger.info(f"File uploaded successfully: {url}") return JSONResponse({"url": url, "originalFilename": file.filename}) async def home(request: Request): logger.debug("Home route called") return JSONResponse({"message": "Hello World!"}) routes = [ Route("/", home, methods=["GET"]), Route("/", upload_handler, methods=["POST"]), ] app = Starlette(debug=True, routes=routes)