import logging 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") async with file.open("rb") as f: content = await f.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)