# app/api/v1/vendor/vendor.py """ Vendor management endpoints for vendor-scoped operations. This module provides: - Vendor profile management - Vendor settings configuration - Vendor team member management - Vendor dashboard statistics """ import logging from typing import List, Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.api.deps import get_current_user from app.core.database import get_db from middleware.vendor_context import require_vendor_context from app.services.vendor_service import vendor_service from app.services.team_service import team_service from models.schema.vendor import VendorUpdate, VendorResponse from models.schema.product import ProductResponse, ProductListResponse from models.database.user import User from models.database.vendor import Vendor router = APIRouter() logger = logging.getLogger(__name__) # ============================================================================ # VENDOR PROFILE ENDPOINTS # ============================================================================ @router.get("/profile", response_model=VendorResponse) def get_vendor_profile( vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get current vendor profile information.""" return vendor @router.put("/profile", response_model=VendorResponse) def update_vendor_profile( vendor_update: VendorUpdate, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Update vendor profile information.""" # Verify user has permission to update vendor if not vendor_service.can_update_vendor(vendor, current_user): from fastapi import HTTPException raise HTTPException(status_code=403, detail="Insufficient permissions") return vendor_service.update_vendor(db, vendor.id, vendor_update) # ============================================================================ # VENDOR SETTINGS ENDPOINTS # ============================================================================ @router.get("/settings") def get_vendor_settings( vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get vendor settings and configuration.""" return { "vendor_code": vendor.vendor_code, "subdomain": vendor.subdomain, "name": vendor.name, "contact_email": vendor.contact_email, "contact_phone": vendor.contact_phone, "website": vendor.website, "business_address": vendor.business_address, "tax_number": vendor.tax_number, "letzshop_csv_url_fr": vendor.letzshop_csv_url_fr, "letzshop_csv_url_en": vendor.letzshop_csv_url_en, "letzshop_csv_url_de": vendor.letzshop_csv_url_de, "theme_config": vendor.theme_config, "is_active": vendor.is_active, "is_verified": vendor.is_verified, } @router.put("/settings/marketplace") def update_marketplace_settings( marketplace_config: dict, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Update marketplace integration settings.""" # Verify permissions if not vendor_service.can_update_vendor(vendor, current_user): from fastapi import HTTPException raise HTTPException(status_code=403, detail="Insufficient permissions") # Update Letzshop URLs if "letzshop_csv_url_fr" in marketplace_config: vendor.letzshop_csv_url_fr = marketplace_config["letzshop_csv_url_fr"] if "letzshop_csv_url_en" in marketplace_config: vendor.letzshop_csv_url_en = marketplace_config["letzshop_csv_url_en"] if "letzshop_csv_url_de" in marketplace_config: vendor.letzshop_csv_url_de = marketplace_config["letzshop_csv_url_de"] db.commit() db.refresh(vendor) return { "message": "Marketplace settings updated successfully", "letzshop_csv_url_fr": vendor.letzshop_csv_url_fr, "letzshop_csv_url_en": vendor.letzshop_csv_url_en, "letzshop_csv_url_de": vendor.letzshop_csv_url_de, } @router.put("/settings/theme") def update_theme_settings( theme_config: dict, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Update vendor theme configuration.""" if not vendor_service.can_update_vendor(vendor, current_user): from fastapi import HTTPException raise HTTPException(status_code=403, detail="Insufficient permissions") vendor.theme_config = theme_config db.commit() db.refresh(vendor) return { "message": "Theme settings updated successfully", "theme_config": vendor.theme_config, } # ============================================================================ # VENDOR CATALOG ENDPOINTS # ============================================================================ @router.get("/products", response_model=ProductListResponse) def get_vendor_products( skip: int = Query(0, ge=0), limit: int = Query(100, ge=1, le=1000), is_active: Optional[bool] = Query(None), is_featured: Optional[bool] = Query(None), search: Optional[str] = Query(None), vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get all products in vendor catalog.""" products, total = vendor_service.get_products( db=db, vendor=vendor, current_user=current_user, skip=skip, limit=limit, active_only=is_active, featured_only=is_featured, ) return ProductListResponse( products=products, total=total, skip=skip, limit=limit ) @router.post("/products", response_model=ProductResponse) def add_product_to_catalog( product_data: dict, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Add a product from marketplace to vendor catalog.""" from models.schema.product import ProductCreate product_create = ProductCreate(**product_data) return vendor_service.add_product_to_catalog(db, vendor, product_create) @router.get("/products/{product_id}", response_model=ProductResponse) def get_vendor_product( product_id: int, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get a specific product from vendor catalog.""" from app.services.product_service import product_service return product_service.get_product(db, vendor.id, product_id) @router.put("/products/{product_id}", response_model=ProductResponse) def update_vendor_product( product_id: int, product_update: dict, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Update product in vendor catalog.""" from app.services.product_service import product_service from models.schema.product import ProductUpdate product_update_schema = ProductUpdate(**product_update) return product_service.update_product(db, vendor.id, product_id, product_update_schema) @router.delete("/products/{product_id}") def remove_product_from_catalog( product_id: int, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Remove product from vendor catalog.""" from app.services.product_service import product_service product_service.delete_product(db, vendor.id, product_id) return {"message": "Product removed from catalog successfully"} # ============================================================================ # VENDOR TEAM ENDPOINTS # ============================================================================ @router.get("/team/members") def get_team_members( vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get all team members for vendor.""" return team_service.get_team_members(db, vendor.id, current_user) @router.post("/team/invite") def invite_team_member( invitation_data: dict, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Invite a new team member.""" return team_service.invite_team_member(db, vendor.id, invitation_data, current_user) @router.put("/team/members/{user_id}") def update_team_member( user_id: int, update_data: dict, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Update team member role or status.""" return team_service.update_team_member(db, vendor.id, user_id, update_data, current_user) @router.delete("/team/members/{user_id}") def remove_team_member( user_id: int, vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Remove team member from vendor.""" team_service.remove_team_member(db, vendor.id, user_id, current_user) return {"message": "Team member removed successfully"} @router.get("/team/roles") def get_team_roles( vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get available roles for vendor team.""" return team_service.get_vendor_roles(db, vendor.id) # ============================================================================ # VENDOR DASHBOARD & STATISTICS # ============================================================================ @router.get("/dashboard") def get_vendor_dashboard( vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get vendor dashboard statistics.""" from app.services.stats_service import stats_service return { "vendor": { "code": vendor.vendor_code, "name": vendor.name, "subdomain": vendor.subdomain, "is_verified": vendor.is_verified, }, "stats": stats_service.get_vendor_stats(db, vendor.id), "recent_imports": [], # TODO: Implement "recent_orders": [], # TODO: Implement "low_stock_products": [], # TODO: Implement } @router.get("/analytics") def get_vendor_analytics( period: str = Query("30d", description="Time period: 7d, 30d, 90d, 1y"), vendor: Vendor = Depends(require_vendor_context()), current_user: User = Depends(get_current_user), db: Session = Depends(get_db), ): """Get vendor analytics data.""" from app.services.stats_service import stats_service return stats_service.get_vendor_analytics(db, vendor.id, period)