Skip to content

Commit 15adfaf

Browse files
committed
error enveloped
1 parent e5abec1 commit 15adfaf

File tree

4 files changed

+42
-27
lines changed

4 files changed

+42
-27
lines changed

api/specs/web-server/_auth.py

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66

77
from typing import Any
88

9-
from _common import EnvelopeE
109
from fastapi import APIRouter, status
1110
from models_library.api_schemas_webserver.auth import (
1211
AccountRequestInfo,
@@ -15,7 +14,7 @@
1514
UnregisterCheck,
1615
)
1716
from models_library.generics import Envelope
18-
from models_library.rest_error import ErrorGet, Log
17+
from models_library.rest_error import EnvelopedError, Log
1918
from pydantic import BaseModel, Field, confloat
2019
from simcore_service_webserver._meta import API_VTAG
2120
from simcore_service_webserver.login._2fa_handlers import Resend2faBody
@@ -76,7 +75,7 @@ async def register(_body: RegisterBody):
7675
"/auth/unregister",
7776
response_model=Envelope[Log],
7877
status_code=status.HTTP_200_OK,
79-
responses={status.HTTP_409_CONFLICT: {"model": EnvelopeE[ErrorGet]}},
78+
responses={status.HTTP_409_CONFLICT: {"model": EnvelopedError}},
8079
)
8180
async def unregister_account(_body: UnregisterCheck):
8281
...
@@ -108,7 +107,7 @@ async def phone_confirmation(_body: PhoneConfirmationBody):
108107
responses={
109108
# status.HTTP_503_SERVICE_UNAVAILABLE
110109
status.HTTP_401_UNAUTHORIZED: {
111-
"model": EnvelopeE[ErrorGet],
110+
"model": EnvelopedError,
112111
"description": "unauthorized reset due to invalid token code",
113112
}
114113
},
@@ -123,7 +122,7 @@ async def login(_body: LoginBody):
123122
operation_id="auth_login_2fa",
124123
responses={
125124
status.HTTP_401_UNAUTHORIZED: {
126-
"model": EnvelopeE[ErrorGet],
125+
"model": EnvelopedError,
127126
"description": "unauthorized reset due to invalid token code",
128127
}
129128
},
@@ -138,7 +137,7 @@ async def login_2fa(_body: LoginTwoFactorAuthBody):
138137
operation_id="auth_resend_2fa_code",
139138
responses={
140139
status.HTTP_401_UNAUTHORIZED: {
141-
"model": EnvelopeE[ErrorGet],
140+
"model": EnvelopedError,
142141
"description": "unauthorized reset due to invalid token code",
143142
}
144143
},
@@ -162,7 +161,7 @@ async def logout(_body: LogoutBody):
162161
status_code=status.HTTP_204_NO_CONTENT,
163162
responses={
164163
status.HTTP_401_UNAUTHORIZED: {
165-
"model": EnvelopeE[ErrorGet],
164+
"model": EnvelopedError,
166165
"description": "unauthorized reset due to invalid token code",
167166
}
168167
},
@@ -175,7 +174,7 @@ async def check_auth():
175174
"/auth/reset-password",
176175
response_model=Envelope[Log],
177176
operation_id="auth_reset_password",
178-
responses={status.HTTP_503_SERVICE_UNAVAILABLE: {"model": EnvelopeE[ErrorGet]}},
177+
responses={status.HTTP_503_SERVICE_UNAVAILABLE: {"model": EnvelopedError}},
179178
)
180179
async def reset_password(_body: ResetPasswordBody):
181180
"""a non logged-in user requests a password reset"""
@@ -187,7 +186,7 @@ async def reset_password(_body: ResetPasswordBody):
187186
operation_id="auth_reset_password_allowed",
188187
responses={
189188
status.HTTP_401_UNAUTHORIZED: {
190-
"model": EnvelopeE[ErrorGet],
189+
"model": EnvelopedError,
191190
"description": "unauthorized reset due to invalid token code",
192191
}
193192
},
@@ -202,11 +201,11 @@ async def reset_password_allowed(code: str, _body: ResetPasswordConfirmation):
202201
operation_id="auth_change_email",
203202
responses={
204203
status.HTTP_401_UNAUTHORIZED: {
205-
"model": EnvelopeE[ErrorGet],
204+
"model": EnvelopedError,
206205
"description": "unauthorized user. Login required",
207206
},
208207
status.HTTP_503_SERVICE_UNAVAILABLE: {
209-
"model": EnvelopeE[ErrorGet],
208+
"model": EnvelopedError,
210209
"description": "unable to send confirmation email",
211210
},
212211
},
@@ -234,15 +233,15 @@ class PasswordCheckSchema(BaseModel):
234233
operation_id="auth_change_password",
235234
responses={
236235
status.HTTP_401_UNAUTHORIZED: {
237-
"model": EnvelopeE[ErrorGet],
236+
"model": EnvelopedError,
238237
"description": "unauthorized user. Login required",
239238
},
240239
status.HTTP_409_CONFLICT: {
241-
"model": EnvelopeE[ErrorGet],
240+
"model": EnvelopedError,
242241
"description": "mismatch between new and confirmation passwords",
243242
},
244243
status.HTTP_422_UNPROCESSABLE_ENTITY: {
245-
"model": EnvelopeE[ErrorGet],
244+
"model": EnvelopedError,
246245
"description": "current password is invalid",
247246
},
248247
},

