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 @@
-
\ No newline at end of file
+
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 @@
-
\ No newline at end of file
+
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 @@
-
\ No newline at end of file
+
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 @@
-
\ No newline at end of file
+
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