Skip to content

Commit 17b38a9

Browse files
committed
ensure uploading of file works
1 parent c26c985 commit 17b38a9

File tree

2 files changed

+46
-23
lines changed
  • services/api-server/src/simcore_service_api_server

2 files changed

+46
-23
lines changed

services/api-server/src/simcore_service_api_server/api/routes/files.py

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -375,18 +375,32 @@ async def delete_file(
375375
async def abort_multipart_upload(
376376
request: Request,
377377
file_id: UUID,
378-
client_file: Annotated[ClientFile, Body(..., embed=True)],
378+
client_file: Annotated[ClientFileInProgramJob | ClientFile, Body(..., embed=True)],
379379
storage_client: Annotated[StorageApi, Depends(get_api_client(StorageApi))],
380380
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
381+
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
381382
):
383+
assert file_id # nosec
382384
assert request # nosec
383385
assert user_id # nosec
384-
file = DomainFile(
385-
id=file_id,
386-
filename=client_file.filename,
387-
checksum=client_file.sha256_checksum,
388-
e_tag=None,
389-
)
386+
387+
if isinstance(client_file, ClientFile):
388+
file = client_file.to_domain_model()
389+
elif isinstance(client_file, ClientFileInProgramJob):
390+
project = await webserver_api.get_project(project_id=client_file.job_id)
391+
if len(project.workbench) > 1:
392+
raise HTTPException(
393+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
394+
detail=f"Job_id {project.uuid} is not a valid program job.",
395+
)
396+
node_id = next(iter(project.workbench.keys()))
397+
file = client_file.to_domain_model(
398+
project_id=project.uuid, node_id=NodeID(node_id)
399+
)
400+
else:
401+
err_msg = f"Invalid client_file type passed: {type(client_file)=}"
402+
raise TypeError(err_msg)
403+
390404
abort_link: URL = await storage_client.create_abort_upload_link(
391405
file=file, query={"user_id": str(user_id)}
392406
)
@@ -404,20 +418,32 @@ async def abort_multipart_upload(
404418
async def complete_multipart_upload(
405419
request: Request,
406420
file_id: UUID,
407-
client_file: Annotated[ClientFile, Body(...)],
421+
client_file: Annotated[ClientFileInProgramJob | ClientFile, Body(...)],
408422
uploaded_parts: Annotated[FileUploadCompletionBody, Body(...)],
409423
storage_client: Annotated[StorageApi, Depends(get_api_client(StorageApi))],
410424
user_id: Annotated[PositiveInt, Depends(get_current_user_id)],
425+
webserver_api: Annotated[AuthSession, Depends(get_webserver_session)],
411426
):
427+
assert file_id # nosec
412428
assert request # nosec
413429
assert user_id # nosec
414430

415-
file = DomainFile(
416-
id=file_id,
417-
filename=client_file.filename,
418-
checksum=client_file.sha256_checksum,
419-
e_tag=None,
420-
)
431+
if isinstance(client_file, ClientFile):
432+
file = client_file.to_domain_model()
433+
elif isinstance(client_file, ClientFileInProgramJob):
434+
project = await webserver_api.get_project(project_id=client_file.job_id)
435+
if len(project.workbench) > 1:
436+
raise HTTPException(
437+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
438+
detail=f"Job_id {project.uuid} is not a valid program job.",
439+
)
440+
node_id = next(iter(project.workbench.keys()))
441+
file = client_file.to_domain_model(
442+
project_id=project.uuid, node_id=NodeID(node_id)
443+
)
444+
else:
445+
err_msg = f"Invalid client_file type passed: {type(client_file)=}"
446+
raise TypeError(err_msg)
421447
complete_link: URL = await storage_client.create_complete_upload_link(
422448
file=file, query={"user_id": str(user_id)}
423449
)

services/api-server/src/simcore_service_api_server/services_http/storage.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@
3535

3636
AccessRight = Literal["read", "write"]
3737

38-
_FILE_ID_PATTERN = re.compile(
39-
r"^api\/(?P<file_id>[\w-]+)\/(?P<filename>.+)|(?P<project_id>[\w-]+)\/(?P<node_id>[\w-]+)\/workspace/.*$"
40-
)
38+
_FILE_ID_PATTERN = re.compile(r"^api\/(?P<file_id>[\w-]+)\/(?P<filename>.+)$")
4139

4240

4341
def to_file_api_model(stored_file_meta: StorageFileMetaData) -> File:
@@ -47,12 +45,11 @@ def to_file_api_model(stored_file_meta: StorageFileMetaData) -> File:
4745
msg = f"Invalid file_id {stored_file_meta.file_id} in file metadata"
4846
raise ValueError(msg)
4947

50-
file_id, filename = match.groups()
51-
5248
return File(
53-
id=file_id, # type: ignore
54-
filename=filename,
55-
content_type=guess_type(filename)[0] or "application/octet-stream",
49+
id=stored_file_meta.file_id, # type: ignore
50+
filename=stored_file_meta.file_name,
51+
content_type=guess_type(stored_file_meta.file_name)[0]
52+
or "application/octet-stream",
5653
e_tag=stored_file_meta.entity_tag,
5754
checksum=stored_file_meta.sha256_checksum,
5855
)
@@ -110,7 +107,7 @@ async def search_owned_files(
110107
{
111108
"kind": "owned",
112109
"user_id": f"{user_id}",
113-
"startswith": None if file_id is None else f"api/{file_id}",
110+
"startswith": "api/" if file_id is None else f"api/{file_id}",
114111
"sha256_checksum": sha256_checksum,
115112
"limit": limit,
116113
"offset": offset,

0 commit comments

Comments
 (0)