Skip to content

Commit f819ffc

Browse files
committed
rest errors
1 parent 4e829c8 commit f819ffc

File tree

6 files changed

+54
-43
lines changed

6 files changed

+54
-43
lines changed

packages/models-library/src/models_library/rest_error.py

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,59 @@
1+
from dataclasses import dataclass, field
12
from typing import Annotated
23

34
from pydantic import BaseModel, ConfigDict, Field
45

56
from .basic_types import IDStr
67

78

9+
@dataclass
10+
class LogMessageType:
11+
# NOTE: deprecated!
12+
message: str
13+
level: str = "INFO"
14+
logger: str = "user"
15+
16+
17+
@dataclass
18+
class ErrorItemType:
19+
# NOTE: deprecated!
20+
code: str
21+
message: str
22+
resource: str | None
23+
field: str | None
24+
25+
@classmethod
26+
def from_error(cls, err: BaseException):
27+
return cls(
28+
code=err.__class__.__name__, message=str(err), resource=None, field=None
29+
)
30+
31+
832
class ErrorGet(BaseModel):
9-
msg: Annotated[
10-
str, Field(min_length=5, description="Message displayed to the user")
33+
message: Annotated[
34+
str,
35+
Field(
36+
min_length=5,
37+
description="Message displayed to the user",
38+
),
1139
]
1240
support_id: Annotated[
1341
IDStr | None,
1442
Field(description="ID to track the incident during support", alias="supportId"),
1543
] = None
1644

45+
# NOTE: The fields blow are DEPRECATED.
46+
# Still here to keep compatibilty with front-end until updated
47+
status: Annotated[int, Field(deprecated=True)] = 400
48+
errors: Annotated[
49+
list[ErrorItemType],
50+
Field(deprecated=True, default_factory=list, json_schema_extra={"default": []}),
51+
]
52+
logs: Annotated[
53+
list[LogMessageType],
54+
Field(deprecated=True, default_factory=list, json_schema_extra={"default": []}),
55+
]
56+
1757
model_config = ConfigDict(
1858
populate_by_name=True,
1959
extra="ignore", # Used to prune extra fields from internal data

packages/service-library/src/servicelib/aiohttp/rest_middlewares.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,11 @@
1414
from aiohttp.web_response import StreamResponse
1515
from common_library.error_codes import create_error_code
1616
from common_library.json_serialization import json_dumps
17+
from models_library.rest_error import ErrorGet, ErrorItemType, LogMessageType
1718

1819
from ..logging_errors import create_troubleshotting_log_kwargs
1920
from ..mimetype_constants import MIMETYPE_APPLICATION_JSON
2021
from ..utils import is_production_environ
21-
from .rest_models import ErrorItemType, ErrorType, LogMessageType
2222
from .rest_responses import (
2323
create_data_response,
2424
create_http_error,
@@ -98,7 +98,7 @@ async def _middleware_handler(request: web.Request, handler: Handler):
9898
err.content_type = MIMETYPE_APPLICATION_JSON
9999

100100
if not err.text or not is_enveloped_from_text(err.text):
101-
error = ErrorType(
101+
error = ErrorGet(
102102
errors=[
103103
ErrorItemType.from_error(err),
104104
],

packages/service-library/src/servicelib/aiohttp/rest_models.py

Lines changed: 0 additions & 30 deletions
This file was deleted.

packages/service-library/src/servicelib/aiohttp/rest_responses.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,16 @@
55
import inspect
66
import json
77
from collections.abc import Mapping
8-
from dataclasses import asdict
98
from typing import Any
109

1110
from aiohttp import web, web_exceptions
1211
from aiohttp.web_exceptions import HTTPError, HTTPException
1312
from common_library.json_serialization import json_dumps
13+
from models_library.rest_error import ErrorGet, ErrorItemType
1414
from servicelib.aiohttp.status import HTTP_200_OK
1515

1616
from ..mimetype_constants import MIMETYPE_APPLICATION_JSON
1717
from ..status_codes_utils import get_code_description
18-
from .rest_models import ErrorItemType, ErrorType
1918

2019
_ENVELOPE_KEYS = ("data", "error")
2120

@@ -101,21 +100,23 @@ def create_http_error(
101100
default_message = reason or get_code_description(http_error_cls.status_code)
102101

103102
if is_internal_error and skip_internal_error_details:
104-
error = ErrorType(
103+
error = ErrorGet(
105104
errors=[],
105+
logs=[],
106106
status=http_error_cls.status_code,
107107
message=default_message,
108108
)
109109
else:
110110
items = [ErrorItemType.from_error(err) for err in errors]
111-
error = ErrorType(
111+
error = ErrorGet(
112112
errors=items,
113+
logs=[],
113114
status=http_error_cls.status_code,
114115
message=default_message,
115116
)
116117

117118
assert not http_error_cls.empty_body # nosec
118-
payload = wrap_as_envelope(error=asdict(error))
119+
payload = wrap_as_envelope(error=error)
119120

120121
return http_error_cls(
121122
reason=reason,

services/web/server/src/simcore_service_webserver/exception_handling_factory.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def create_error_response(error: ErrorGet, status_code: int) -> web.Response:
4141
return web.json_response(
4242
data={"error": error.model_dump(exclude_unset=True, mode="json")},
4343
dumps=json_dumps,
44-
reason=error.msg,
44+
reason=error.message,
4545
status=status_code,
4646
)
4747

@@ -81,7 +81,7 @@ async def _exception_handler(
8181
_DefaultDict(getattr(exception, "__dict__", {}))
8282
)
8383

84-
error = ErrorGet(msg=user_msg)
84+
error = ErrorGet(message=user_msg)
8585

8686
if is_5xx_server_error(status_code):
8787
oec = create_error_code(exception)
@@ -98,7 +98,7 @@ async def _exception_handler(
9898
},
9999
)
100100
)
101-
error = ErrorGet(msg=user_msg, support_id=IDStr(oec))
101+
error = ErrorGet(message=user_msg, support_id=IDStr(oec))
102102

103103
return create_error_response(error, status_code=status_code)
104104

services/web/server/src/simcore_service_webserver/login/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@
44
from aiohttp import web
55
from common_library.json_serialization import json_dumps
66
from models_library.products import ProductName
7+
from models_library.rest_error import LogMessageType
78
from models_library.users import UserID
89
from pydantic import PositiveInt
910
from servicelib.aiohttp import observer
10-
from servicelib.aiohttp.rest_models import LogMessageType
1111
from servicelib.aiohttp.status import HTTP_200_OK
1212
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
1313
from simcore_postgres_database.models.users import UserRole

0 commit comments

Comments
 (0)