import os import tempfile import uuid import aiobotocore.session import asyncio 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 ( aiobotocore.session.get_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}") s3 = await create_s3_client() logger.debug("Starting file upload to S3") content = await file.read() await s3.put_object( Bucket=STORJ_BUCKET_NAME, Key=key, Body=content, 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)