129 lines
3.7 KiB
Python
129 lines
3.7 KiB
Python
# app/api/v1/public/vendors/vendors.py
|
|
"""
|
|
Public vendor information endpoints.
|
|
|
|
Provides public-facing vendor lookup and information retrieval.
|
|
"""
|
|
|
|
import logging
|
|
from fastapi import APIRouter, Depends, HTTPException, Path
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.database import get_db
|
|
from models.database.vendor import Vendor
|
|
|
|
router = APIRouter()
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
@router.get("/by-code/{vendor_code}")
|
|
def get_vendor_by_code(
|
|
vendor_code: str = Path(..., description="Vendor code (e.g., TECHSTORE233)"),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Get public vendor information by vendor code.
|
|
|
|
This endpoint is used by:
|
|
- Frontend vendor login page to validate vendor existence
|
|
- Customer shop to display vendor information
|
|
|
|
Returns basic vendor information (no sensitive data).
|
|
"""
|
|
vendor = db.query(Vendor).filter(
|
|
Vendor.vendor_code == vendor_code.upper(),
|
|
Vendor.is_active == True
|
|
).first()
|
|
|
|
if not vendor:
|
|
logger.warning(f"Vendor lookup failed for code: {vendor_code}")
|
|
raise HTTPException(
|
|
status_code=404,
|
|
detail=f"Vendor '{vendor_code}' not found or inactive"
|
|
)
|
|
|
|
logger.info(f"Vendor lookup successful: {vendor.vendor_code}")
|
|
|
|
# Return public vendor information (no sensitive data)
|
|
return {
|
|
"id": vendor.id,
|
|
"vendor_code": vendor.vendor_code,
|
|
"subdomain": vendor.subdomain,
|
|
"name": vendor.name,
|
|
"description": vendor.description,
|
|
"website": vendor.website,
|
|
"is_active": vendor.is_active,
|
|
"is_verified": vendor.is_verified
|
|
}
|
|
|
|
|
|
@router.get("/by-subdomain/{subdomain}")
|
|
def get_vendor_by_subdomain(
|
|
subdomain: str = Path(..., description="Vendor subdomain (e.g., techstore233)"),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Get public vendor information by subdomain.
|
|
|
|
Used for subdomain-based vendor detection in production environments.
|
|
Example: techstore233.platform.com -> subdomain is "techstore233"
|
|
"""
|
|
vendor = db.query(Vendor).filter(
|
|
Vendor.subdomain == subdomain.lower(),
|
|
Vendor.is_active == True
|
|
).first()
|
|
|
|
if not vendor:
|
|
logger.warning(f"Vendor lookup failed for subdomain: {subdomain}")
|
|
raise HTTPException(
|
|
status_code=404,
|
|
detail=f"Vendor with subdomain '{subdomain}' not found or inactive"
|
|
)
|
|
|
|
logger.info(f"Vendor lookup by subdomain successful: {vendor.vendor_code}")
|
|
|
|
return {
|
|
"id": vendor.id,
|
|
"vendor_code": vendor.vendor_code,
|
|
"subdomain": vendor.subdomain,
|
|
"name": vendor.name,
|
|
"description": vendor.description,
|
|
"website": vendor.website,
|
|
"is_active": vendor.is_active,
|
|
"is_verified": vendor.is_verified
|
|
}
|
|
|
|
|
|
@router.get("/{vendor_id}/info")
|
|
def get_vendor_info(
|
|
vendor_id: int = Path(..., description="Vendor ID"),
|
|
db: Session = Depends(get_db)
|
|
):
|
|
"""
|
|
Get public vendor information by ID.
|
|
|
|
Used when vendor_id is already known (e.g., from URL parameters).
|
|
"""
|
|
vendor = db.query(Vendor).filter(
|
|
Vendor.id == vendor_id,
|
|
Vendor.is_active == True
|
|
).first()
|
|
|
|
if not vendor:
|
|
logger.warning(f"Vendor lookup failed for ID: {vendor_id}")
|
|
raise HTTPException(
|
|
status_code=404,
|
|
detail=f"Vendor with ID {vendor_id} not found or inactive"
|
|
)
|
|
|
|
return {
|
|
"id": vendor.id,
|
|
"vendor_code": vendor.vendor_code,
|
|
"subdomain": vendor.subdomain,
|
|
"name": vendor.name,
|
|
"description": vendor.description,
|
|
"website": vendor.website,
|
|
"is_active": vendor.is_active,
|
|
"is_verified": vendor.is_verified
|
|
}
|