Создал api для submenu. Test OK

This commit is contained in:
2024-01-21 06:25:32 +03:00
parent f8eca2e832
commit ad497254cd
7 changed files with 198 additions and 4 deletions

View File

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

View File

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

View File

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

View File

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

View File

@@ -21,3 +21,9 @@ class Menu(MenuBase):
class Config:
from_attributes = True
class SubmenuBase(MenuBase):
pass