Skip to content

Commit 344b9e6

Browse files
committed
simcore_s3
1 parent 88afd0b commit 344b9e6

File tree

1 file changed

+48
-63
lines changed

1 file changed

+48
-63
lines changed
Lines changed: 48 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,25 @@
1+
import asyncio
12
import logging
2-
from typing import Annotated, cast
3+
from typing import Annotated, Any, cast
34

4-
from aiohttp import web
5-
from common_library.json_serialization import json_dumps
65
from fastapi import APIRouter, Depends, FastAPI, Request
6+
from models_library.api_schemas_long_running_tasks.base import TaskProgress
77
from models_library.api_schemas_long_running_tasks.tasks import TaskGet
88
from models_library.api_schemas_storage import FileMetaDataGet, FoldersBody
99
from models_library.generics import Envelope
1010
from models_library.projects import ProjectID
11-
from models_library.utils.fastapi_encoders import jsonable_encoder
1211
from servicelib.aiohttp import status
13-
from servicelib.aiohttp.long_running_tasks.server import (
14-
TaskProgress,
15-
start_long_running_task,
16-
)
17-
from servicelib.aiohttp.requests_validation import (
18-
parse_request_body_as,
19-
parse_request_path_parameters_as,
20-
parse_request_query_parameters_as,
21-
)
12+
from servicelib.fastapi.long_running_tasks._dependencies import get_tasks_manager
2213
from servicelib.logging_utils import log_context
14+
from servicelib.long_running_tasks._task import start_task
2315
from settings_library.s3 import S3Settings
16+
from yarl import URL
2417

2518
from ...dsm import get_dsm_provider
2619
from ...models import (
2720
DeleteFolderQueryParams,
2821
FileMetaData,
2922
SearchFilesQueryParams,
30-
SimcoreS3FoldersParams,
3123
StorageQueryParamsBase,
3224
)
3325
from ...modules import sts
@@ -60,7 +52,7 @@ async def _copy_folders_from_project(
6052
app: FastAPI,
6153
query_params: StorageQueryParamsBase,
6254
body: FoldersBody,
63-
) -> Envelope[TaskGet]:
55+
):
6456
dsm = cast(
6557
SimcoreS3DataManager,
6658
get_dsm_provider(app).get(SimcoreS3DataManager.get_location_id()),
@@ -78,78 +70,73 @@ async def _copy_folders_from_project(
7870
task_progress=task_progress,
7971
)
8072

81-
return web.json_response(
82-
{"data": jsonable_encoder(body.destination)},
83-
status=status.HTTP_201_CREATED,
84-
dumps=json_dumps,
85-
)
73+
return Envelope[dict[str, Any]](data=body.destination)
8674

8775

8876
@router.post(
8977
"/simcore-s3/folders",
9078
response_model=Envelope[TaskGet],
9179
status_code=status.HTTP_202_ACCEPTED,
9280
)
93-
async def copy_folders_from_project(request: web.Request) -> web.Response:
94-
query_params: StorageQueryParamsBase = parse_request_query_parameters_as(
95-
StorageQueryParamsBase, request
96-
)
97-
body = await parse_request_body_as(FoldersBody, request)
98-
_logger.debug(
99-
"received call to create_folders_from_project with %s",
100-
f"{body=}, {query_params=}",
101-
)
102-
return await start_long_running_task(
103-
request,
104-
_copy_folders_from_project, # type: ignore[arg-type]
105-
task_context={},
106-
app=request.app,
107-
query_params=query_params,
108-
body=body,
109-
)
81+
async def copy_folders_from_project(
82+
query_params: StorageQueryParamsBase, body: FoldersBody, request: Request
83+
):
84+
task_id = None
85+
try:
86+
task_id = start_task(
87+
get_tasks_manager(request),
88+
_copy_folders_from_project,
89+
app=request.app,
90+
query_params=query_params,
91+
body=body,
92+
)
93+
relative_url = URL(f"{request.url}").relative()
94+
95+
return Envelope[TaskGet](
96+
data=TaskGet(
97+
task_id=task_id,
98+
task_name=f"{request.method} {relative_url}",
99+
status_href=f"{request.url_for('get_task_status', task_id=task_id)}",
100+
result_href=f"{request.url_for('get_task_result', task_id=task_id)}",
101+
abort_href=f"{request.url_for('cancel_and_delete_task', task_id=task_id)}",
102+
)
103+
)
104+
except asyncio.CancelledError:
105+
if task_id:
106+
await get_tasks_manager(request).cancel_task(
107+
task_id, with_task_context=None
108+
)
109+
raise
110110

111111

112112
@router.delete(
113113
"/simcore-s3/folders/{folder_id}",
114114
status_code=status.HTTP_204_NO_CONTENT,
115115
)
116-
async def delete_folders_of_project(request: web.Request) -> web.Response:
117-
query_params: DeleteFolderQueryParams = parse_request_query_parameters_as(
118-
DeleteFolderQueryParams, request
119-
)
120-
path_params = parse_request_path_parameters_as(SimcoreS3FoldersParams, request)
121-
_logger.debug(
122-
"received call to delete_folders_of_project with %s",
123-
f"{path_params=}, {query_params=}",
124-
)
116+
async def delete_folders_of_project(
117+
query_params: Annotated[DeleteFolderQueryParams, Depends()],
118+
folder_id: str,
119+
request: Request,
120+
):
125121

126122
dsm = cast(
127123
SimcoreS3DataManager,
128124
get_dsm_provider(request.app).get(SimcoreS3DataManager.get_location_id()),
129125
)
130126
await dsm.delete_project_simcore_s3(
131127
query_params.user_id,
132-
ProjectID(path_params.folder_id),
128+
ProjectID(folder_id),
133129
query_params.node_id,
134130
)
135131

136-
return web.json_response(status=status.HTTP_204_NO_CONTENT)
137-
138132

139133
@router.post(
140134
"/simcore-s3/files/metadata:search",
141135
response_model=Envelope[list[FileMetaDataGet]],
142136
)
143-
async def search_files(request: web.Request) -> web.Response:
144-
query_params: SearchFilesQueryParams = parse_request_query_parameters_as(
145-
SearchFilesQueryParams, request
146-
)
147-
148-
_logger.debug(
149-
"received call to search_files with %s",
150-
f"{query_params=}",
151-
)
152-
137+
async def search_files(
138+
query_params: Annotated[SearchFilesQueryParams, Depends()], request: Request
139+
):
153140
dsm = cast(
154141
SimcoreS3DataManager,
155142
get_dsm_provider(request.app).get(SimcoreS3DataManager.get_location_id()),
@@ -167,8 +154,6 @@ async def search_files(request: web.Request) -> web.Response:
167154
len(data),
168155
f"{query_params.startswith=}, {query_params.sha256_checksum=}",
169156
)
170-
171-
return web.json_response(
172-
{"data": [jsonable_encoder(FileMetaDataGet(**d.model_dump())) for d in data]},
173-
dumps=json_dumps,
157+
return Envelope[list[FileMetaDataGet]](
158+
data=[FileMetaDataGet(**d.model_dump()) for d in data]
174159
)

0 commit comments

Comments
 (0)