api/specs/web-server/_folders.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99

1010
from typing import Annotated
1111

12-
from _common import EnvelopeE, as_query
12+
from _comon import as_query
1313
from fastapi import APIRouter, Depends, status
1414
from models_library.api_schemas_webserver.folders_v2 import (
1515
FolderCreateBodyParams,
1616
FolderGet,
1717
FolderReplaceBodyParams,
1818
)
1919
from models_library.generics import Envelope
20-
from models_library.rest_error import ErrorGet
20+
from models_library.rest_error import EnvelopedError
2121
from simcore_service_webserver._meta import API_VTAG
2222
from simcore_service_webserver.folders._exceptions_handlers import _TO_HTTP_ERROR_MAP
2323
from simcore_service_webserver.folders._models import (
@@ -32,8 +32,7 @@
3232
"folders",
3333
],
3434
responses={
35-
i.status_code: {"model": EnvelopeE[ErrorGet]}
36-
for i in _TO_HTTP_ERROR_MAP.values()
35+
i.status_code: {"model": EnvelopedError} for i in _TO_HTTP_ERROR_MAP.values()
3736
},
3837
)
3938

api/specs/web-server/_workspaces.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,15 @@
99
from enum import Enum
1010
from typing import Annotated
1111

12-
from _common import EnvelopeE, as_query
12+
from _common import as_query
1313
from fastapi import APIRouter, Depends, status
1414
from models_library.api_schemas_webserver.workspaces import (
1515
WorkspaceCreateBodyParams,
1616
WorkspaceGet,
1717
WorkspaceReplaceBodyParams,
1818
)
1919
from models_library.generics import Envelope
20-
from models_library.rest_error import ErrorGet
20+
from models_library.rest_error import EnvelopedError
2121
from simcore_service_webserver._meta import API_VTAG
2222
from simcore_service_webserver.folders._exceptions_handlers import _TO_HTTP_ERROR_MAP
2323
from simcore_service_webserver.workspaces._groups_api import WorkspaceGroupGet
@@ -34,8 +34,7 @@
3434
"workspaces",
3535
],
3636
responses={
37-
i.status_code: {"model": EnvelopeE[ErrorGet]}
38-
for i in _TO_HTTP_ERROR_MAP.values()
37+
i.status_code: {"model": EnvelopedError} for i in _TO_HTTP_ERROR_MAP.values()
3938
},
4039
)
4140

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

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from dataclasses import dataclass
2-
from typing import Annotated
2+
from typing import Annotated, Any
33

4+
from models_library.generics import Envelope
45
from pydantic import BaseModel, ConfigDict, Field
56

67
from .basic_types import IDStr, LogLevel
@@ -75,8 +76,7 @@ class ErrorGet(BaseModel):
7576
Field(description="ID to track the incident during support", alias="supportId"),
7677
] = None
7778

78-
# NOTE: The fields blow are DEPRECATED.
79-
# Still here to keep compatibilty with front-end until updated
79+
# NOTE: The fields blow are DEPRECATED. Still here to keep compatibilty with front-end until updated
8080
status: Annotated[int, Field(deprecated=True)] = 400
8181
errors: Annotated[
8282
list[ErrorItemType],
@@ -93,11 +93,29 @@ class ErrorGet(BaseModel):
9393
frozen=True,
9494
json_schema_extra={
9595
"examples": [
96-
{"msg": "Sorry you do not have sufficient access rights for product"},
9796
{
98-
"msg": "Opps this error was unexpected. We are working on that!",
97+
"message": "Sorry you do not have sufficient access rights for product"
98+
},
99+
{
100+
"message": "Opps this error was unexpected. We are working on that!",
99101
"supportId": "OEC:12346789",
100102
},
101103
]
102104
},
103105
)
106+
107+
108+
class EnvelopedError(Envelope[Any]):
109+
error: ErrorGet # type: ignore
110+
111+
model_config = ConfigDict(
112+
json_schema_extra={
113+
"examples": [
114+
{"error": {"message": "display error message here"}},
115+
{
116+
"error": {"message": "failure", "supportId": "OEC:123455"},
117+
"data": None,
118+
},
119+
]
120+
},
121+
)

0 commit comments

Comments
 (0)