Skip to content

Commit 4b93ed8

Browse files
CosmoVNatalia Grigoreva
authored andcommitted
added schema storage
1 parent 8e23aa3 commit 4b93ed8

File tree

12 files changed

+519
-708
lines changed

12 files changed

+519
-708
lines changed

fastapi_jsonapi/api.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ def __init__(
7575
pagination_default_offset: Optional[int] = None,
7676
pagination_default_limit: Optional[int] = None,
7777
methods: Iterable[str] = (),
78-
max_cache_size: int = 0,
7978
ending_slash: bool = True,
8079
) -> None:
8180
"""
@@ -127,7 +126,7 @@ def __init__(
127126
self.pagination_default_number: Optional[int] = pagination_default_number
128127
self.pagination_default_offset: Optional[int] = pagination_default_offset
129128
self.pagination_default_limit: Optional[int] = pagination_default_limit
130-
self.schema_builder = SchemaBuilder(resource_type=resource_type, max_cache_size=max_cache_size)
129+
self.schema_builder = SchemaBuilder(resource_type=resource_type)
131130

132131
dto = self.schema_builder.create_schemas(
133132
schema=schema,

fastapi_jsonapi/atomic/atomic_handler.py

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

99
from fastapi import HTTPException, status
1010
from fastapi.requests import Request
11-
from pydantic import BaseModel, ValidationError
11+
from pydantic import ValidationError
1212

1313
from fastapi_jsonapi import RoutersJSONAPI
1414
from fastapi_jsonapi.atomic.prepared_atomic_operation import LocalIdsType, OperationBase
@@ -150,14 +150,14 @@ async def handle(self) -> Union[AtomicResponseDict, AtomicResultResponse, None]:
150150
results.append({})
151151
continue
152152
only_empty_responses = False
153+
154+
data = response["data"]
153155
results.append(
154-
{
155-
"data": response.data.model_dump() if isinstance(response.data, BaseModel) else response.data,
156-
},
156+
{"data": data},
157157
)
158158

159-
if operation.data.lid and response.data:
160-
self.local_ids_cache[operation.data.type][operation.data.lid] = response.data.id
159+
if operation.data.lid and data:
160+
self.local_ids_cache[operation.data.type][operation.data.lid] = data["id"]
161161

162162
# reset context var
163163
current_atomic_operation.reset(ctx_var_token)

fastapi_jsonapi/schema.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66

77
from __future__ import annotations
88

9+
from dataclasses import dataclass
910
from inspect import isclass
1011
from types import GenericAlias
11-
from typing import TYPE_CHECKING, Optional, Sequence, Type, Union, get_args
12+
from typing import TYPE_CHECKING, Any, Callable, Optional, Sequence, Type, Union, get_args
1213

1314
from fastapi import FastAPI
1415
from pydantic import BaseModel, ConfigDict, Field
@@ -20,6 +21,7 @@
2021
from pydantic.fields import FieldInfo
2122

2223
from fastapi_jsonapi.common import search_relationship_info
24+
from fastapi_jsonapi.types_metadata import RelationshipInfo
2325

2426
if TYPE_CHECKING:
2527
from fastapi_jsonapi.data_typing import TypeSchema
@@ -137,6 +139,50 @@ class JSONAPISchemaIntrospectionError(Exception):
137139
pass
138140

139141

142+
# todo: when 3.9 support is dropped, return back `slots=True to JSONAPIObjectSchemas dataclass`
143+
144+
145+
@dataclass(frozen=True)
146+
class JSONAPIObjectSchemas:
147+
attributes_schema: Type[BaseModel]
148+
relationships_schema: Type[BaseModel]
149+
object_jsonapi_schema: Type[JSONAPIObjectSchema]
150+
can_be_included_schemas: dict[str, Type[JSONAPIObjectSchema]]
151+
152+
@property
153+
def included_schemas_list(self) -> list[Type[JSONAPIObjectSchema]]:
154+
return list(self.can_be_included_schemas.values())
155+
156+
157+
@dataclass(frozen=True)
158+
class BuiltSchemasDTO:
159+
schema_in_post: Type[BaseJSONAPIDataInSchema]
160+
schema_in_post_data: Type[BaseJSONAPIItemInSchema]
161+
schema_in_patch: Type[BaseJSONAPIDataInSchema]
162+
schema_in_patch_data: Type[BaseJSONAPIItemInSchema]
163+
detail_response_schema: Type[JSONAPIResultDetailSchema]
164+
list_response_schema: Type[JSONAPIResultListSchema]
165+
166+
167+
FieldValidators = dict[str, Callable]
168+
169+
170+
@dataclass(frozen=True)
171+
class SchemasInfoDTO:
172+
# id field
173+
resource_id_field: tuple[Type, FieldInfo, Callable, FieldValidators]
174+
# pre-built attributes
175+
attributes_schema: Type[BaseModel]
176+
# relationships
177+
relationships_schema: Type[BaseModel]
178+
# has any required relationship
179+
has_required_relationship: bool
180+
# anything that can be included
181+
included_schemas: list[tuple[str, BaseModel, str]]
182+
183+
relationships_info: dict[str, tuple[RelationshipInfo, Any]]
184+
185+
140186
def get_model_field(schema: Type["TypeSchema"], field: str) -> str:
141187
"""
142188
Get the model field of a schema field.

0 commit comments

Comments
 (0)