Skip to content

Commit 35f8097

Browse files
committed
add exception handling in CatalogService
1 parent d67c526 commit 35f8097

File tree

3 files changed

+35
-4
lines changed

3 files changed

+35
-4
lines changed

services/api-server/src/simcore_service_api_server/exceptions/backend_errors.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ def named_fields(cls) -> set[str]:
1717
)
1818

1919

20+
class InvalidInputError(BaseBackEndError):
21+
msg_template = "Invalid input"
22+
status_code = status.HTTP_422_UNPROCESSABLE_ENTITY
23+
24+
2025
class ListSolversOrStudiesError(BaseBackEndError):
2126
msg_template = "Cannot list solvers/studies"
2227
status_code = status.HTTP_404_NOT_FOUND
@@ -37,11 +42,16 @@ class ProfileNotFoundError(BaseBackEndError):
3742
status_code = status.HTTP_404_NOT_FOUND
3843

3944

40-
class SolverOrStudyNotFoundError(BaseBackEndError):
41-
msg_template = "Could not get solver/study {name}:{version}"
45+
class ProgramOrSolverOrStudyNotFoundError(BaseBackEndError):
46+
msg_template = "Could not get program/solver/study {name}:{version}"
4247
status_code = status.HTTP_404_NOT_FOUND
4348

4449

50+
class ServiceForbiddenAccessError(BaseBackEndError):
51+
msg_template = "Forbidden access to program/solver/study {name}:{version}"
52+
status_code = status.HTTP_403_FORBIDDEN
53+
54+
4555
class JobNotFoundError(BaseBackEndError):
4656
msg_template = "Could not get solver/study job {project_id}"
4757
status_code = status.HTTP_404_NOT_FOUND

services/api-server/src/simcore_service_api_server/services_http/catalog.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
from ..exceptions.backend_errors import (
1919
ListSolversOrStudiesError,
20-
SolverOrStudyNotFoundError,
20+
ProgramOrSolverOrStudyNotFoundError,
2121
)
2222
from ..exceptions.service_errors_utils import service_exception_mapper
2323
from ..models.basic_types import VersionStr
@@ -145,7 +145,7 @@ async def list_services(
145145
return services
146146

147147
@_exception_mapper(
148-
http_status_map={status.HTTP_404_NOT_FOUND: SolverOrStudyNotFoundError}
148+
http_status_map={status.HTTP_404_NOT_FOUND: ProgramOrSolverOrStudyNotFoundError}
149149
)
150150
async def get_service_ports(
151151
self,

services/api-server/src/simcore_service_api_server/services_rpc/catalog.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from functools import partial
12
from typing import Annotated
23

34
from fastapi import Depends
@@ -12,10 +13,23 @@
1213
from models_library.services_history import ServiceRelease
1314
from models_library.services_types import ServiceKey, ServiceVersion
1415
from models_library.users import UserID
16+
from pydantic import ValidationError
1517
from servicelib.rabbitmq import RabbitMQRPCClient
1618
from servicelib.rabbitmq.rpc_interfaces.catalog import services as catalog_rpc
19+
from servicelib.rabbitmq.rpc_interfaces.catalog.errors import (
20+
CatalogForbiddenError,
21+
CatalogItemNotFoundError,
22+
)
23+
from simcore_service_api_server.exceptions.backend_errors import (
24+
InvalidInputError,
25+
ProgramOrSolverOrStudyNotFoundError,
26+
ServiceForbiddenAccessError,
27+
)
1728

1829
from ..api.dependencies.rabbitmq import get_rabbitmq_rpc_client
30+
from ..exceptions.service_errors_utils import service_exception_mapper
31+
32+
_exception_mapper = partial(service_exception_mapper, service_name="CatalogService")
1933

2034

2135
class CatalogService:
@@ -76,6 +90,13 @@ async def list_release_history(
7690
)
7791
return page.data, meta
7892

93+
@_exception_mapper(
94+
rpc_exception_map={
95+
CatalogItemNotFoundError: ProgramOrSolverOrStudyNotFoundError,
96+
CatalogForbiddenError: ServiceForbiddenAccessError,
97+
ValidationError: InvalidInputError,
98+
}
99+
)
79100
async def get(
80101
self,
81102
*,

0 commit comments

Comments
 (0)