ymt-python / routers /product_media.py
hsailorj's picture
Add application file
551658a
Raw
History Blame Contribute Delete
6.39 kB
from fastapi import APIRouter, Depends, HTTPException, status, UploadFile, File, Form
from sqlalchemy.orm import Session
from typing import List, Optional
from database import get_db
from models.product_media import ProductMedia
from models.user import User
from schemas.product import (
ProductMediaResponse,
ProductMediaCreate,
ProductMediaUpdate
)
from routers.auth import get_current_user
from routers.product_utils import validate_product_exists, get_company_r2_config, delete_r2_and_local_files
# ε―Όε…₯ζ—₯志樑块
from utils.logger import logger
router = APIRouter()
@router.get("/{product_number}/media", response_model=List[ProductMediaResponse])
async def read_product_media(
product_number: str,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""θŽ·ε–ε•†ε“εͺ’δ½“εˆ—θ‘¨"""
logger.info(f"θŽ·ε–ε•†ε“εͺ’δ½“εˆ—θ‘¨ - product_number: {product_number}, user: {current_user.username}")
from routers.auth import is_admin_user
query = db.query(ProductMedia).filter(ProductMedia.product_number == product_number)
if not is_admin_user(current_user):
query = query.filter(ProductMedia.company_code == current_user.company_code)
media = query.order_by(ProductMedia.sort_order).all()
logger.info(f"θŽ·ε–ε•†ε“εͺ’δ½“εˆ—θ‘¨ζˆεŠŸ - product_number: {product_number}, ε…± {len(media)} δΈͺεͺ’体")
return media
@router.post("/{product_number}/media", response_model=ProductMediaResponse, status_code=status.HTTP_201_CREATED)
async def create_product_media(
product_number: str,
media_type: str = Form(...),
media_alt: Optional[str] = Form(None),
is_main: Optional[int] = Form(0),
sort_order: Optional[int] = Form(0),
media_url: str = Form(...),
thumbnail_url: Optional[str] = Form(None),
media_id: str = Form(...),
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""εˆ›ε»Ίε•†ε“εͺ’δ½“οΌˆι€šθΏ‡η΄ ζι€‰ζ‹©ε™¨ζ–ΉεΌοΌ‰"""
logger.info(f"εˆ›ε»Ίε•†ε“εͺ’体 - product_number: {product_number}, media_type: {media_type}, user: {current_user.username}")
product = validate_product_exists(product_number, current_user, db)
media_data = {
'product_number': product_number,
'product_id': product.id,
'company_code': current_user.company_code,
'media_type': media_type,
'r2_url': media_url,
'thumbnail_r2_url': thumbnail_url or media_url,
'media_id': media_id,
'media_alt': media_alt or '',
'is_main': is_main,
'sort_order': sort_order
}
media = ProductMedia(**media_data)
db.add(media)
db.commit()
db.refresh(media)
logger.info(f"εˆ›ε»Ίε•†ε“εͺ’δ½“ζˆεŠŸ - media_id: {media.id}, product_number: {product_number}")
return media
@router.post("/{product_number}/media/batch", response_model=List[ProductMediaResponse], status_code=status.HTTP_201_CREATED)
async def batch_create_product_media(
product_number: str,
media_items: List[dict],
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""ζ‰Ήι‡εˆ›ε»Ίε•†ε“εͺ’体"""
logger.info(f"ζ‰Ήι‡εˆ›ε»Ίε•†ε“εͺ’体 - product_number: {product_number}, 数量: {len(media_items)}, user: {current_user.username}")
product = validate_product_exists(product_number, current_user, db)
created_media = []
for item in media_items:
media_data = {
'product_number': product_number,
'product_id': product.id,
'company_code': current_user.company_code,
'media_type': item.get('media_type', 'image'),
'r2_url': item.get('media_url'),
'thumbnail_r2_url': item.get('thumbnail_url') or item.get('media_url'),
'media_id': item.get('media_id'),
'media_alt': item.get('media_alt', ''),
'is_main': item.get('is_main', 0),
'sort_order': item.get('sort_order', 0)
}
media = ProductMedia(**media_data)
db.add(media)
created_media.append(media)
db.commit()
for media in created_media:
db.refresh(media)
logger.info(f"ζ‰Ήι‡εˆ›ε»Ίε•†ε“εͺ’δ½“ζˆεŠŸ - product_number: {product_number}, ζˆεŠŸεˆ›ε»Ί {len(created_media)} δΈͺεͺ’体")
return created_media
@router.put("/media/{media_id}", response_model=ProductMediaResponse)
async def update_product_media(
media_id: int,
media_update: ProductMediaUpdate,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""更新商品εͺ’体"""
logger.info(f"更新商品εͺ’体 - media_id: {media_id}, user: {current_user.username}")
from routers.auth import is_admin_user
query = db.query(ProductMedia).filter(ProductMedia.id == media_id)
if not is_admin_user(current_user):
query = query.filter(ProductMedia.company_code == current_user.company_code)
media = query.first()
if media is None:
logger.error(f"εͺ’δ½“δΈε­˜εœ¨ - media_id: {media_id}")
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Media not found")
update_data = media_update.model_dump(exclude_unset=True)
for field, value in update_data.items():
setattr(media, field, value)
db.commit()
db.refresh(media)
logger.info(f"更新商品εͺ’δ½“ζˆεŠŸ - media_id: {media_id}")
return media
@router.delete("/media/{media_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_product_media(
media_id: int,
current_user: User = Depends(get_current_user),
db: Session = Depends(get_db)
):
"""εˆ ι™€ε•†ε“εͺ’体"""
logger.info(f"εˆ ι™€ε•†ε“εͺ’体 - media_id: {media_id}, user: {current_user.username}")
from routers.auth import is_admin_user
query = db.query(ProductMedia).filter(ProductMedia.id == media_id)
if not is_admin_user(current_user):
query = query.filter(ProductMedia.company_code == current_user.company_code)
media = query.first()
if media is None:
logger.error(f"εͺ’δ½“δΈε­˜εœ¨ - media_id: {media_id}")
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Media not found")
db.delete(media)
db.commit()
logger.info(f"εˆ ι™€ε•†ε“εͺ’δ½“ζˆεŠŸ - media_id: {media_id}")
return None