Spaces:
Sleeping
Sleeping
| 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() | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |
| 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 | |