diff --git a/app/backend/database.py b/app/backend/database.py index d394b3c74e3b02c20656f0708626169bb9e33ec8..340a31feb280d4c31374a3f97629d4ac2dc4bac6 100644 --- a/app/backend/database.py +++ b/app/backend/database.py @@ -1,11 +1,14 @@ from sqlmodel import SQLModel, Session, create_engine from app.core.config import settings +from backend.dummy_data import insert_dummy_data engine = create_engine(settings.database_url, echo=settings.debug) def init_db(): SQLModel.metadata.create_all(engine, checkfirst=True) + with Session(engine) as session: + insert_dummy_data(session) def get_session(): diff --git a/app/backend/dummy_data.py b/app/backend/dummy_data.py new file mode 100644 index 0000000000000000000000000000000000000000..e2550dfc5253d893607822247aa3681f1a514bf9 --- /dev/null +++ b/app/backend/dummy_data.py @@ -0,0 +1,90 @@ +from sqlmodel import Session +from backend.models.models import ( + User, + Shop, + Category, + Product, + ProductImage, + Order, + OrderItem, +) +from backend.utils.hashing import hash_password + + +def insert_dummy_data(session: Session): + if not session.query(User).first(): + users = [ + User( + username="string", + email="user@example.com", + password=hash_password("string"), + role="customer", + ), + User( + username="shop_owner", + email="owner@example.com", + password=hash_password("string"), + role="shop_owner", + ), + ] + session.add_all(users) + session.commit() + + if not session.query(Shop).first(): + shops = [ + Shop( + owner_id=2, + name=f"Shop{i}", + description=f"Description for Shop {i}", + image_url="app/static/default/default_shop.png", + ) + for i in range(1, 6) + ] + session.add_all(shops) + session.commit() + + if not session.query(Category).first(): + categories = [Category(name=f"Category{i}") for i in range(1, 6)] + session.add_all(categories) + session.commit() + + if not session.query(Product).first(): + products = [ + Product( + shop_id=i, + category_id=i, + name=f"Product{i}", + description=f"Description for Product {i}", + price=99.99 + i, + stock=10 * i, + ) + for i in range(1, 6) + ] + session.add_all(products) + session.commit() + + if not session.query(ProductImage).first(): + images = [ + ProductImage( + product_id=i, image_url="app/static/default/default_product.png" + ) + for i in range(1, 6) + ] + session.add_all(images) + session.commit() + + if not session.query(Order).first(): + orders = [ + Order(user_id=1, shop_id=i, total_price=100 + (i * 50), status="pending") + for i in range(1, 6) + ] + session.add_all(orders) + session.commit() + + if not session.query(OrderItem).first(): + order_items = [ + OrderItem(order_id=i, product_id=i, quantity=i, price=99.99 + i) + for i in range(1, 6) + ] + session.add_all(order_items) + session.commit() diff --git a/app/backend/main.py b/app/backend/main.py index f903ab4ffff2e2da8315caf0b43cdd4cb80f770e..fc140a3e41980616925b92974b0e529b05509921 100644 --- a/app/backend/main.py +++ b/app/backend/main.py @@ -4,7 +4,7 @@ import os sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) from fastapi import FastAPI -from backend.routes import auth, shop, product, category +from backend.routes import auth, shop, product, category, search from backend.database import init_db from core.config import settings @@ -14,13 +14,13 @@ app = FastAPI(title="Shopping App", version="1.0.0", debug=settings.debug) init_db() # Include API routes +app.include_router(search.router, prefix="/search", tags=["search"]) app.include_router(auth.router, prefix="/auth", tags=["auth"]) app.include_router(shop.router, prefix="/shops", tags=["shops"]) app.include_router(product.router, prefix="/product", tags=["product"]) app.include_router(category.router, prefix="/category", tags=["category"]) - @app.get("/") async def root(): return {"message": "Welcome to the shopping app api"} diff --git a/app/backend/routes/search.py b/app/backend/routes/search.py new file mode 100644 index 0000000000000000000000000000000000000000..20ff7f954df064a8e419b69f5fac421ff05a0e3f --- /dev/null +++ b/app/backend/routes/search.py @@ -0,0 +1,37 @@ +from fastapi import APIRouter, Depends, Query +from sqlalchemy.orm import Session +from sqlalchemy.orm import joinedload +from backend.database import get_session +from backend.models.models import Shop, Product, Category +from typing import List, Union + +router = APIRouter() + + +@router.get("/search", response_model=List[Union[Shop, Product]]) +def search( + name: str = Query(None, description="Name to search"), + category: str = Query(None, description="Category to filter by (for products)"), + search_type: str = Query( + "both", description="Search type: 'shops', 'products', or 'both'" + ), + db: Session = Depends(get_session), +): + results = [] + if search_type in ["shops", "both"]: + shop_query = db.query(Shop) + if name: + shop_query = shop_query.filter(Shop.name.ilike(f"%{name}%")) + results.extend(shop_query.all()) + + if search_type in ["products", "both"]: + product_query = db.query(Product).options(joinedload(Product.category)) + if name: + product_query = product_query.filter(Product.name.ilike(f"%{name}%")) + if category: + product_query = product_query.join(Category).filter( + Category.name.ilike(f"%{category}%") + ) + results.extend(product_query.all()) + + return results