Skip to content

Commit 7e5ff92

Browse files
committed
Added example
1 parent c0f376c commit 7e5ff92

File tree

28 files changed

+1045
-0
lines changed

28 files changed

+1045
-0
lines changed

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,6 @@
22
/examples/api_for_tortoise_orm/db.sqlite3
33
/examples/api_for_tortoise_orm/db.sqlite3-shm
44
/examples/api_for_tortoise_orm/db.sqlite3-wal
5+
/db.sqlite3
6+
/db.sqlite3-shm
7+
/db.sqlite3-wal

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,14 @@
11
# FastAPI-REST-JSONAPI
2+
3+
## Examples:
4+
5+
### 1. App API-FOR-TORTOISE-ORM
6+
7+
#### Start app
8+
```shell
9+
# in dir fastapi-rest-jsonapi
10+
11+
export PYTHOPATH="${PYTHONPATH}:./"
12+
python examples/api_for_tortoise_orm/main.py
13+
```
14+
http://0.0.0.0:8080/docs

examples/__init__.py

Whitespace-only changes.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
## App API-FOR-TORTOISE-ORM
2+
3+
### Start app
4+
```shell
5+
# in dir fastapi-rest-jsonapi
6+
7+
export PYTHOPATH="${PYTHONPATH}:./"
8+
python examples/api_for_tortoise_orm/main.py
9+
```
10+
http://0.0.0.0:8080/docs

examples/api_for_tortoise_orm/__init__.py

Whitespace-only changes.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
"""service API package."""
2+
3+
from .user import UserFactory
4+
5+
__all__ = [
6+
"UserFactory",
7+
]
Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
from http import HTTPStatus
2+
from typing import (
3+
List,
4+
Union,
5+
)
6+
from tortoise.exceptions import DoesNotExist
7+
from tortoise.queryset import QuerySet
8+
9+
from examples.api_for_tortoise_orm.helpers.factories.meta_base import FactoryUseMode
10+
from examples.api_for_tortoise_orm.helpers.factories.user import UserFactory, ErrorCreateUserObject
11+
from examples.api_for_tortoise_orm.helpers.updaters.exceptions import ObjectNotFound
12+
from examples.api_for_tortoise_orm.helpers.updaters.update_user import UpdateUser, ErrorUpdateUserObject
13+
from examples.api_for_tortoise_orm.models.pydantic import UserSchema, UserPatchJSONAPISchema, UserJSONAPIListSchema, \
14+
UserPostJSONAPISchema
15+
from examples.api_for_tortoise_orm.models.tortoise import User
16+
from fastapi_rest_jsonapi import json_api_pagination
17+
18+
from fastapi_rest_jsonapi.exceptions import (
19+
BadRequest,
20+
HTTPException,
21+
)
22+
from fastapi_rest_jsonapi.filter import json_api_filter
23+
from fastapi_rest_jsonapi.querystring import QueryStringManager
24+
25+
26+
class UserDetail(object):
27+
@classmethod
28+
async def get_user(cls, user_id, query_params: QueryStringManager) -> User:
29+
"""
30+
Get user by id from ORM.
31+
32+
:param user_id: int
33+
:param query_params: QueryStringManager
34+
:return: User model.
35+
:raises HTTPException: if user not found.
36+
"""
37+
user: User
38+
try:
39+
user = await User.get(id=user_id)
40+
except DoesNotExist:
41+
raise HTTPException(
42+
status_code=HTTPStatus.FORBIDDEN,
43+
detail="User with id {id} not found".format(id=user_id),
44+
)
45+
46+
return user
47+
48+
@classmethod
49+
async def get(cls, obj_id, query_params: QueryStringManager) -> UserSchema:
50+
user: User = await cls.get_user(user_id=obj_id, query_params=query_params)
51+
return UserSchema.from_orm(user)
52+
53+
@classmethod
54+
async def patch(cls, obj_id, data: UserPatchJSONAPISchema, query_params: QueryStringManager) -> UserSchema:
55+
user_obj: User
56+
try:
57+
user_obj = await UpdateUser.update(
58+
obj_id,
59+
data.attributes.dict(exclude_unset=True),
60+
query_params.headers,
61+
)
62+
except ErrorUpdateUserObject as ex:
63+
raise BadRequest(ex.description, ex.field)
64+
except ObjectNotFound as ex:
65+
raise HTTPException(status_code=HTTPStatus.NOT_FOUND, detail=ex.description)
66+
67+
device = UserSchema.from_orm(user_obj)
68+
return device
69+
70+
71+
class UserList(object):
72+
@classmethod
73+
async def get(cls, query_params: QueryStringManager) -> Union[QuerySet, UserJSONAPIListSchema]:
74+
extended_fields: List[str] = query_params.fields.get("users", [])
75+
if not extended_fields:
76+
device_query = User.filter().order_by("-id")
77+
return await json_api_filter(query=device_query, schema=UserSchema, query_params=query_params)
78+
79+
user_query = User.filter().order_by("-id")
80+
query: QuerySet = await json_api_filter(query=user_query, schema=UserSchema, query_params=query_params)
81+
query, total_pages, count = await json_api_pagination(query=query, query_params=query_params)
82+
users_db: List[User] = await query.all()
83+
users: List[UserSchema] = [UserSchema.from_orm(i_user) for i_user in users_db]
84+
85+
return UserJSONAPIListSchema(
86+
meta={"count": count, "totalPages": total_pages},
87+
data=[{"id": i_obj.id, "type": "Device", "attributes": i_obj.dict()} for i_obj in users],
88+
)
89+
90+
@classmethod
91+
async def post(cls, data: UserPostJSONAPISchema, query_params: QueryStringManager) -> UserSchema:
92+
try:
93+
device_obj = await UserFactory.create(
94+
data=data.attributes.dict(),
95+
mode=FactoryUseMode.production,
96+
header=query_params.headers,
97+
)
98+
except ErrorCreateUserObject as ex:
99+
raise BadRequest(ex.description, ex.field)
100+
101+
user = UserSchema.from_orm(device_obj)
102+
return user
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""Factory call module."""
2+
3+
from examples.api_for_tortoise_orm.main import create_app
4+
5+
app = create_app()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
"""Helpers for service package. Contains factories and updaters packages."""
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
"""
2+
factories package.
3+
4+
Contains factories for creating user models.
5+
"""

0 commit comments

Comments
 (0)