diff --git a/.github/workflows/build_and_deploy.yml b/.github/workflows/build_and_deploy.yml index e352fbd6..4645ecc6 100644 --- a/.github/workflows/build_and_deploy.yml +++ b/.github/workflows/build_and_deploy.yml @@ -93,7 +93,7 @@ jobs: - name: Deploy to VM run: | bash contrib/pg-upgrade/upgrade-db.sh - + docker compose --file docker-compose.vm.yml --env-file .env up \ --detach --remove-orphans --force-recreate --pull=always env: diff --git a/contrib/pg-upgrade/upgrade-db.sh b/contrib/pg-upgrade/upgrade-db.sh old mode 100644 new mode 100755 diff --git a/docs/images/dev_roadmap_badge.svg b/docs/images/dev_roadmap_badge.svg index 25056020..a4a3e582 100644 --- a/docs/images/dev_roadmap_badge.svg +++ b/docs/images/dev_roadmap_badge.svg @@ -1 +1 @@ -🎯 Dev Roadmap🎯 Dev Roadmap \ No newline at end of file +🎯 Dev Roadmap🎯 Dev Roadmap diff --git a/docs/images/docs_badge.svg b/docs/images/docs_badge.svg index e05dfed7..00e84695 100644 --- a/docs/images/docs_badge.svg +++ b/docs/images/docs_badge.svg @@ -1 +1 @@ -📖 Docs📖 Docs \ No newline at end of file +📖 Docs📖 Docs diff --git a/docs/images/timeline_badge.svg b/docs/images/timeline_badge.svg index 3acfd8bd..39ae4c0f 100644 --- a/docs/images/timeline_badge.svg +++ b/docs/images/timeline_badge.svg @@ -1 +1 @@ -📅 Timeline📅 Timeline \ No newline at end of file +📅 Timeline📅 Timeline diff --git a/docs/images/user_roadmap_badge.svg b/docs/images/user_roadmap_badge.svg index baa306bf..3566e8f9 100644 --- a/docs/images/user_roadmap_badge.svg +++ b/docs/images/user_roadmap_badge.svg @@ -1 +1 @@ -🎯 User Roadmap🎯 User Roadmap \ No newline at end of file +🎯 User Roadmap🎯 User Roadmap diff --git a/src/backend/app/projects/project_routes.py b/src/backend/app/projects/project_routes.py index 5118b596..aeca6709 100644 --- a/src/backend/app/projects/project_routes.py +++ b/src/backend/app/projects/project_routes.py @@ -164,7 +164,9 @@ async def preview_split_by_square( @router.post("/generate-presigned-url/", tags=["Image Upload"]) -async def generate_presigned_url(data: project_schemas.PresignedUrlRequest): +async def generate_presigned_url( + data: project_schemas.PresignedUrlRequest, user: AuthUser = Depends(login_required) +): """ Generate a pre-signed URL for uploading an image to S3 Bucket. @@ -183,14 +185,19 @@ async def generate_presigned_url(data: project_schemas.PresignedUrlRequest): try: # Generate a pre-signed URL for an object client = s3_client() - - url = client.presigned_put_object( - settings.S3_BUCKET_NAME, - f"publicuploads/{data.image_name}", - expires=timedelta(hours=data.expiry), - ) - - return url + urls = [] + for image in data.image_name: + image_path = f"publicuploads/{data.project_id}/{data.task_id}/{image}" + + url = client.get_presigned_url( + "PUT", + settings.S3_BUCKET_NAME, + image_path, + expires=timedelta(hours=data.expiry), + ) + urls.append({"image_name": image, "url": url}) + + return urls except Exception as e: raise HTTPException( status_code=HTTPStatus.BAD_REQUEST, diff --git a/src/backend/app/projects/project_schemas.py b/src/backend/app/projects/project_schemas.py index 31345d89..d6ad99cd 100644 --- a/src/backend/app/projects/project_schemas.py +++ b/src/backend/app/projects/project_schemas.py @@ -1,6 +1,6 @@ import uuid from pydantic import BaseModel, computed_field, Field, validator -from typing import Any, Optional, Union +from typing import Any, Optional, Union, List from geojson_pydantic import Feature, FeatureCollection, Polygon from app.models.enums import ProjectVisibility, State from shapely import wkb @@ -126,5 +126,7 @@ def outline_geojson(self) -> Optional[Feature]: class PresignedUrlRequest(BaseModel): - image_name: str - expiry: int # Expiry time in seconds + project_id: uuid.UUID + task_id: uuid.UUID + image_name: List[str] + expiry: int # Expiry time in hours