Skip to content

Commit 7061af7

Browse files
review @pcrespov
1 parent 0d71046 commit 7061af7

File tree

2 files changed

+14
-47
lines changed

2 files changed

+14
-47
lines changed

services/web/server/src/simcore_service_webserver/folders/_models.py

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@
1818
null_or_none_str_to_none_validator,
1919
)
2020
from models_library.workspaces import WorkspaceID
21-
from pydantic import BeforeValidator, ConfigDict, Field
22-
from servicelib.request_keys import RQT_USERID_KEY
21+
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field
2322

24-
from .._constants import RQ_PRODUCT_KEY
23+
from .._constants import RQ_PRODUCT_KEY, RQT_USERID_KEY
2524

2625
_logger = logging.getLogger(__name__)
2726

@@ -88,3 +87,12 @@ class FolderSearchQueryParams(
8887

8988
class FolderTrashQueryParams(RemoveQueryParams):
9089
...
90+
91+
92+
class _FolderWorkspacesPathParams(BaseModel):
93+
folder_id: FolderID
94+
workspace_id: Annotated[
95+
WorkspaceID | None, BeforeValidator(null_or_none_str_to_none_validator)
96+
] = Field(default=None)
97+
98+
model_config = ConfigDict(extra="forbid")

services/web/server/src/simcore_service_webserver/folders/_workspaces_handlers.py

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,29 @@
1-
import functools
21
import logging
3-
from typing import Annotated
42

53
from aiohttp import web
6-
from models_library.folders import FolderID
7-
from models_library.utils.common_validators import null_or_none_str_to_none_validator
8-
from models_library.workspaces import WorkspaceID
9-
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field
104
from servicelib.aiohttp import status
115
from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as
12-
from servicelib.aiohttp.typing_extension import Handler
136

147
from .._meta import api_version_prefix as VTAG
15-
from ..folders.errors import FolderAccessForbiddenError, FolderNotFoundError
168
from ..login.decorators import login_required
17-
from ..projects.exceptions import ProjectInvalidRightsError, ProjectNotFoundError
189
from ..security.decorators import permission_required
19-
from ..workspaces.errors import WorkspaceAccessForbiddenError, WorkspaceNotFoundError
2010
from . import _workspaces_api
21-
from ._models import FoldersRequestContext
11+
from ._exceptions_handlers import handle_plugin_requests_exceptions
12+
from ._models import FoldersRequestContext, _FolderWorkspacesPathParams
2213

2314
_logger = logging.getLogger(__name__)
2415

2516

26-
def _handle_folders_workspaces_exceptions(handler: Handler):
27-
@functools.wraps(handler)
28-
async def wrapper(request: web.Request) -> web.StreamResponse:
29-
try:
30-
return await handler(request)
31-
32-
except (
33-
ProjectInvalidRightsError,
34-
FolderNotFoundError,
35-
WorkspaceNotFoundError,
36-
) as exc:
37-
raise web.HTTPNotFound(reason=f"{exc}") from exc
38-
39-
except (
40-
ProjectNotFoundError,
41-
FolderAccessForbiddenError,
42-
WorkspaceAccessForbiddenError,
43-
) as exc:
44-
raise web.HTTPForbidden(reason=f"{exc}") from exc
45-
46-
return wrapper
47-
48-
4917
routes = web.RouteTableDef()
5018

5119

52-
class _FolderWorkspacesPathParams(BaseModel):
53-
folder_id: FolderID
54-
workspace_id: Annotated[
55-
WorkspaceID | None, BeforeValidator(null_or_none_str_to_none_validator)
56-
] = Field(default=None)
57-
58-
model_config = ConfigDict(extra="forbid")
59-
60-
6120
@routes.put(
6221
f"/{VTAG}/folders/{{folder_id}}/workspaces/{{workspace_id}}",
6322
name="replace_folder_workspace",
6423
)
6524
@login_required
6625
@permission_required("folder.update")
67-
@_handle_folders_workspaces_exceptions
26+
@handle_plugin_requests_exceptions
6827
async def replace_project_workspace(request: web.Request):
6928
req_ctx = FoldersRequestContext.model_validate(request)
7029
path_params = parse_request_path_parameters_as(_FolderWorkspacesPathParams, request)

0 commit comments

Comments
 (0)