|
1 | | -import functools |
2 | 1 | import logging |
3 | | -from typing import Annotated |
4 | 2 |
|
5 | 3 | 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 |
10 | 4 | from servicelib.aiohttp import status |
11 | 5 | from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as |
12 | | -from servicelib.aiohttp.typing_extension import Handler |
13 | 6 |
|
14 | 7 | from .._meta import api_version_prefix as VTAG |
15 | | -from ..folders.errors import FolderAccessForbiddenError, FolderNotFoundError |
16 | 8 | from ..login.decorators import login_required |
17 | | -from ..projects.exceptions import ProjectInvalidRightsError, ProjectNotFoundError |
18 | 9 | from ..security.decorators import permission_required |
19 | | -from ..workspaces.errors import WorkspaceAccessForbiddenError, WorkspaceNotFoundError |
20 | 10 | from . import _workspaces_api |
21 | | -from ._models import FoldersRequestContext |
| 11 | +from ._exceptions_handlers import handle_plugin_requests_exceptions |
| 12 | +from ._models import FoldersRequestContext, _FolderWorkspacesPathParams |
22 | 13 |
|
23 | 14 | _logger = logging.getLogger(__name__) |
24 | 15 |
|
25 | 16 |
|
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 | | - |
49 | 17 | routes = web.RouteTableDef() |
50 | 18 |
|
51 | 19 |
|
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 | | - |
61 | 20 | @routes.put( |
62 | 21 | f"/{VTAG}/folders/{{folder_id}}/workspaces/{{workspace_id}}", |
63 | 22 | name="replace_folder_workspace", |
64 | 23 | ) |
65 | 24 | @login_required |
66 | 25 | @permission_required("folder.update") |
67 | | -@_handle_folders_workspaces_exceptions |
| 26 | +@handle_plugin_requests_exceptions |
68 | 27 | async def replace_project_workspace(request: web.Request): |
69 | 28 | req_ctx = FoldersRequestContext.model_validate(request) |
70 | 29 | path_params = parse_request_path_parameters_as(_FolderWorkspacesPathParams, request) |
|
0 commit comments