flow using openapi.json
parent
f8cca4b861
commit
ee709a489e
|
@ -1,87 +1,25 @@
|
||||||
|
import json
|
||||||
|
|
||||||
from fastapi import FastAPI
|
from fastapi import FastAPI
|
||||||
|
|
||||||
from fastfood.routers.dish import router as dish_router
|
from fastfood.routers.dish import router as dish_router
|
||||||
from fastfood.routers.menu import router as menu_router
|
from fastfood.routers.menu import router as menu_router
|
||||||
from fastfood.routers.submenu import router as submenu_router
|
from fastfood.routers.submenu import router as submenu_router
|
||||||
|
|
||||||
description = """
|
|
||||||
# 🔥🔥🔥Fastfood-API поможет тебе подкрепиться 🔥🔥🔥
|
|
||||||
|
|
||||||
### У нас есть Menu. Ты можеш выбрать блюда из кухни, которая тебе нравится
|
def create_app() -> FastAPI:
|
||||||
|
|
||||||
## Menu
|
|
||||||
|
|
||||||
Ты можешь **add menu**.
|
|
||||||
|
|
||||||
Ты можешь **read menu**.
|
|
||||||
|
|
||||||
Ты можешь **patch menu**.
|
|
||||||
|
|
||||||
Ты можешь **delete menu**.
|
|
||||||
|
|
||||||
### У нас есть в SubMenu, где ты сможешь найти
|
|
||||||
десерты/напитки/супчики/прочие вкусности
|
|
||||||
|
|
||||||
# SubMenu
|
|
||||||
|
|
||||||
Ты можешь **add submenu into menu**.
|
|
||||||
|
|
||||||
Ты можешь **read submenu**.
|
|
||||||
|
|
||||||
Ты можешь **patch submenu**.
|
|
||||||
|
|
||||||
Ты можешь **delete menu**.
|
|
||||||
|
|
||||||
### У нас есть в Dish, где ты сможешь найти блюдо по вкусу
|
|
||||||
|
|
||||||
# Dish
|
|
||||||
|
|
||||||
Ты можешь **add dish into submenu**.
|
|
||||||
|
|
||||||
Ты можешь **read dish**.
|
|
||||||
|
|
||||||
Ты можешь **patch dish**.
|
|
||||||
|
|
||||||
Ты можешь **delete dish**.
|
|
||||||
|
|
||||||
## Приятного аппетита
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
tags_metadata = [
|
|
||||||
{
|
|
||||||
'name': 'menu',
|
|
||||||
'description': 'Операции с меню.',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
'name': 'submenu',
|
|
||||||
'description': 'Подменю и работа с ним',
|
|
||||||
},
|
|
||||||
{'name': 'dish', 'description': 'Блюда и работа с ними'},
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
def create_app(redis=None) -> FastAPI:
|
|
||||||
"""
|
"""
|
||||||
Фабрика FastAPI.
|
Фабрика FastAPI.
|
||||||
"""
|
"""
|
||||||
app = FastAPI(
|
app = FastAPI()
|
||||||
title='Fastfood-API',
|
|
||||||
description=description,
|
|
||||||
version='0.0.3',
|
|
||||||
contact={
|
|
||||||
'name': 'Sergey Vanyushkin',
|
|
||||||
'url': 'http://pi3c.ru',
|
|
||||||
'email': 'pi3c@yandex.ru',
|
|
||||||
},
|
|
||||||
license_info={
|
|
||||||
'name': 'MIT license',
|
|
||||||
'url': 'https://mit-license.org/',
|
|
||||||
},
|
|
||||||
openapi_tags=tags_metadata,
|
|
||||||
)
|
|
||||||
app.include_router(menu_router)
|
app.include_router(menu_router)
|
||||||
app.include_router(submenu_router)
|
app.include_router(submenu_router)
|
||||||
app.include_router(dish_router)
|
app.include_router(dish_router)
|
||||||
|
|
||||||
|
def custom_openapi():
|
||||||
|
with open('openapi.json') as openapi:
|
||||||
|
return json.load(openapi)
|
||||||
|
|
||||||
|
app.openapi = custom_openapi
|
||||||
|
|
||||||
return app
|
return app
|
||||||
|
|
|
@ -14,9 +14,6 @@ router = APIRouter(
|
||||||
@router.get(
|
@router.get(
|
||||||
'/',
|
'/',
|
||||||
response_model=list[Dish],
|
response_model=list[Dish],
|
||||||
summary='Получить список блюд',
|
|
||||||
description='Этот метод позволяет получить список всех блюда по UUID'
|
|
||||||
' родительских меню и подменю',
|
|
||||||
)
|
)
|
||||||
async def get_dishes(
|
async def get_dishes(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -32,9 +29,6 @@ async def get_dishes(
|
||||||
'/',
|
'/',
|
||||||
status_code=201,
|
status_code=201,
|
||||||
response_model=Dish,
|
response_model=Dish,
|
||||||
summary='Создать блюдо',
|
|
||||||
description='Этот метод позволяет создать блюдо по UUID'
|
|
||||||
'его родительских меню и подменю',
|
|
||||||
)
|
)
|
||||||
async def create_dish(
|
async def create_dish(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -53,15 +47,6 @@ async def create_dish(
|
||||||
@router.get(
|
@router.get(
|
||||||
'/{dish_id}',
|
'/{dish_id}',
|
||||||
response_model=Dish,
|
response_model=Dish,
|
||||||
summary='Получить блюдо',
|
|
||||||
description='Этот метод позволяет получить блюдо по его UUID'
|
|
||||||
' и UUID его родительских меню',
|
|
||||||
responses={
|
|
||||||
404: {
|
|
||||||
'description': 'Dish not found',
|
|
||||||
'content': {'application/json': {'example': {'detail': 'string'}}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
async def get_dish(
|
async def get_dish(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -69,7 +54,7 @@ async def get_dish(
|
||||||
dish_id: UUID,
|
dish_id: UUID,
|
||||||
dish: DishService = Depends(),
|
dish: DishService = Depends(),
|
||||||
background_tasks: BackgroundTasks = BackgroundTasks(),
|
background_tasks: BackgroundTasks = BackgroundTasks(),
|
||||||
) -> Dish:
|
) -> Dish | None:
|
||||||
result = await dish.read_dish(
|
result = await dish.read_dish(
|
||||||
menu_id,
|
menu_id,
|
||||||
submenu_id,
|
submenu_id,
|
||||||
|
@ -86,15 +71,6 @@ async def get_dish(
|
||||||
@router.patch(
|
@router.patch(
|
||||||
'/{dish_id}',
|
'/{dish_id}',
|
||||||
response_model=Dish,
|
response_model=Dish,
|
||||||
summary='Обновить блюдо',
|
|
||||||
description='Этот метод позволяет обновить блюдо по его UUID'
|
|
||||||
' и UUID родительских меню',
|
|
||||||
responses={
|
|
||||||
404: {
|
|
||||||
'description': 'Dish not found',
|
|
||||||
'content': {'application/json': {'example': {'detail': 'string'}}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
async def update_dish(
|
async def update_dish(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -120,9 +96,6 @@ async def update_dish(
|
||||||
|
|
||||||
@router.delete(
|
@router.delete(
|
||||||
'/{dish_id}',
|
'/{dish_id}',
|
||||||
summary='Удалить блюдо',
|
|
||||||
description='Этот метод позволяет удалить блюдо по его UUID'
|
|
||||||
' и UUID родительских меню',
|
|
||||||
)
|
)
|
||||||
async def delete_dish(
|
async def delete_dish(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
|
|
@ -15,8 +15,6 @@ router = APIRouter(
|
||||||
'/',
|
'/',
|
||||||
status_code=200,
|
status_code=200,
|
||||||
response_model=list[MenuRead],
|
response_model=list[MenuRead],
|
||||||
summary='Получить список меню',
|
|
||||||
description='Этот метод позволяет получить все меню.',
|
|
||||||
)
|
)
|
||||||
async def get_menus(
|
async def get_menus(
|
||||||
menu: MenuService = Depends(),
|
menu: MenuService = Depends(),
|
||||||
|
@ -29,8 +27,6 @@ async def get_menus(
|
||||||
'/',
|
'/',
|
||||||
status_code=201,
|
status_code=201,
|
||||||
response_model=MenuRead,
|
response_model=MenuRead,
|
||||||
summary='Создать меню',
|
|
||||||
description='Этот метод позволяет создать меню',
|
|
||||||
)
|
)
|
||||||
async def add_menu(
|
async def add_menu(
|
||||||
menu: MenuBase,
|
menu: MenuBase,
|
||||||
|
@ -43,14 +39,6 @@ async def add_menu(
|
||||||
@router.get(
|
@router.get(
|
||||||
'/{menu_id}',
|
'/{menu_id}',
|
||||||
response_model=MenuRead,
|
response_model=MenuRead,
|
||||||
summary='Получить меню',
|
|
||||||
description='Этот метод позволяет получить меню по его UUID',
|
|
||||||
responses={
|
|
||||||
404: {
|
|
||||||
'description': 'Menu not found',
|
|
||||||
'content': {'application/json': {'example': {'detail': 'sting'}}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
async def get_menu(
|
async def get_menu(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -70,14 +58,6 @@ async def get_menu(
|
||||||
@router.patch(
|
@router.patch(
|
||||||
'/{menu_id}',
|
'/{menu_id}',
|
||||||
response_model=MenuRead,
|
response_model=MenuRead,
|
||||||
summary='Обновить меню',
|
|
||||||
description='Этот метод позволяет изменить меню по его UUID',
|
|
||||||
responses={
|
|
||||||
404: {
|
|
||||||
'description': 'Menu not found',
|
|
||||||
'content': {'application/json': {'example': {'detail': 'string'}}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
async def update_menu(
|
async def update_menu(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -101,8 +81,6 @@ async def update_menu(
|
||||||
@router.delete(
|
@router.delete(
|
||||||
'/{menu_id}',
|
'/{menu_id}',
|
||||||
status_code=200,
|
status_code=200,
|
||||||
summary='Удалить меню',
|
|
||||||
description='Этот метод позволяет удалить меню по его UUID',
|
|
||||||
)
|
)
|
||||||
async def delete_menu(
|
async def delete_menu(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
|
|
@ -14,9 +14,6 @@ router = APIRouter(
|
||||||
@router.get(
|
@router.get(
|
||||||
'/',
|
'/',
|
||||||
response_model=list[SubMenuRead],
|
response_model=list[SubMenuRead],
|
||||||
summary='Получить список подменю',
|
|
||||||
description='Этот метод позволяет получить список подменю основного меню'
|
|
||||||
' по UUID меню',
|
|
||||||
)
|
)
|
||||||
async def get_submenus(
|
async def get_submenus(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -31,8 +28,6 @@ async def get_submenus(
|
||||||
'/',
|
'/',
|
||||||
status_code=201,
|
status_code=201,
|
||||||
response_model=SubMenuRead,
|
response_model=SubMenuRead,
|
||||||
summary='Создать подменю',
|
|
||||||
description='Этот метод позволяет создать подменю по UUID родителского меню',
|
|
||||||
)
|
)
|
||||||
async def create_submenu_item(
|
async def create_submenu_item(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -50,15 +45,6 @@ async def create_submenu_item(
|
||||||
@router.get(
|
@router.get(
|
||||||
'/{submenu_id}',
|
'/{submenu_id}',
|
||||||
response_model=SubMenuRead,
|
response_model=SubMenuRead,
|
||||||
summary='Получить подменю',
|
|
||||||
description='Этот метод позволяет получить подменю по его UUID'
|
|
||||||
' и UUID родительского меню',
|
|
||||||
responses={
|
|
||||||
404: {
|
|
||||||
'description': 'Submenu not found',
|
|
||||||
'content': {'application/json': {'example': {'detail': 'string'}}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
async def get_submenu(
|
async def get_submenu(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -81,15 +67,6 @@ async def get_submenu(
|
||||||
@router.patch(
|
@router.patch(
|
||||||
'/{submenu_id}',
|
'/{submenu_id}',
|
||||||
response_model=SubMenuRead,
|
response_model=SubMenuRead,
|
||||||
summary='Обновить подменю',
|
|
||||||
description='Этот метод позволяет обновить подменю по его UUID'
|
|
||||||
' и UUID родительского меню',
|
|
||||||
responses={
|
|
||||||
404: {
|
|
||||||
'description': 'Submenu not found',
|
|
||||||
'content': {'application/json': {'example': {'detail': 'string'}}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
)
|
)
|
||||||
async def update_submenu(
|
async def update_submenu(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
@ -114,8 +91,6 @@ async def update_submenu(
|
||||||
|
|
||||||
@router.delete(
|
@router.delete(
|
||||||
'/{submenu_id}',
|
'/{submenu_id}',
|
||||||
summary='Удалить подменю',
|
|
||||||
description='Этот метод позволяет удалить подменю по его UUID',
|
|
||||||
)
|
)
|
||||||
async def delete_submenu(
|
async def delete_submenu(
|
||||||
menu_id: UUID,
|
menu_id: UUID,
|
||||||
|
|
25
manage.py
25
manage.py
|
@ -1,33 +1,11 @@
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
import uvicorn
|
import uvicorn
|
||||||
from fastapi.openapi.utils import get_openapi
|
|
||||||
|
|
||||||
from fastfood.app import create_app
|
|
||||||
from fastfood.repository import create_db_and_tables
|
from fastfood.repository import create_db_and_tables
|
||||||
|
|
||||||
|
|
||||||
def create_openapi():
|
|
||||||
app = create_app()
|
|
||||||
|
|
||||||
with open('openapi.json', 'w') as f:
|
|
||||||
json.dump(
|
|
||||||
get_openapi(
|
|
||||||
title=app.title,
|
|
||||||
version=app.version,
|
|
||||||
openapi_version=app.openapi_version,
|
|
||||||
description=app.description,
|
|
||||||
routes=app.routes,
|
|
||||||
contact=app.contact,
|
|
||||||
license_info=app.license_info,
|
|
||||||
tags=app.openapi_tags,
|
|
||||||
),
|
|
||||||
f,
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def run_app():
|
def run_app():
|
||||||
"""
|
"""
|
||||||
Запуск FastAPI
|
Запуск FastAPI
|
||||||
|
@ -54,6 +32,3 @@ if __name__ == '__main__':
|
||||||
if '--run-test-server' in sys.argv:
|
if '--run-test-server' in sys.argv:
|
||||||
asyncio.run(recreate())
|
asyncio.run(recreate())
|
||||||
run_app()
|
run_app()
|
||||||
|
|
||||||
if 'dump' in sys.argv:
|
|
||||||
create_openapi()
|
|
||||||
|
|
Loading…
Reference in New Issue