85 lines
3.0 KiB
Python
85 lines
3.0 KiB
Python
from typing import List, Optional
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException, Query, BackgroundTasks
|
|
from sqlalchemy.orm import Session
|
|
from app.core.database import get_db
|
|
from app.api.deps import get_current_user
|
|
from app.tasks.background_tasks import process_marketplace_import
|
|
from middleware.decorators import rate_limit
|
|
from models.api_models import MarketplaceImportJobResponse, MarketplaceImportRequest
|
|
from models.database_models import User, MarketplaceImportJob, Shop
|
|
from datetime import datetime
|
|
import logging
|
|
|
|
router = APIRouter()
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
# Enhanced Statistics with Marketplace Support
|
|
@router.get("/stats", response_model=StatsResponse)
|
|
def get_stats(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
|
|
"""Get comprehensive statistics with marketplace data (Protected)"""
|
|
|
|
# Use more efficient queries with proper indexes
|
|
total_products = db.query(Product).count()
|
|
|
|
unique_brands = db.query(Product.brand).filter(
|
|
Product.brand.isnot(None),
|
|
Product.brand != ""
|
|
).distinct().count()
|
|
|
|
unique_categories = db.query(Product.google_product_category).filter(
|
|
Product.google_product_category.isnot(None),
|
|
Product.google_product_category != ""
|
|
).distinct().count()
|
|
|
|
# New marketplace statistics
|
|
unique_marketplaces = db.query(Product.marketplace).filter(
|
|
Product.marketplace.isnot(None),
|
|
Product.marketplace != ""
|
|
).distinct().count()
|
|
|
|
unique_shops = db.query(Product.shop_name).filter(
|
|
Product.shop_name.isnot(None),
|
|
Product.shop_name != ""
|
|
).distinct().count()
|
|
|
|
# Stock statistics
|
|
total_stock_entries = db.query(Stock).count()
|
|
total_inventory = db.query(func.sum(Stock.quantity)).scalar() or 0
|
|
|
|
return StatsResponse(
|
|
total_products=total_products,
|
|
unique_brands=unique_brands,
|
|
unique_categories=unique_categories,
|
|
unique_marketplaces=unique_marketplaces,
|
|
unique_shops=unique_shops,
|
|
total_stock_entries=total_stock_entries,
|
|
total_inventory_quantity=total_inventory
|
|
)
|
|
|
|
|
|
@router.get("/marketplace-stats", response_model=List[MarketplaceStatsResponse])
|
|
def get_marketplace_stats(db: Session = Depends(get_db), current_user: User = Depends(get_current_user)):
|
|
"""Get statistics broken down by marketplace (Protected)"""
|
|
|
|
# Query to get stats per marketplace
|
|
marketplace_stats = db.query(
|
|
Product.marketplace,
|
|
func.count(Product.id).label('total_products'),
|
|
func.count(func.distinct(Product.shop_name)).label('unique_shops'),
|
|
func.count(func.distinct(Product.brand)).label('unique_brands')
|
|
).filter(
|
|
Product.marketplace.isnot(None)
|
|
).group_by(Product.marketplace).all()
|
|
|
|
return [
|
|
MarketplaceStatsResponse(
|
|
marketplace=stat.marketplace,
|
|
total_products=stat.total_products,
|
|
unique_shops=stat.unique_shops,
|
|
unique_brands=stat.unique_brands
|
|
) for stat in marketplace_stats
|
|
]
|
|
|