Skip to content

Commit 74bd33a

Browse files
committed
getting there
1 parent 7c5e371 commit 74bd33a

File tree

1 file changed

+46
-149
lines changed

1 file changed

+46
-149
lines changed

api/specs/storage/_simcore_s3.py

Lines changed: 46 additions & 149 deletions
Original file line numberDiff line numberDiff line change
@@ -1,166 +1,63 @@
1-
import logging
2-
from typing import cast
1+
from typing import Annotated
32

4-
from aiohttp import web
5-
from aiohttp.web import RouteTableDef
6-
from common_library.json_serialization import json_dumps
3+
from fastapi import APIRouter, Depends, status
4+
from models_library.api_schemas_long_running_tasks.tasks import TaskGet
75
from models_library.api_schemas_storage import FileMetaDataGet, FoldersBody
8-
from models_library.projects import ProjectID
9-
from models_library.utils.fastapi_encoders import jsonable_encoder
10-
from servicelib.aiohttp import status
11-
from servicelib.aiohttp.long_running_tasks.server import (
12-
TaskProgress,
13-
start_long_running_task,
14-
)
15-
from servicelib.aiohttp.requests_validation import (
16-
parse_request_body_as,
17-
parse_request_path_parameters_as,
18-
parse_request_query_parameters_as,
19-
)
20-
from servicelib.logging_utils import log_context
6+
from models_library.generics import Envelope
217
from settings_library.s3 import S3Settings
22-
23-
from ... import sts
24-
from ..._meta import API_VTAG
25-
from ...dsm import get_dsm_provider
26-
from ...models import (
8+
from simcore_service_storage._meta import API_VTAG
9+
from simcore_service_storage.api.rest.simcore_s3 import (
2710
DeleteFolderQueryParams,
28-
FileMetaData,
29-
SearchFilesQueryParams,
3011
SimcoreS3FoldersParams,
31-
StorageQueryParamsBase,
3212
)
33-
from ...simcore_s3_dsm import SimcoreS3DataManager
34-
35-
_logger = logging.getLogger(__name__)
36-
37-
routes = RouteTableDef()
38-
39-
40-
@routes.post(f"/{API_VTAG}/simcore-s3:access", name="get_or_create_temporary_s3_access")
41-
async def get_or_create_temporary_s3_access(request: web.Request) -> web.Response:
42-
# NOTE: the name of the method is not accurate, these are not temporary at all
43-
# it returns the credentials of the s3 backend!
44-
query_params: StorageQueryParamsBase = parse_request_query_parameters_as(
45-
StorageQueryParamsBase, request
46-
)
47-
_logger.debug(
48-
"received call to get_or_create_temporary_s3_access with %s",
49-
f"{query_params=}",
50-
)
51-
52-
s3_settings: S3Settings = await sts.get_or_create_temporary_token_for_user(
53-
request.app, query_params.user_id
54-
)
55-
return web.json_response({"data": s3_settings.model_dump()}, dumps=json_dumps)
13+
from simcore_service_storage.models import SearchFilesQueryParams
5614

15+
from api.specs.storage._datasets import StorageQueryParamsBase
5716

58-
async def _copy_folders_from_project(
59-
task_progress: TaskProgress,
60-
app: web.Application,
61-
query_params: StorageQueryParamsBase,
62-
body: FoldersBody,
63-
) -> web.Response:
64-
dsm = cast(
65-
SimcoreS3DataManager,
66-
get_dsm_provider(app).get(SimcoreS3DataManager.get_location_id()),
67-
)
68-
with log_context(
69-
_logger,
70-
logging.INFO,
71-
msg=f"copying {body.source['uuid']} -> {body.destination['uuid']}",
72-
):
73-
await dsm.deep_copy_project_simcore_s3(
74-
query_params.user_id,
75-
body.source,
76-
body.destination,
77-
body.nodes_map,
78-
task_progress=task_progress,
79-
)
80-
81-
return web.json_response(
82-
{"data": jsonable_encoder(body.destination)},
83-
status=status.HTTP_201_CREATED,
84-
dumps=json_dumps,
85-
)
86-
87-
88-
@routes.post(f"/{API_VTAG}/simcore-s3/folders", name="copy_folders_from_project")
89-
async def copy_folders_from_project(request: web.Request) -> web.Response:
90-
query_params: StorageQueryParamsBase = parse_request_query_parameters_as(
91-
StorageQueryParamsBase, request
92-
)
93-
body = await parse_request_body_as(FoldersBody, request)
94-
_logger.debug(
95-
"received call to create_folders_from_project with %s",
96-
f"{body=}, {query_params=}",
97-
)
98-
return await start_long_running_task(
99-
request,
100-
_copy_folders_from_project, # type: ignore[arg-type]
101-
task_context={},
102-
app=request.app,
103-
query_params=query_params,
104-
body=body,
105-
)
106-
107-
108-
@routes.delete(
109-
f"/{API_VTAG}/simcore-s3/folders/{{folder_id}}", name="delete_folders_of_project"
17+
router = APIRouter(
18+
prefix=f"/{API_VTAG}",
19+
tags=[
20+
"simcore-s3",
21+
],
11022
)
111-
async def delete_folders_of_project(request: web.Request) -> web.Response:
112-
query_params: DeleteFolderQueryParams = parse_request_query_parameters_as(
113-
DeleteFolderQueryParams, request
114-
)
115-
path_params = parse_request_path_parameters_as(SimcoreS3FoldersParams, request)
116-
_logger.debug(
117-
"received call to delete_folders_of_project with %s",
118-
f"{path_params=}, {query_params=}",
119-
)
12023

121-
dsm = cast(
122-
SimcoreS3DataManager,
123-
get_dsm_provider(request.app).get(SimcoreS3DataManager.get_location_id()),
124-
)
125-
await dsm.delete_project_simcore_s3(
126-
query_params.user_id,
127-
ProjectID(path_params.folder_id),
128-
query_params.node_id,
129-
)
13024

131-
return web.json_response(status=status.HTTP_204_NO_CONTENT)
25+
@router.post("/simcore-s3:access", response_model=Envelope[S3Settings])
26+
async def get_or_create_temporary_s3_access(
27+
_query: Annotated[StorageQueryParamsBase, Depends()],
28+
):
29+
...
13230

13331

134-
@routes.post(f"/{API_VTAG}/simcore-s3/files/metadata:search", name="search_files")
135-
async def search_files(request: web.Request) -> web.Response:
136-
query_params: SearchFilesQueryParams = parse_request_query_parameters_as(
137-
SearchFilesQueryParams, request
138-
)
32+
@router.post(
33+
"/simcore-s3/folders",
34+
response_model=Envelope[TaskGet],
35+
status_code=status.HTTP_202_ACCEPTED,
36+
)
37+
async def copy_folders_from_project(
38+
_query: Annotated[StorageQueryParamsBase, Depends()],
39+
_body: Annotated[FoldersBody, Depends()],
40+
):
41+
...
13942

140-
_logger.debug(
141-
"received call to search_files with %s",
142-
f"{query_params=}",
143-
)
14443

145-
dsm = cast(
146-
SimcoreS3DataManager,
147-
get_dsm_provider(request.app).get(SimcoreS3DataManager.get_location_id()),
148-
)
44+
@router.delete(
45+
"/simcore-s3/folders/{folder_id}",
46+
status_code=status.HTTP_204_NO_CONTENT,
47+
)
48+
async def delete_folders_of_project(
49+
_query: Annotated[DeleteFolderQueryParams, Depends()],
50+
_path: Annotated[SimcoreS3FoldersParams, Depends()],
51+
):
52+
...
14953

150-
data: list[FileMetaData] = await dsm.search_owned_files(
151-
user_id=query_params.user_id,
152-
file_id_prefix=query_params.startswith,
153-
sha256_checksum=query_params.sha256_checksum,
154-
limit=query_params.limit,
155-
offset=query_params.offset,
156-
)
157-
_logger.debug(
158-
"Found %d files starting with '%s'",
159-
len(data),
160-
f"{query_params.startswith=}, {query_params.sha256_checksum=}",
161-
)
16254

163-
return web.json_response(
164-
{"data": [jsonable_encoder(FileMetaDataGet(**d.model_dump())) for d in data]},
165-
dumps=json_dumps,
166-
)
55+
@router.post(
56+
"/simcore-s3/files/metadata:search",
57+
response_model=Envelope[list[FileMetaDataGet]],
58+
)
59+
async def search_files(
60+
_query: Annotated[SearchFilesQueryParams, Depends()],
61+
_path: Annotated[SimcoreS3FoldersParams, Depends()],
62+
):
63+
...

0 commit comments

Comments
 (0)