filter products
This commit is contained in:
parent
03d1bcb40b
commit
71ef6cd954
5 changed files with 32 additions and 7 deletions
|
@ -1,6 +1,17 @@
|
|||
from fastapi import FastAPI
|
||||
from .router import router
|
||||
from .settings import Settings
|
||||
from fastapi.middleware.cors import CORSMiddleware
|
||||
|
||||
|
||||
app = FastAPI(title="Fooder")
|
||||
app.include_router(router)
|
||||
|
||||
|
||||
app.add_middleware(
|
||||
CORSMiddleware,
|
||||
allow_origins=Settings().ALLOWED_ORIGINS,
|
||||
allow_credentials=True,
|
||||
allow_methods=["*"],
|
||||
allow_headers=["*"],
|
||||
)
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
from typing import AsyncIterator
|
||||
from typing import AsyncIterator, Optional
|
||||
|
||||
from fastapi import HTTPException
|
||||
|
||||
|
@ -24,9 +24,11 @@ class CreateProduct(AuthorizedController):
|
|||
|
||||
|
||||
class ListProduct(AuthorizedController):
|
||||
async def call(self, limit: int, offset: int) -> AsyncIterator[Product]:
|
||||
async def call(
|
||||
self, limit: int, offset: int, q: Optional[str]
|
||||
) -> AsyncIterator[Product]:
|
||||
async with self.async_session() as session:
|
||||
async for product in DBProduct.list_all(
|
||||
session, limit=limit, offset=offset
|
||||
session, limit=limit, offset=offset, q=q
|
||||
):
|
||||
yield Product.from_orm(product)
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
from sqlalchemy.orm import Mapped
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from typing import AsyncIterator
|
||||
from typing import AsyncIterator, Optional
|
||||
|
||||
from .base import Base, CommonMixin
|
||||
|
||||
|
@ -24,8 +24,15 @@ class Product(Base, CommonMixin):
|
|||
return self.protein * 4 + self.carb * 4 + self.fat * 9
|
||||
|
||||
@classmethod
|
||||
async def list_all(cls, session: AsyncSession, offset: int, limit: int):
|
||||
query = select(cls).offset(offset).limit(limit)
|
||||
async def list_all(
|
||||
cls, session: AsyncSession, offset: int, limit: int, q: Optional[str] = None
|
||||
) -> AsyncIterator["Product"]:
|
||||
query = select(cls)
|
||||
|
||||
if q:
|
||||
query = query.filter(cls.name.ilike(f"%{q.lower()}%"))
|
||||
|
||||
query = query.offset(offset).limit(limit)
|
||||
stream = await session.stream_scalars(query.order_by(cls.id))
|
||||
async for row in stream:
|
||||
yield row
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
from pydantic import BaseSettings
|
||||
from typing import List
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
|
@ -10,3 +11,5 @@ class Settings(BaseSettings):
|
|||
SECRET_KEY: str
|
||||
ALGORITHM: str = "HS256"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES: int = 30
|
||||
|
||||
ALLOWED_ORIGINS: List[str] = ["*"]
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
from fastapi import APIRouter, Depends, Request
|
||||
from ..model.product import Product, CreateProductPayload, ListProductPayload
|
||||
from ..controller.product import ListProduct, CreateProduct
|
||||
from typing import Optional
|
||||
|
||||
|
||||
router = APIRouter(tags=["product"])
|
||||
|
@ -12,9 +13,10 @@ async def list_product(
|
|||
controller: ListProduct = Depends(ListProduct),
|
||||
limit: int = 10,
|
||||
offset: int = 0,
|
||||
q: Optional[str] = None,
|
||||
):
|
||||
return ListProductPayload(
|
||||
products=[p async for p in controller.call(limit=limit, offset=offset)]
|
||||
products=[p async for p in controller.call(limit=limit, offset=offset, q=q)]
|
||||
)
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue