Создал api для submenu. Test OK
This commit is contained in:
@@ -6,7 +6,7 @@ class Settings(BaseSettings):
|
||||
DB_PORT: int = 5432
|
||||
DB_USER: str = "postrges"
|
||||
DB_PASS: str = "postgres"
|
||||
DB_NAME: str = "demo_db"
|
||||
DB_NAME: str = "postgres"
|
||||
|
||||
@property
|
||||
def DATABASE_URL_asyncpg(self):
|
||||
|
@@ -55,3 +55,54 @@ class Crud:
|
||||
query = delete(models.Menu).where(models.Menu.id == menu_id)
|
||||
await session.execute(query)
|
||||
await session.commit()
|
||||
|
||||
@staticmethod
|
||||
async def get_submenus(menu_id: UUID, session: AsyncSession):
|
||||
async with session:
|
||||
query = select(models.SubMenu).where(models.SubMenu.parent_menu == menu_id)
|
||||
submenus = await session.execute(query)
|
||||
return submenus.scalars().all()
|
||||
|
||||
@staticmethod
|
||||
async def create_submenu_item(
|
||||
menu_id: UUID, submenu: schemas.SubmenuBase, session: AsyncSession,
|
||||
):
|
||||
async with session:
|
||||
new_submenu = models.SubMenu(**submenu.model_dump())
|
||||
new_submenu.parent_menu = menu_id
|
||||
session.add(new_submenu)
|
||||
await session.flush()
|
||||
await session.commit()
|
||||
return new_submenu
|
||||
|
||||
@staticmethod
|
||||
async def get_submenu_item(
|
||||
menu_id: UUID, submenu_id: UUID, session: AsyncSession,
|
||||
):
|
||||
async with session:
|
||||
query = select(models.SubMenu).where(models.SubMenu.id == submenu_id)
|
||||
submenu = await session.execute(query)
|
||||
return submenu.scalars().one_or_none()
|
||||
|
||||
@staticmethod
|
||||
async def update_submenu_item(
|
||||
submenu_id: UUID,
|
||||
submenu: schemas.MenuBase,
|
||||
session: AsyncSession,
|
||||
):
|
||||
async with session:
|
||||
query = update(models.SubMenu).where(models.SubMenu.id == submenu_id).values(**submenu.model_dump())
|
||||
await session.execute(query)
|
||||
await session.commit()
|
||||
qr = select(models.SubMenu).where(models.SubMenu.id == submenu_id)
|
||||
updated_submenu = await session.execute(qr)
|
||||
return updated_submenu.scalars().one()
|
||||
|
||||
@staticmethod
|
||||
async def delete_submenu_item(submenu_id: UUID, session: AsyncSession):
|
||||
async with session:
|
||||
query = delete(models.SubMenu).where(models.SubMenu.id == submenu_id)
|
||||
await session.execute(query)
|
||||
await session.commit()
|
||||
|
||||
|
||||
|
@@ -27,7 +27,7 @@ class Menu(Base):
|
||||
id: Mapped[uuidpk]
|
||||
title: Mapped[str_25]
|
||||
description: Mapped[Optional[str]]
|
||||
submenus: Mapped[List["SubMenu"]] = relationship()
|
||||
submenus: Mapped[List["SubMenu"]] = relationship("SubMenu", backref="menu", lazy='dynamic')
|
||||
|
||||
|
||||
class SubMenu(Base):
|
||||
@@ -36,7 +36,7 @@ class SubMenu(Base):
|
||||
id: Mapped[uuidpk]
|
||||
title: Mapped[str_25]
|
||||
description: Mapped[Optional[str]]
|
||||
parent_menu: Mapped[UUID] = mapped_column(ForeignKey("menu.id"))
|
||||
parent_menu: Mapped[uuid.UUID] = mapped_column(ForeignKey("menu.id"))
|
||||
dishes: Mapped[List["Dish"]] = relationship()
|
||||
|
||||
|
||||
|
@@ -53,3 +53,58 @@ async def update_menu(
|
||||
@router.delete("/api/v1/menus/{menu_id}")
|
||||
async def delete_menu(menu_id: UUID, session: AsyncSession = Depends(get_async_session)):
|
||||
await crud.delete_menu_item(menu_id=menu_id, session=session)
|
||||
|
||||
|
||||
@router.get("/api/v1/menus/{menu_id}/submenus")
|
||||
async def get_submenus(
|
||||
menu_id: UUID,
|
||||
session: AsyncSession = Depends(get_async_session)
|
||||
):
|
||||
result = await crud.get_submenus(menu_id=menu_id, session=session)
|
||||
return result
|
||||
|
||||
|
||||
@router.post("/api/v1/menus/{menu_id}/submenus", status_code=201)
|
||||
async def create_submenu_item(
|
||||
menu_id: UUID,
|
||||
submenu: schemas.SubmenuBase,
|
||||
session: AsyncSession = Depends(get_async_session),
|
||||
):
|
||||
result = await crud.create_submenu_item(
|
||||
menu_id=menu_id,
|
||||
submenu=submenu,
|
||||
session=session,
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
@router.get("/api/v1/menus/{menu_id}/submenus/{submenu_id}")
|
||||
async def get_submenu(
|
||||
menu_id: UUID,
|
||||
submenu_id: UUID,
|
||||
session: AsyncSession = Depends(get_async_session),
|
||||
):
|
||||
result = await crud.get_submenu_item(
|
||||
menu_id=menu_id, submenu_id=submenu_id, session=session,
|
||||
)
|
||||
if not result:
|
||||
raise HTTPException(status_code=404, detail="submenu not found")
|
||||
return result
|
||||
|
||||
|
||||
@router.patch("/api/v1/menus/{menu_id}/submenus/{submenu_id}", response_model=schemas.MenuBase)
|
||||
async def update_submenu(
|
||||
menu_id: UUID,
|
||||
submenu_id: UUID,
|
||||
submenu: schemas.MenuBase,
|
||||
session: AsyncSession = Depends(get_async_session),
|
||||
):
|
||||
result = await crud.update_submenu_item(
|
||||
submenu_id=submenu_id, submenu=submenu, session=session,
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
@router.delete("/api/v1/menus/{menu_id}/submenus/{submenu_id}")
|
||||
async def delete_menu(menu_id: UUID, submenu_id: UUID, session: AsyncSession = Depends(get_async_session)):
|
||||
await crud.delete_submenu_item(submenu_id=submenu_id, session=session)
|
||||
|
@@ -21,3 +21,9 @@ class Menu(MenuBase):
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class SubmenuBase(MenuBase):
|
||||
pass
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user