# app/api/v1/vendor.py """ Vendor endpoints - simplified with service-level exception handling. This module provides classes and functions for: - Vendor CRUD operations and management - Vendor product catalog management - Vendor filtering and verification """ import logging from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.api.deps import get_current_user, get_user_vendor from app.core.database import get_db from app.services.vendor_service import vendor_service from models.schemas.vendor import (VendorCreate, VendorListResponse, VendorResponse) from models.schemas.product import (ProductCreate,ProductResponse) from models.database.user import User router = APIRouter() logger = logging.getLogger(__name__) @router.post("/vendor", response_model=VendorResponse) def create_vendor( vendor_data: VendorCreate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Create a new vendor (Protected).""" vendor = vendor_service.create_vendor( db=db, vendor_data=vendor_data, current_user=current_user ) return VendorResponse.model_validate(vendor) @router.get("/vendor", response_model=VendorListResponse) def get_vendors( 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 vendors with filtering (Protected).""" vendors, total = vendor_service.get_vendors( db=db, current_user=current_user, skip=skip, limit=limit, active_only=active_only, verified_only=verified_only, ) return VendorListResponse(vendors=vendors, total=total, skip=skip, limit=limit) @router.get("/vendor/{vendor_code}", response_model=VendorResponse) def get_vendor( vendor_code: str, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Get vendor details (Protected).""" vendor = vendor_service.get_vendor_by_code( db=db, vendor_code=vendor_code, current_user=current_user ) return VendorResponse.model_validate(vendor) @router.post("/vendor/{vendor_code}/products", response_model=ProductResponse) def add_product_to_catalog( vendor_code: str, product: ProductCreate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user), ): """Add existing product to vendor catalog with vendor -specific settings (Protected).""" # Get and verify vendor (using existing dependency) vendor = get_user_vendor(vendor_code, current_user, db) # Add product to vendor new_product = vendor_service.add_product_to_catalog( db=db, vendor=vendor, product=product ) # Return with product details response = ProductResponse.model_validate(new_product) response.marketplace_product = new_product.marketplace_product return response @router.get("/vendor/{vendor_code}/products") def get_products( vendor_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 vendor catalog (Protected).""" # Get vendor vendor = vendor_service.get_vendor_by_code( db=db, vendor_code=vendor_code, current_user=current_user ) # Get vendor products vendor_products, total = vendor_service.get_products( db=db, vendor=vendor, current_user=current_user, skip=skip, limit=limit, active_only=active_only, featured_only=featured_only, ) # Format response products = [] for vp in vendor_products: product_response = ProductResponse.model_validate(vp) product_response.marketplace_product = vp.marketplace_product products.append(product_response) return { "products": products, "total": total, "skip": skip, "limit": limit, "vendor": VendorResponse.model_validate(vendor), }