Spaces:
Sleeping
Sleeping
File size: 6,390 Bytes
551658a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 | 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
|