| 6 | |
| 7 | |
| 8 | class JsonAPIService: |
| 9 | def __init__(self) -> None: |
| 10 | pass |
| 11 | |
| 12 | @staticmethod |
| 13 | def response( |
| 14 | data: Any = None, |
| 15 | errors: list[JsonApiError | dict[str, Any]] | None = None, |
| 16 | meta: dict[str, Any] | None = None, |
| 17 | resource_type: str | None = None, |
| 18 | ) -> JsonApiResponse: |
| 19 | resources: list[JsonApiResource] | list[dict[str, Any]] | JsonApiResource = [] # noqa |
| 20 | if data is None and errors is None: |
| 21 | return JsonApiResponse(meta=meta) |
| 22 | if resource_type is None: |
| 23 | resource_type = data.__class__.__name__ |
| 24 | if errors: |
| 25 | return JsonApiResponse( |
| 26 | errors=[error.model_dump() if hasattr(error, "model_dump") else error for error in errors], |
| 27 | meta=meta, |
| 28 | ) |
| 29 | if isinstance(data, Paginator): |
| 30 | resources = JsonAPIService.map_items(data.items) |
| 31 | meta = { |
| 32 | "total": data.total, |
| 33 | "page": data.page, |
| 34 | "perPage": data.per_page, |
| 35 | "totalPages": data.pages, |
| 36 | } |
| 37 | elif isinstance(data, list): |
| 38 | resources = JsonAPIService.map_items(data) |
| 39 | else: |
| 40 | resources = ResponseBaseModel.data_to_resource(data, resource_type) |
| 41 | |
| 42 | return JsonApiResponse(data=resources, meta=meta) |
| 43 | |
| 44 | @staticmethod |
| 45 | def map_items(data: list | Sequence[Any]) -> list[JsonApiResource]: |
| 46 | resources = [] |
| 47 | resource_type = "" |
| 48 | if len(data) > 0: |
| 49 | resource_type = data[0].__class__.__name__ |
| 50 | for item in data: |
| 51 | resources.append(ResponseBaseModel.data_to_resource(item, resource_type)) |
| 52 | return resources |
| 53 | |
| 54 | @staticmethod |
| 55 | def error( |
| 56 | status: int, |
| 57 | title: str, |
| 58 | detail: str | list[str] | None = None, |
| 59 | code: str | None = None, |
| 60 | source: dict[str, Any] | None = None, |
| 61 | ) -> JsonApiResponse: |
| 62 | error = JsonApiError( |
| 63 | status=status, |
| 64 | title=title, |
| 65 | detail=detail, |
nothing calls this directly
no outgoing calls
no test coverage detected