Skip to content

Commit 9fad948

Browse files
committed
errors in tags, trash, wallets and workspaces
1 parent 4b8bf12 commit 9fad948

File tree

6 files changed

+22
-71
lines changed

6 files changed

+22
-71
lines changed

packages/common-library/tests/test_iter_tools.py

Whitespace-only changes.

services/web/server/src/simcore_service_webserver/projects/_common/exception_handlers.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
ProjectOwnerNotFoundInTheProjectAccessRightsError,
3131
ProjectStartsTooManyDynamicNodesError,
3232
ProjectTooManyProjectOpenedError,
33+
ProjectWalletPendingTransactionError,
3334
WrongTagIdsInQueryError,
3435
)
3536

@@ -97,7 +98,7 @@
9798
),
9899
UserDefaultWalletNotFoundError: HttpErrorInfo(
99100
status.HTTP_404_NOT_FOUND,
100-
"User default wallet not found",
101+
"Wallet not found: {reason}",
101102
),
102103
DefaultPricingPlanNotFoundError: HttpErrorInfo(
103104
status.HTTP_404_NOT_FOUND,
@@ -123,6 +124,10 @@
123124
status.HTTP_409_CONFLICT,
124125
"The maximal amount of concurrently running dynamic services was reached. Please manually stop a service and retry.",
125126
),
127+
ProjectWalletPendingTransactionError: HttpErrorInfo(
128+
status.HTTP_409_CONFLICT,
129+
"Project has currently pending transactions. It is forbidden to change wallet.",
130+
),
126131
ClustersKeeperNotAvailableError: HttpErrorInfo(
127132
status.HTTP_503_SERVICE_UNAVAILABLE,
128133
"Clusters-keeper service is not available",

services/web/server/src/simcore_service_webserver/projects/_tags_handlers.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from ..login.decorators import login_required
1414
from ..security.decorators import permission_required
1515
from . import _tags_api as tags_api
16+
from ._common.exception_handlers import handle_plugin_requests_exceptions
1617

1718
_logger = logging.getLogger(__name__)
1819

@@ -25,6 +26,7 @@
2526
)
2627
@login_required
2728
@permission_required("project.tag.*")
29+
@handle_plugin_requests_exceptions
2830
async def add_project_tag(request: web.Request):
2931
user_id: int = request[RQT_USERID_KEY]
3032

@@ -51,6 +53,7 @@ async def add_project_tag(request: web.Request):
5153
)
5254
@login_required
5355
@permission_required("project.tag.*")
56+
@handle_plugin_requests_exceptions
5457
async def remove_project_tag(request: web.Request):
5558
user_id: int = request[RQT_USERID_KEY]
5659

services/web/server/src/simcore_service_webserver/projects/_trash_rest.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@
1818
from ..products.api import get_product_name
1919
from ..security.decorators import permission_required
2020
from . import _trash_service
21+
from ._common.exception_handlers import handle_plugin_requests_exceptions
2122
from ._common.models import ProjectPathParams, RemoveQueryParams
2223
from .exceptions import ProjectRunningConflictError, ProjectStoppingError
2324

2425
_logger = logging.getLogger(__name__)
2526

2627
#
27-
# EXCEPTIONS HANDLING
28+
# LOCAL EXCEPTIONS HANDLING
2829
#
2930

3031

@@ -40,7 +41,7 @@
4041
}
4142

4243

