diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 4cf9f04f15c297c7025dd3d57e3d9b1960553768..6a635c83368978d7d8d2b227b46cf0e3061d4388 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -8,12 +8,19 @@ variables: PIP_CACHE_DIR: $CI_PROJECT_DIR/.pip_cache cache: + key: dependencies-cache paths: - $PIP_CACHE_DIR + policy: pull-push before_script: - python -m venv $VENV_DIR - - source $VENV_DIR/Scripts/activate + - | + if [[ "$OSTYPE" == "msys" ]]; then + source $VENV_DIR/Scripts/activate + else + source $VENV_DIR/bin/activate + fi - pip install --upgrade pip - pip install -r requirements.txt --cache-dir $PIP_CACHE_DIR @@ -21,6 +28,7 @@ install_dependencies: stage: install script: - echo "Dependencies installed successfully." + timeout: 20m run_tests: stage: test diff --git a/app/backend/database.py b/app/backend/database.py index 51f1c51e33690b2efbda063586678188c91e6dfa..340a31feb280d4c31374a3f97629d4ac2dc4bac6 100644 --- a/app/backend/database.py +++ b/app/backend/database.py @@ -7,8 +7,8 @@ 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) + 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 index e2550dfc5253d893607822247aa3681f1a514bf9..f7a55b4eebfe187e36075be20138792aa6826c24 100644 --- a/app/backend/dummy_data.py +++ b/app/backend/dummy_data.py @@ -34,11 +34,49 @@ def insert_dummy_data(session: Session): shops = [ Shop( owner_id=2, - name=f"Shop{i}", - description=f"Description for Shop {i}", + name="Google HQ", + description="Google Headquarters", image_url="app/static/default/default_shop.png", - ) - for i in range(1, 6) + address="1600 Amphitheatre Parkway, Mountain View, CA", + latitude=37.4220656, + longitude=-122.0840897, + ), + Shop( + owner_id=2, + name="Apple HQ", + description="Apple Headquarters", + image_url="app/static/default/default_shop.png", + address="1 Infinite Loop, Cupertino, CA", + latitude=37.33182, + longitude=-122.03118, + ), + Shop( + owner_id=2, + name="Empire State Building", + description="Famous skyscraper in New York", + image_url="app/static/default/default_shop.png", + address="350 Fifth Avenue, New York, NY", + latitude=40.748817, + longitude=-73.985428, + ), + Shop( + owner_id=2, + name="Sherlock's Home", + description="Fictional detective's residence", + image_url="app/static/default/default_shop.png", + address="221B Baker Street, London, UK", + latitude=51.523767, + longitude=-0.1585557, + ), + Shop( + owner_id=2, + name="Eiffel Tower", + description="Iconic landmark in Paris", + image_url="app/static/default/default_shop.png", + address="Eiffel Tower, Paris, France", + latitude=48.8588443, + longitude=2.2943506, + ), ] session.add_all(shops) session.commit() @@ -75,8 +113,56 @@ def insert_dummy_data(session: Session): 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) + Order( + user_id=1, + shop_id=1, + total_price=150.0, + shipping_price=10.0, + status="pending", + delivery_address="1600 Amphitheatre Parkway, Mountain View, CA", + delivery_latitude=37.4220656, + delivery_longitude=-122.0840897, + ), + Order( + user_id=1, + shop_id=2, + total_price=200.0, + shipping_price=15.0, + status="shipped", + delivery_address="1 Infinite Loop, Cupertino, CA", + delivery_latitude=37.33182, + delivery_longitude=-122.03118, + ), + Order( + user_id=1, + shop_id=3, + total_price=250.0, + shipping_price=20.0, + status="delivered", + delivery_address="350 Fifth Avenue, New York, NY", + delivery_latitude=40.748817, + delivery_longitude=-73.985428, + ), + Order( + user_id=1, + shop_id=4, + total_price=300.0, + shipping_price=25.0, + status="pending", + delivery_address="221B Baker Street, London, UK", + delivery_latitude=51.523767, + delivery_longitude=-0.1585557, + ), + Order( + user_id=1, + shop_id=5, + total_price=350.0, + shipping_price=30.0, + status="canceled", + delivery_address="Eiffel Tower, Paris, France", + delivery_latitude=48.8588443, + delivery_longitude=2.2943506, + ), ] session.add_all(orders) session.commit() diff --git a/app/backend/routes/product.py b/app/backend/routes/product.py index cadfba24acfe07e4b53d4151e7502f0492174415..fcad951db6c8c2d2cf4b7727a2c555599cb95b6b 100644 --- a/app/backend/routes/product.py +++ b/app/backend/routes/product.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form -from sqlmodel import Session +from sqlmodel import Session, func from datetime import datetime -from backend.models.models import Product, ProductImage, User, Shop +from backend.models.models import Product, ProductImage, User, Shop, OrderItem from backend.schemas.product import ProductRead, ProductUpdate from backend.database import get_session from backend.routes.auth import get_current_user @@ -76,8 +76,21 @@ def create_product( @router.get("/list", response_model=list[ProductRead]) -def read_all_products(session: Session = Depends(get_session)): - products = session.query(Product).all() +def read_all_products(order: str = "desc", session: Session = Depends(get_session)): + order_by = ( + func.count(OrderItem.id).desc() + if order == "desc" + else func.count(OrderItem.id).asc() + ) + + products = ( + session.query(Product) + .outerjoin(OrderItem, Product.id == OrderItem.product_id) + .group_by(Product.id) + .order_by(order_by) + .all() + ) + return products diff --git a/app/backend/routes/shop.py b/app/backend/routes/shop.py index 2ce59c7996df14c40ed37f926e64349a85cb6c88..a240d1be12ee0774988de102a631da60042acbc5 100644 --- a/app/backend/routes/shop.py +++ b/app/backend/routes/shop.py @@ -1,7 +1,7 @@ from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Form -from sqlmodel import Session +from sqlmodel import Session, func from geopy.geocoders import Nominatim -from backend.models.models import Shop, User +from backend.models.models import Shop, User, Order from backend.schemas.shop import ShopRead from backend.database import get_session from backend.routes.auth import get_current_user @@ -57,8 +57,19 @@ def create_shop( @router.get("/list", response_model=list[ShopRead]) -def get_all_shops(session: Session = Depends(get_session)): - shops = session.query(Shop).all() +def get_all_shops(order: str = "desc", session: Session = Depends(get_session)): + order_by = ( + func.count(Order.id).desc() if order == "desc" else func.count(Order.id).asc() + ) + + shops = ( + session.query(Shop) + .outerjoin(Order, Shop.id == Order.shop_id) + .group_by(Shop.id) + .order_by(order_by) + .all() + ) + return shops