32 lines
973 B
Python
32 lines
973 B
Python
from __future__ import annotations
|
|
|
|
from http import HTTPStatus
|
|
from typing import Any
|
|
|
|
|
|
STATUS_CODES = {
|
|
HTTPStatus.BAD_REQUEST: "bad_request",
|
|
HTTPStatus.UNAUTHORIZED: "authentication_required",
|
|
HTTPStatus.FORBIDDEN: "access_denied",
|
|
HTTPStatus.NOT_FOUND: "not_found",
|
|
HTTPStatus.CONFLICT: "conflict",
|
|
HTTPStatus.INTERNAL_SERVER_ERROR: "internal_error",
|
|
HTTPStatus.SERVICE_UNAVAILABLE: "service_unavailable",
|
|
}
|
|
|
|
|
|
def normalize_error_payload(
|
|
payload: dict[str, Any], status: int | HTTPStatus, request_id: str,
|
|
) -> dict[str, Any]:
|
|
if "error" not in payload:
|
|
return payload
|
|
status_value = HTTPStatus(int(status))
|
|
message = str(payload.get("message") or payload.get("error") or status_value.phrase)
|
|
return {
|
|
**payload,
|
|
"error": message,
|
|
"code": str(payload.get("code") or STATUS_CODES.get(status_value) or "request_failed"),
|
|
"message": message,
|
|
"request_id": request_id,
|
|
}
|