forked from IOInfinity-NIU/FastAPI-TortoiseORM-SQLite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
152 lines (134 loc) · 3.98 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
"""
Title : Create, Query, Update and Delete product API
Create Time : 2022/12/28
Author : IOInfinity x 源碼無限
"""
from tortoise.contrib.fastapi import register_tortoise
from fastapi import FastAPI, Query
from pd_response import (
BaseResponse,
ProductResponseModel,
ProductResponseListModel
)
from pd_request import (
ProductRequestModel,
ProductUpdateRequestModel,
)
from tortoise_models import Product
from fastapi.openapi.docs import get_redoc_html
API_DOC_TITLE = "Simple product management API [IOInfinity x 源碼無限]"
product_app = FastAPI(title=API_DOC_TITLE)
@product_app.get(
"/ok",
tags=["General"],
response_model=BaseResponse)
def health_check():
"""Check the <b>health</b> of product API"""
return BaseResponse(
msg="success",
code=0,
).dict()
@product_app.post(
"/products",
tags=["Product"], response_model=BaseResponse)
async def create_product(product: ProductRequestModel):
"""<b>Create</b> a product"""
await Product.create(
product_name=product.product_name,
product_type=product.product_type,
base64_image=product.base64_image
)
return BaseResponse(
msg="success",
code=0,
).dict()
@product_app.get(
"/products",
tags=["Product"],
response_model=ProductResponseListModel)
async def query_products(
product_id: int | None = Query(default=None, min=1)):
"""<b>Query</b> products"""
query = dict(id=product_id) if product_id else dict()
# Query data from database
products = await Product.filter(**query)
product_list = []
for product in products:
product_list.append(
ProductResponseModel(
product_id=product.id,
product_type=product.product_type,
product_name=product.product_name,
base64_image=product.base64_image,
).dict()
)
return ProductResponseListModel(
msg="success",
code=0,
product_list=product_list,
).dict()
@product_app.patch(
"/products/{product_id}",
tags=["Product"],
response_model=BaseResponse)
async def update_product(
product_id: int,
product_request: ProductUpdateRequestModel,):
"""
Update the product information.
"""
# print the product in the terminal by product id.
print("Product ID:")
print(product_id)
# Print the product request parameters
print("Product request:")
print(product_request.product_name)
print(product_request.product_type)
# Find the product id from database
db_product = await Product.get(id=product_id)
if db_product:
print("Product data in database:")
print(db_product.product_name)
print(db_product.product_type)
# Update product data by product id.
if product_request.product_name:
db_product.product_name = product_request.product_name
if product_request.product_type:
db_product.product_type = product_request.product_type
await db_product.save()
return BaseResponse(
msg="success",
code=0,
).dict()
@product_app.delete(
"/products/{product_id}",
tags=["Product"],
response_model=BaseResponse)
async def delete_product(product_id:int):
"""
Delete product by product id.
"""
# Print the product id in the terminal.
print(product_id)
db_product = await Product.get(id=product_id)
if db_product:
await db_product.delete()
return BaseResponse(
msg="success",
code=0,
).dict()
@product_app.get("/redoc", include_in_schema=False)
async def get_redoct_document():
"""Import redoc API document"""
return get_redoc_html(
openapi_url="/openapi.json",
title=API_DOC_TITLE,
)
# Register Tortoise ORM
register_tortoise(
product_app,
db_url="sqlite://product.db",
modules={"models": ["tortoise_models"]},
generate_schemas=True,
add_exception_handlers=True,
)