- Create comprehensive stats schemas in models/schema/stats.py: - ImportStatsResponse, UserStatsResponse, ProductStatsResponse - PlatformStatsResponse, AdminDashboardResponse - VendorDashboardStatsResponse with nested models - VendorAnalyticsResponse, CodeQualityDashboardStatsResponse - Move DashboardStatsResponse from code_quality.py to schema file - Fix get_vendor_statistics() to return pending_vendors field - Fix get_vendor_stats() to return flat structure matching schema - Add response_model to all stats endpoints: - GET /admin/dashboard -> AdminDashboardResponse - GET /admin/dashboard/stats/platform -> PlatformStatsResponse - GET /admin/marketplace-import-jobs/stats -> ImportStatsResponse - GET /vendor/dashboard/stats -> VendorDashboardStatsResponse - GET /vendor/analytics -> VendorAnalyticsResponse - Enhance API-001 architecture rule with detailed guidance - Add SVC-007 rule for service/schema compatibility 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
120 lines
4.4 KiB
Python
120 lines
4.4 KiB
Python
# app/api/v1/admin/dashboard.py
|
|
"""
|
|
Admin dashboard and statistics endpoints.
|
|
"""
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, Depends
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.api.deps import get_current_admin_api
|
|
from app.core.database import get_db
|
|
from app.services.admin_service import admin_service
|
|
from app.services.stats_service import stats_service
|
|
from models.database.user import User
|
|
from models.schema.stats import (
|
|
AdminDashboardResponse,
|
|
ImportStatsResponse,
|
|
MarketplaceStatsResponse,
|
|
OrderStatsBasicResponse,
|
|
PlatformStatsResponse,
|
|
ProductStatsResponse,
|
|
StatsResponse,
|
|
UserStatsResponse,
|
|
VendorStatsResponse,
|
|
)
|
|
|
|
router = APIRouter(prefix="/dashboard")
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@router.get("", response_model=AdminDashboardResponse)
|
|
def get_admin_dashboard(
|
|
db: Session = Depends(get_db),
|
|
current_admin: User = Depends(get_current_admin_api),
|
|
):
|
|
"""Get admin dashboard with platform statistics (Admin only)."""
|
|
user_stats = stats_service.get_user_statistics(db)
|
|
vendor_stats = stats_service.get_vendor_statistics(db)
|
|
|
|
return AdminDashboardResponse(
|
|
platform={
|
|
"name": "Multi-Tenant Ecommerce Platform",
|
|
"version": "1.0.0",
|
|
},
|
|
users=UserStatsResponse(**user_stats),
|
|
vendors=VendorStatsResponse(
|
|
total=vendor_stats.get("total", vendor_stats.get("total_vendors", 0)),
|
|
verified=vendor_stats.get("verified", vendor_stats.get("verified_vendors", 0)),
|
|
pending=vendor_stats.get("pending", vendor_stats.get("pending_vendors", 0)),
|
|
inactive=vendor_stats.get("inactive", vendor_stats.get("inactive_vendors", 0)),
|
|
),
|
|
recent_vendors=admin_service.get_recent_vendors(db, limit=5),
|
|
recent_imports=admin_service.get_recent_import_jobs(db, limit=10),
|
|
)
|
|
|
|
|
|
@router.get("/stats", response_model=StatsResponse)
|
|
def get_comprehensive_stats(
|
|
db: Session = Depends(get_db),
|
|
current_admin: User = Depends(get_current_admin_api),
|
|
):
|
|
"""Get comprehensive platform statistics (Admin only)."""
|
|
stats_data = stats_service.get_comprehensive_stats(db=db)
|
|
|
|
return StatsResponse(
|
|
total_products=stats_data["total_products"],
|
|
unique_brands=stats_data["unique_brands"],
|
|
unique_categories=stats_data["unique_categories"],
|
|
unique_marketplaces=stats_data["unique_marketplaces"],
|
|
unique_vendors=stats_data["unique_vendors"],
|
|
total_inventory_entries=stats_data["total_inventory_entries"],
|
|
total_inventory_quantity=stats_data["total_inventory_quantity"],
|
|
)
|
|
|
|
|
|
@router.get("/stats/marketplace", response_model=list[MarketplaceStatsResponse])
|
|
def get_marketplace_stats(
|
|
db: Session = Depends(get_db),
|
|
current_admin: User = Depends(get_current_admin_api),
|
|
):
|
|
"""Get statistics broken down by marketplace (Admin only)."""
|
|
marketplace_stats = stats_service.get_marketplace_breakdown_stats(db=db)
|
|
|
|
return [
|
|
MarketplaceStatsResponse(
|
|
marketplace=stat["marketplace"],
|
|
total_products=stat["total_products"],
|
|
unique_vendors=stat["unique_vendors"],
|
|
unique_brands=stat["unique_brands"],
|
|
)
|
|
for stat in marketplace_stats
|
|
]
|
|
|
|
|
|
@router.get("/stats/platform", response_model=PlatformStatsResponse)
|
|
def get_platform_statistics(
|
|
db: Session = Depends(get_db),
|
|
current_admin: User = Depends(get_current_admin_api),
|
|
):
|
|
"""Get comprehensive platform statistics (Admin only)."""
|
|
user_stats = stats_service.get_user_statistics(db)
|
|
vendor_stats = stats_service.get_vendor_statistics(db)
|
|
product_stats = stats_service.get_product_statistics(db)
|
|
order_stats = stats_service.get_order_statistics(db)
|
|
import_stats = stats_service.get_import_statistics(db)
|
|
|
|
return PlatformStatsResponse(
|
|
users=UserStatsResponse(**user_stats),
|
|
vendors=VendorStatsResponse(
|
|
total=vendor_stats.get("total", vendor_stats.get("total_vendors", 0)),
|
|
verified=vendor_stats.get("verified", vendor_stats.get("verified_vendors", 0)),
|
|
pending=vendor_stats.get("pending", vendor_stats.get("pending_vendors", 0)),
|
|
inactive=vendor_stats.get("inactive", vendor_stats.get("inactive_vendors", 0)),
|
|
),
|
|
products=ProductStatsResponse(**product_stats),
|
|
orders=OrderStatsBasicResponse(**order_stats),
|
|
imports=ImportStatsResponse(**import_stats),
|
|
)
|