175 lines
5.2 KiB
Python
175 lines
5.2 KiB
Python
# app/api/v1/shop.py
|
|
"""Summary description ....
|
|
|
|
This module provides classes and functions for:
|
|
- ....
|
|
- ....
|
|
- ....
|
|
"""
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.api.deps import get_current_user, get_user_shop
|
|
from app.core.database import get_db
|
|
from app.services.shop_service import shop_service
|
|
|
|
from models.api_models import (
|
|
ShopCreate,
|
|
ShopListResponse,
|
|
ShopProductCreate,
|
|
ShopProductResponse,
|
|
ShopResponse,
|
|
)
|
|
from models.database_models import User
|
|
|
|
router = APIRouter()
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
# Shop Management Routes
|
|
@router.post("/shop", response_model=ShopResponse)
|
|
def create_shop(
|
|
shop_data: ShopCreate,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Create a new shop (Protected)."""
|
|
try:
|
|
shop = shop_service.create_shop(
|
|
db=db, shop_data=shop_data, current_user=current_user
|
|
)
|
|
return ShopResponse.model_validate(shop)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Error creating shop: {str(e)}")
|
|
raise HTTPException(status_code=500, detail="Internal server error")
|
|
|
|
|
|
@router.get("/shop", response_model=ShopListResponse)
|
|
def get_shops(
|
|
skip: int = Query(0, ge=0),
|
|
limit: int = Query(100, ge=1, le=1000),
|
|
active_only: bool = Query(True),
|
|
verified_only: bool = Query(False),
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Get shops with filtering (Protected)."""
|
|
try:
|
|
shops, total = shop_service.get_shops(
|
|
db=db,
|
|
current_user=current_user,
|
|
skip=skip,
|
|
limit=limit,
|
|
active_only=active_only,
|
|
verified_only=verified_only,
|
|
)
|
|
|
|
return ShopListResponse(shops=shops, total=total, skip=skip, limit=limit)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Error getting shops: {str(e)}")
|
|
raise HTTPException(status_code=500, detail="Internal server error")
|
|
|
|
|
|
@router.get("/shop/{shop_code}", response_model=ShopResponse)
|
|
def get_shop(
|
|
shop_code: str,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Get shop details (Protected)."""
|
|
try:
|
|
shop = shop_service.get_shop_by_code(
|
|
db=db, shop_code=shop_code, current_user=current_user
|
|
)
|
|
return ShopResponse.model_validate(shop)
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Error getting shop {shop_code}: {str(e)}")
|
|
raise HTTPException(status_code=500, detail="Internal server error")
|
|
|
|
|
|
# Shop Product Management
|
|
@router.post("/shop/{shop_code}/products", response_model=ShopProductResponse)
|
|
def add_product_to_shop(
|
|
shop_code: str,
|
|
shop_product: ShopProductCreate,
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Add existing product to shop catalog with shop-specific settings (Protected)."""
|
|
try:
|
|
# Get and verify shop (using existing dependency)
|
|
shop = get_user_shop(shop_code, current_user, db)
|
|
|
|
# Add product to shop
|
|
new_shop_product = shop_service.add_product_to_shop(
|
|
db=db, shop=shop, shop_product=shop_product
|
|
)
|
|
|
|
# Return with product details
|
|
response = ShopProductResponse.model_validate(new_shop_product)
|
|
response.product = new_shop_product.product
|
|
return response
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Error adding product to shop {shop_code}: {str(e)}")
|
|
raise HTTPException(status_code=500, detail="Internal server error")
|
|
|
|
|
|
@router.get("/shop/{shop_code}/products")
|
|
def get_shop_products(
|
|
shop_code: str,
|
|
skip: int = Query(0, ge=0),
|
|
limit: int = Query(100, ge=1, le=1000),
|
|
active_only: bool = Query(True),
|
|
featured_only: bool = Query(False),
|
|
db: Session = Depends(get_db),
|
|
current_user: User = Depends(get_current_user),
|
|
):
|
|
"""Get products in shop catalog (Protected)."""
|
|
try:
|
|
# Get shop
|
|
shop = shop_service.get_shop_by_code(
|
|
db=db, shop_code=shop_code, current_user=current_user
|
|
)
|
|
|
|
# Get shop products
|
|
shop_products, total = shop_service.get_shop_products(
|
|
db=db,
|
|
shop=shop,
|
|
current_user=current_user,
|
|
skip=skip,
|
|
limit=limit,
|
|
active_only=active_only,
|
|
featured_only=featured_only,
|
|
)
|
|
|
|
# Format response
|
|
products = []
|
|
for sp in shop_products:
|
|
product_response = ShopProductResponse.model_validate(sp)
|
|
product_response.product = sp.product
|
|
products.append(product_response)
|
|
|
|
return {
|
|
"products": products,
|
|
"total": total,
|
|
"skip": skip,
|
|
"limit": limit,
|
|
"shop": ShopResponse.model_validate(shop),
|
|
}
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f"Error getting products for shop {shop_code}: {str(e)}")
|
|
raise HTTPException(status_code=500, detail="Internal server error")
|