43-
_handle_exceptions = exception_handling_decorator(
44+
_handle_local_request_exceptions = exception_handling_decorator(
4445
to_exceptions_handlers_map(_TO_HTTP_ERROR_MAP)
4546
)
4647

@@ -55,7 +56,8 @@
5556
@routes.post(f"/{VTAG}/projects/{{project_id}}:trash", name="trash_project")
5657
@login_required
5758
@permission_required("project.delete")
58-
@_handle_exceptions
59+
@handle_plugin_requests_exceptions
60+
@_handle_local_request_exceptions
5961
async def trash_project(request: web.Request):
6062
user_id = get_user_id(request)
6163
product_name = get_product_name(request)
@@ -79,7 +81,8 @@ async def trash_project(request: web.Request):
7981
@routes.post(f"/{VTAG}/projects/{{project_id}}:untrash", name="untrash_project")
8082
@login_required
8183
@permission_required("project.delete")
82-
@_handle_exceptions
84+
@handle_plugin_requests_exceptions
85+
@_handle_local_request_exceptions
8386
async def untrash_project(request: web.Request):
8487
user_id = get_user_id(request)
8588
product_name = get_product_name(request)

services/web/server/src/simcore_service_webserver/projects/_wallets_handlers.py

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
33
"""
44

5-
import functools
65
import logging
76
from decimal import Decimal
87
from typing import Annotated
@@ -17,58 +16,26 @@
1716
parse_request_body_as,
1817
parse_request_path_parameters_as,
1918
)
20-
from servicelib.aiohttp.typing_extension import Handler
2119
from simcore_service_webserver.utils_aiohttp import envelope_json_response
2220

2321
from .._meta import API_VTAG
2422
from ..login.decorators import login_required
2523
from ..security.decorators import permission_required
26-
from ..wallets.errors import WalletAccessForbiddenError, WalletNotFoundError
2724
from . import _wallets_api as wallets_api
2825
from . import projects_service
26+
from ._common.exception_handlers import handle_plugin_requests_exceptions
2927
from ._common.models import ProjectPathParams, RequestContext
30-
from .exceptions import (
31-
ProjectInDebtCanNotChangeWalletError,
32-
ProjectInvalidRightsError,
33-
ProjectNotFoundError,
34-
ProjectWalletPendingTransactionError,
35-
)
3628

3729
_logger = logging.getLogger(__name__)
3830

3931

40-
def _handle_project_wallet_exceptions(handler: Handler):
41-
@functools.wraps(handler)
42-
async def wrapper(request: web.Request) -> web.StreamResponse:
43-
try:
44-
return await handler(request)
45-
46-
except ProjectNotFoundError as exc:
47-
raise web.HTTPNotFound(reason=f"{exc}") from exc
48-
49-
except WalletNotFoundError as exc:
50-
raise web.HTTPNotFound(reason=f"{exc}") from exc
51-
52-
except ProjectInDebtCanNotChangeWalletError as exc:
53-
raise web.HTTPPaymentRequired(reason=f"{exc}") from exc
54-
55-
except (
56-
WalletAccessForbiddenError,
57-
ProjectInvalidRightsError,
58-
ProjectWalletPendingTransactionError,
59-
) as exc:
60-
raise web.HTTPForbidden(reason=f"{exc}") from exc
61-
62-
return wrapper
63-
64-
6532
routes = web.RouteTableDef()
6633

6734

6835
@routes.get(f"/{API_VTAG}/projects/{{project_id}}/wallet", name="get_project_wallet")
6936
@login_required
7037
@permission_required("project.wallet.*")
71-
@_handle_project_wallet_exceptions
38+
@handle_plugin_requests_exceptions
7239
async def get_project_wallet(request: web.Request):
7340
req_ctx = RequestContext.model_validate(request)
7441
path_params = parse_request_path_parameters_as(ProjectPathParams, request)
@@ -99,7 +66,7 @@ class _ProjectWalletPathParams(BaseModel):
9966
)
10067
@login_required
10168
@permission_required("project.wallet.*")
102-
@_handle_project_wallet_exceptions
69+
@handle_plugin_requests_exceptions
10370
async def connect_wallet_to_project(request: web.Request):
10471
req_ctx = RequestContext.model_validate(request)
10572
path_params = parse_request_path_parameters_as(_ProjectWalletPathParams, request)
@@ -134,7 +101,7 @@ class _PayProjectDebtBody(BaseModel):
134101
)
135102
@login_required
136103
@permission_required("project.wallet.*")
137-
@_handle_project_wallet_exceptions
104+
@handle_plugin_requests_exceptions
138105
async def pay_project_debt(request: web.Request):
139106
req_ctx = RequestContext.model_validate(request)
140107
path_params = parse_request_path_parameters_as(_ProjectWalletPathParams, request)

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

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import functools
21
import logging
32
from typing import Annotated
43

@@ -9,43 +8,17 @@
98
from pydantic import BaseModel, BeforeValidator, ConfigDict, Field
109
from servicelib.aiohttp import status
1110
from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as
12-
from servicelib.aiohttp.typing_extension import Handler
1311

1412
from .._meta import api_version_prefix as VTAG
15-
from ..folders.errors import FolderAccessForbiddenError, FolderNotFoundError
1613
from ..login.decorators import login_required
1714
from ..security.decorators import permission_required
18-
from ..workspaces.errors import WorkspaceAccessForbiddenError, WorkspaceNotFoundError
1915
from . import _workspaces_api
16+
from ._common.exception_handlers import handle_plugin_requests_exceptions
2017
from ._common.models import RequestContext
21-
from .exceptions import ProjectInvalidRightsError, ProjectNotFoundError
2218

2319
_logger = logging.getLogger(__name__)
2420

2521

26-
def _handle_projects_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-
ProjectNotFoundError,
34-
FolderNotFoundError,
35-
WorkspaceNotFoundError,
36-
) as exc:
37-
raise web.HTTPNotFound(reason=f"{exc}") from exc
38-
39-
except (
40-
ProjectInvalidRightsError,
41-
FolderAccessForbiddenError,
42-
WorkspaceAccessForbiddenError,
43-
) as exc:
44-
raise web.HTTPForbidden(reason=f"{exc}") from exc
45-
46-
return wrapper
47-
48-
4922
routes = web.RouteTableDef()
5023

5124

@@ -64,7 +37,7 @@ class _ProjectWorkspacesPathParams(BaseModel):
6437
)
6538
@login_required
6639
@permission_required("project.workspaces.*")
67-
@_handle_projects_workspaces_exceptions
40+
@handle_plugin_requests_exceptions
6841
async def move_project_to_workspace(request: web.Request):
6942
req_ctx = RequestContext.model_validate(request)
7043
path_params = parse_request_path_parameters_as(

0 commit comments

Comments
 (0)