1+ import asyncio
12import 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
65from fastapi import APIRouter , Depends , FastAPI , Request
6+ from models_library .api_schemas_long_running_tasks .base import TaskProgress
77from models_library .api_schemas_long_running_tasks .tasks import TaskGet
88from models_library .api_schemas_storage import FileMetaDataGet , FoldersBody
99from models_library .generics import Envelope
1010from models_library .projects import ProjectID
11- from models_library .utils .fastapi_encoders import jsonable_encoder
1211from 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
2213from servicelib .logging_utils import log_context
14+ from servicelib .long_running_tasks ._task import start_task
2315from settings_library .s3 import S3Settings
16+ from yarl import URL
2417
2518from ...dsm import get_dsm_provider
2619from ...models import (
2720 DeleteFolderQueryParams ,
2821 FileMetaData ,
2922 SearchFilesQueryParams ,
30- SimcoreS3FoldersParams ,
3123 StorageQueryParamsBase ,
3224)
3325from ...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