Skip to content

Commit 217cb6c

Browse files
committed
update crud mixin to just be router factory
1 parent 4eb3a88 commit 217cb6c

File tree

4 files changed

+55
-32
lines changed

4 files changed

+55
-32
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "FireFrame"
7-
version = "0.0.0-alpha.5"
7+
version = "0.0.0-alpha.6"
88
authors = [
99
{ name="Zachary Spar", email="[email protected]" },
1010
]

sample_app.py

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"""A sample FireFrame API."""
22
from fireframe.core.api import FireFrameAPI
3-
from fireframe.core.mixins import CrudMixin
3+
from fireframe.core.mixins import crud_router
44
from fireframe.core.models import Model
55
from fireframe.core.serializers import ModelSerializer
66

@@ -32,11 +32,36 @@ class Meta:
3232
fields = ["name", "email", "age"]
3333

3434

35-
class UserCrudAPI(CrudMixin):
36-
serializer_class = UserSerializer
35+
class Item(Model):
36+
"""
37+
Item model.
38+
39+
Inherits from FireFrame's Model.
40+
"""
41+
42+
class Meta:
43+
collection_name = "items_sample_collection"
44+
45+
name: str
46+
price: float
47+
is_offer: bool
48+
stock: int
49+
50+
51+
class ItemSerializer(ModelSerializer):
52+
"""
53+
Item serializer.
54+
55+
Inherits from FireFrame's ModelSerializer.
56+
"""
57+
58+
class Meta:
59+
model = Item
60+
fields = ["name", "price", "is_offer", "stock"]
3761

3862

3963
app = FireFrameAPI(title="Sample FireFrame App", version="0.0.0")
4064

4165
# routes from mixin
42-
app.include_router(UserCrudAPI.as_router(), tags=["Users"])
66+
app.include_router(crud_router(UserSerializer), tags=["Users"], prefix="/users")
67+
app.include_router(crud_router(ItemSerializer), tags=["Items"], prefix="/items")

src/fireframe/core/mixins.py

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

77

88
__all__ = [
9-
"CrudMixin",
9+
"crud_router",
1010
]
1111

1212

@@ -16,33 +16,23 @@ class BaseAPIViewSet(BaseAPIView):
1616
"""
1717

1818

19-
class CrudMixin(BaseAPIViewSet):
20-
"""
21-
Mixin for CRUD operations.
22-
"""
23-
24-
@classmethod
25-
def as_router(cls):
26-
"""
27-
Instantiate a new router with CRUD views and return the router.
28-
"""
29-
router = APIRouter()
30-
31-
class CreateView(BaseCreateAPIView):
32-
serializer_class = cls.serializer_class
19+
def crud_router(input_serializer_class):
20+
router = APIRouter()
3321

34-
class RetrieveView(BaseRetrieveAPIView):
35-
serializer_class = cls.serializer_class
22+
class CreateView(BaseCreateAPIView):
23+
serializer_class = input_serializer_class
3624

37-
class UpdateView(BaseUpdateAPIView):
38-
serializer_class = cls.serializer_class
25+
class RetrieveView(BaseRetrieveAPIView):
26+
serializer_class = input_serializer_class
3927

40-
class DestroyView(BaseDestroyAPIView):
41-
serializer_class = cls.serializer_class
28+
class UpdateView(BaseUpdateAPIView):
29+
serializer_class = input_serializer_class
4230

43-
router.include_router(CreateView.as_router())
44-
router.include_router(RetrieveView.as_router())
45-
router.include_router(UpdateView.as_router())
46-
router.include_router(DestroyView.as_router())
31+
class DestroyView(BaseDestroyAPIView):
32+
serializer_class = input_serializer_class
4733

48-
return router
34+
router.include_router(CreateView.as_router())
35+
router.include_router(RetrieveView.as_router())
36+
router.include_router(UpdateView.as_router())
37+
router.include_router(DestroyView.as_router())
38+
return router

src/fireframe/core/views.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ def _generate_routes(self):
4646
name=f"List {self.serializer_class.Meta.model.__name__} View",
4747
response_model=List[self.serializer_class],
4848
methods=["GET"],
49+
status_code=200,
4950
)
5051

5152
async def list(self):
@@ -69,6 +70,7 @@ def _generate_routes(self):
6970
name=f"Retrieve {self.serializer_class.Meta.model.__name__} View",
7071
response_model=self.serializer_class,
7172
methods=["GET"],
73+
status_code=200,
7274
)
7375

7476
async def retrieve(self, id: str):
@@ -99,6 +101,7 @@ def _generate_routes(self):
99101
name=f"Create {self.serializer_class.Meta.model.__name__} View",
100102
response_model=self.serializer_class,
101103
methods=["POST"],
104+
status_code=201,
102105
)
103106

104107
async def create(self, serializer_data):
@@ -127,6 +130,7 @@ def _generate_routes(self):
127130
name=f"Update {self.serializer_class.Meta.model.__name__} View",
128131
response_model=self.serializer_class,
129132
methods=["PUT"],
133+
status_code=200,
130134
)
131135

132136
async def update(self, id: str, serializer_data): # TODO FIXME serializer_data: self.serializer_class
@@ -157,7 +161,11 @@ async def update(self, id: str, serializer_data): # TODO FIXME serializer_data:
157161
class BaseDestroyAPIView(BaseAPIView):
158162
def _generate_routes(self):
159163
self.add_api_route(
160-
"/{id}", self.destroy, name=f"Destroy {self.serializer_class.Meta.model.__name__} View", methods=["DELETE"]
164+
"/{id}",
165+
self.destroy,
166+
name=f"Destroy {self.serializer_class.Meta.model.__name__} View",
167+
methods=["DELETE"],
168+
status_code=204,
161169
)
162170

163171
async def destroy(self, id: str) -> None:

0 commit comments

Comments
 (0)