Skip to content

Commit

Permalink
M2-4903: Added url_for_post for uploading data, url for getting data
Browse files Browse the repository at this point in the history
  • Loading branch information
ibogretsov committed Feb 9, 2024
1 parent d5f6e02 commit 922eaf3
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 14 deletions.
14 changes: 11 additions & 3 deletions src/apps/file/api/file.py
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,11 @@ async def generate_presigned_media_url(
) -> Response[PresignedUrl]:
key = cdn_client.generate_key(FileScopeEnum.CONTENT, user.id, f"{uuid.uuid4()}/{body.file_name}")
data = cdn_client.generate_presigned_post(key)
return Response(result=PresignedUrl(**data))
return Response(
result=PresignedUrl(
url_for_post=data["url"], fields=data["fields"], url=quote(settings.cdn.url.format(key=key), "/:")
)
)


async def generate_presigned_answer_url(
Expand All @@ -384,7 +388,9 @@ async def generate_presigned_answer_url(
cleaned_file_id = body.file_id.strip()
key = cdn_client.generate_key(FileScopeEnum.ANSWER, unique, cleaned_file_id)
data = cdn_client.generate_presigned_post(key)
return Response(result=PresignedUrl(**data))
return Response(
result=PresignedUrl(url_for_post=data["url"], fields=data["fields"], url=cdn_client.generate_private_url(key))
)


async def generate_presigned_logs_url(
Expand All @@ -396,4 +402,6 @@ async def generate_presigned_logs_url(
service = LogFileService(user.id, cdn_client)
key = f"{service.device_key_prefix(device_id=device_id)}/{body.file_id}"
data = cdn_client.generate_presigned_post(key)
return Response(result=PresignedUrl(**data))
return Response(
result=PresignedUrl(url_for_post=data["url"], fields=data["fields"], url=cdn_client.generate_private_url(key))
)
3 changes: 2 additions & 1 deletion src/apps/file/domain.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ class FileIdRequest(PublicModel):


class PresignedUrl(PublicModel):
url: HttpUrl
url_for_post: HttpUrl
url: str
# Use dict because fields can be different depend storage (AWS S3, Minio, GCS)
fields: dict[str, str]
23 changes: 13 additions & 10 deletions src/apps/file/test_file.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,12 +175,14 @@ async def test_arbitary_s3_aws_check_existence(
async def test_generate_presigned_media_url(self, client: TestClient, file_name: str):
await client.login(self.login_url, "[email protected]", "Test1234!")
bucket_name = "testbucket"
domain_name = "testdomain"
settings.cdn.bucket = bucket_name
settings.cdn.domain = domain_name
resp = await client.post(self.presigned_media_url, data={"file_name": file_name})
assert resp.status_code == http.HTTPStatus.OK
result = resp.json()["result"]
assert result["url"] == f"https://{bucket_name}.s3.amazonaws.com/"
assert result["fields"]["key"].endswith(file_name)
assert result["url"] == settings.cdn.url.format(key=result["fields"]["key"])

async def test_generate_presigned_url_for_post_answer__user_does_not_have_access_to_the_applet(
self, client: TestClient, session: AsyncSession, user: User
Expand All @@ -195,20 +197,21 @@ async def test_generate_presigned_url_for_post_answer__user_does_not_have_access
assert result[0]["message"] == AnswerViewAccessDenied.message

@pytest.mark.usefixtures("mock_presigned_post")
async def test_generate_presigned_url_for_answers(
self,
client: TestClient,
mocker: MockerFixture,
uuid_zero: uuid.UUID,
tom: User,
):
async def test_generate_presigned_url_for_answers(self, client: TestClient, tom: User, mocker: MockerFixture):
await client.login(self.login_url, "[email protected]", "Test1234!")
mocker.patch("uuid.uuid4", return_value=uuid_zero)
file_id = "test.txt"
expected_key = CDNClient.generate_key(FileScopeEnum.ANSWER, f"{tom.id}/{self.applet_id}", file_id)
bucket_name = "bucket"
settings.cdn.bucket = bucket_name
settings.cdn.bucket_answer = bucket_name
mocker.patch("apps.workspaces.service.workspace.WorkspaceService.get_arbitrary_info", return_value=None)
resp = await client.post(self.answer_presigned_url.format(applet_id=self.applet_id), data={"file_id": file_id})
assert resp.status_code == http.HTTPStatus.OK
assert resp.json()["result"]["fields"]["key"] == expected_key
url = CDNClient(
CdnConfig(region="region", bucket=bucket_name, secret_key="secret_key", access_key="access_key"), "env"
).generate_private_url(expected_key)
assert resp.json()["result"]["url"] == url

@pytest.mark.usefixtures("mock_presigned_post")
async def test_generate_presigned_log_url(
Expand All @@ -222,7 +225,7 @@ async def test_generate_presigned_log_url(
expected_key = LogFileService(
tom.id,
CDNClient(
CdnConfig(region="regeion", bucket="bucket", secret_key="secret_key", access_key="access_key"), "env"
CdnConfig(region="region", bucket="bucket", secret_key="secret_key", access_key="access_key"), "env"
),
).key(device_tom, file_name)
assert key == expected_key

0 comments on commit 922eaf3

Please sign in to comment.