Skip to content

Commit 58a488d

Browse files
committed
improves error handling
1 parent 9031849 commit 58a488d

File tree

3 files changed

+64
-31
lines changed

3 files changed

+64
-31
lines changed
Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,38 @@
1+
from common_library.user_messages import user_message
2+
13
from ..errors import WebServerBaseError
24

35

46
class StudyDispatcherError(WebServerBaseError, ValueError): ...
57

68

79
class IncompatibleServiceError(StudyDispatcherError):
8-
msg_template = "None of the registered services can handle '{file_type}'"
10+
msg_template = user_message(
11+
"None of the registered services can handle '{file_type}'"
12+
)
913

1014

1115
class FileToLargeError(StudyDispatcherError):
12-
msg_template = "File size {file_size_in_mb} MB is over allowed limit"
16+
msg_template = user_message("File size {file_size_in_mb} MB is over allowed limit")
1317

1418

1519
class ServiceNotFoundError(StudyDispatcherError):
16-
msg_template = "Service {service_key}:{service_version} not found"
20+
msg_template = user_message("Service {service_key}:{service_version} not found")
1721

1822

1923
class InvalidRedirectionParamsError(StudyDispatcherError):
20-
msg_template = (
21-
"The link you provided is invalid because it doesn't contain any information related to data or a service."
22-
" Please check the link and make sure it is correct."
23-
)
24+
msg_template = "Invalid link"
2425

2526

2627
class GuestUsersLimitError(StudyDispatcherError):
27-
msg_template = "Maximum number of guests was reached. Please login with a registered user or try again later"
28+
msg_template = user_message(
29+
"Maximum number of guests was reached. Please login with a registered user or try again later"
30+
)
2831

2932

3033
class GuestUserNotAllowedError(StudyDispatcherError):
3134
msg_template = "Guest users are not allowed to access this resource configuration."
35+
36+
37+
class ProjectWorkbenchMismatchError(StudyDispatcherError):
38+
msg_template = "Project {project_uuid} exists but does not seem to be a viewer generated by this module"

services/web/server/src/simcore_service_webserver/studies_dispatcher/_projects.py

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@
1919
from models_library.projects_nodes_io import DownloadLink, NodeID, PortLink
2020
from models_library.services import ServiceKey, ServiceVersion
2121
from pydantic import AnyUrl, HttpUrl, TypeAdapter
22-
from servicelib.logging_errors import create_troubleshootting_log_kwargs
2322
from servicelib.logging_utils import log_decorator
2423

2524
from ..projects._projects_repository_legacy import ProjectDBAPI
2625
from ..projects._projects_service import get_project_for_user
2726
from ..projects.exceptions import ProjectInvalidRightsError, ProjectNotFoundError
2827
from ..utils import now_str
2928
from ._core import compose_uuid_from
29+
from ._errors import ProjectWorkbenchMismatchError
3030
from ._models import FileParams, ServiceInfo, ViewerInfo
3131
from ._users import UserInfo
3232

@@ -282,24 +282,14 @@ async def get_or_create_project_with_file_and_service(
282282
if is_valid:
283283
exists = True
284284
else:
285-
http_500_error = web.HTTPInternalServerError()
286-
_logger.error(
287-
**create_troubleshootting_log_kwargs(
288-
f"Project {project_uid} exists but does not seem to be a viewer generated by this module.",
289-
error=http_500_error,
290-
error_context={
291-
"user": user,
292-
"viewer": viewer,
293-
"download_link": download_link,
294-
"project_db_workbench_keys": list(
295-
project_db.get("workbench", {}).keys()
296-
),
297-
"expected_keys": [file_picker_id, service_id],
298-
},
299-
)
285+
raise ProjectWorkbenchMismatchError(
286+
project_uuid=project_uid,
287+
user=user,
288+
viewer=viewer,
289+
download_link=download_link,
290+
project_db_workbench_keys=list(project_db.get("workbench", {}).keys()),
291+
expected_keys=[file_picker_id, service_id],
300292
)
301-
# FIXME: CANNOT GUARANTEE!!, DELETE?? ERROR?? and cannot be viewed until verified?
302-
raise http_500_error
303293

304294
except (ProjectNotFoundError, ProjectInvalidRightsError):
305295
exists = False

services/web/server/src/simcore_service_webserver/studies_dispatcher/_redirects_handlers.py

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77

88
from aiohttp import web
99
from common_library.error_codes import create_error_code
10+
from common_library.user_messages import user_message
11+
from models_library.function_services_catalog._utils import ServiceNotFound
1012
from models_library.projects import ProjectID
1113
from models_library.projects_nodes_io import NodeID
1214
from models_library.services import ServiceKey, ServiceVersion
@@ -25,9 +27,12 @@
2527
from ._constants import MSG_GUESTS_NOT_ALLOWED, MSG_UNEXPECTED_DISPATCH_ERROR
2628
from ._core import validate_requested_file, validate_requested_viewer
2729
from ._errors import (
30+
FileToLargeError,
2831
GuestUserNotAllowedError,
32+
GuestUsersLimitError,
33+
IncompatibleServiceError,
2934
InvalidRedirectionParamsError,
30-
StudyDispatcherError,
35+
ProjectWorkbenchMismatchError,
3136
)
3237
from ._models import FileParams, ServiceInfo, ServiceParams, ViewerInfo
3338
from ._projects import (
@@ -104,18 +109,49 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
104109
status_code=status.HTTP_401_UNAUTHORIZED,
105110
) from err
106111

107-
except StudyDispatcherError as err:
112+
except ProjectWorkbenchMismatchError as err:
113+
error_code = create_error_code(err)
114+
115+
user_error_msg = compose_support_error_msg(
116+
msg=MSG_UNEXPECTED_DISPATCH_ERROR, error_code=error_code
117+
)
118+
_logger.exception(
119+
**create_troubleshootting_log_kwargs(
120+
user_error_msg,
121+
error=err,
122+
error_code=error_code,
123+
error_context=create_error_context_from_request(request),
124+
tip="project might be corrupted",
125+
)
126+
)
127+
raise _create_redirect_response_to_error_page(
128+
request.app,
129+
message=user_error_msg,
130+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
131+
) from err
132+
133+
except (
134+
ServiceNotFound,
135+
FileToLargeError,
136+
IncompatibleServiceError,
137+
GuestUsersLimitError,
138+
) as err:
139+
user_error_msg = f"Sorry, we cannot dispatch your study: {err}"
108140
raise _create_redirect_response_to_error_page(
109141
request.app,
110-
message=f"Sorry, we cannot dispatch your study: {err}",
142+
message=user_error_msg,
111143
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY, # 422
112144
) from err
113145

114-
except web.HTTPUnprocessableEntity as err:
146+
except (InvalidRedirectionParamsError, web.HTTPUnprocessableEntity) as err:
115147
# Validation error in query parameters
116148
error_code = create_error_code(err)
117149
user_error_msg = compose_support_error_msg(
118-
msg="Invalid query parameters in link", error_code=error_code
150+
msg=user_message(
151+
"The link you provided is invalid because it doesn't contain any or invalid information related to data or a service."
152+
"Please check the link and make sure it is correct."
153+
),
154+
error_code=error_code,
119155
)
120156

121157
_logger.exception(

0 commit comments

Comments
 (0)