from fastapi import APIRouter, Depends, HTTPException from sqlalchemy.orm import Session from typing import List from ..database.database import get_db from ..models.brand import Brand from ..models.user import User from ..schemas.brand import BrandCreate, BrandUpdate, BrandResponse from ..services.auth import get_current_user router = APIRouter(prefix="/api/brands", tags=["brands"]) @router.get("", response_model=List[BrandResponse]) def list_brands(db: Session = Depends(get_db)): """Get all brands""" brands = db.query(Brand).order_by(Brand.name).all() return brands @router.get("/{brand_id}", response_model=BrandResponse) def get_brand(brand_id: int, db: Session = Depends(get_db)): """Get a specific brand""" brand = db.query(Brand).filter(Brand.id == brand_id).first() if not brand: raise HTTPException(status_code=404, detail="Brand not found") return brand @router.post("", response_model=BrandResponse) def create_brand( brand_data: BrandCreate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user) ): """Create a new brand (admin only)""" if not current_user.is_admin: raise HTTPException(status_code=403, detail="Admin access required") # Check if brand already exists existing = db.query(Brand).filter(Brand.name == brand_data.name).first() if existing: raise HTTPException(status_code=400, detail="Brand already exists") brand = Brand(name=brand_data.name) db.add(brand) db.commit() db.refresh(brand) return brand @router.put("/{brand_id}", response_model=BrandResponse) def update_brand( brand_id: int, brand_data: BrandUpdate, db: Session = Depends(get_db), current_user: User = Depends(get_current_user) ): """Update a brand (admin only)""" if not current_user.is_admin: raise HTTPException(status_code=403, detail="Admin access required") brand = db.query(Brand).filter(Brand.id == brand_id).first() if not brand: raise HTTPException(status_code=404, detail="Brand not found") # Check if new name conflicts with existing brand if brand_data.name != brand.name: existing = db.query(Brand).filter(Brand.name == brand_data.name).first() if existing: raise HTTPException(status_code=400, detail="Brand name already exists") brand.name = brand_data.name db.commit() db.refresh(brand) return brand @router.delete("/{brand_id}") def delete_brand( brand_id: int, db: Session = Depends(get_db), current_user: User = Depends(get_current_user) ): """Delete a brand (admin only)""" if not current_user.is_admin: raise HTTPException(status_code=403, detail="Admin access required") brand = db.query(Brand).filter(Brand.id == brand_id).first() if not brand: raise HTTPException(status_code=404, detail="Brand not found") db.delete(brand) db.commit() return {"message": "Brand deleted successfully"}