flow using openapi.json

develop
Сергей Ванюшкин 2024-02-06 22:41:29 +03:00
parent f8cca4b861
commit ee709a489e
5 changed files with 11 additions and 172 deletions

View File

@ -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

View File

@ -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,

View File

@ -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,

View File

@ -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,

View File

@ -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()