feat(cupang): 등록된 제품 수정 팝업

- 동작 열에 [수정] 버튼 → 제품명/제품코드/쿠팡상품코드 수정 팝업
- POST /cupang/api/products/{id}/edit (JSON), 제품코드 중복은 400
- 제품코드 변경 시 cupang_box_rules 의 product_code/스냅샷도 함께 이동
  (같은 코드 규칙이 이미 있으면 이동하지 않음). 출고 라인은 과거 기록이라 유지

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-01 12:00:33 +09:00
parent 9ddced268f
commit 7174edd702
3 changed files with 178 additions and 0 deletions
+25
View File
@@ -917,6 +917,31 @@ async def product_set_active(
return RedirectResponse(url="/cupang/products", status_code=303)
@router.post("/api/products/{product_id:int}/edit")
async def product_edit(
request: Request,
product_id: int,
payload: dict[str, Any] = Body(...),
user: dict[str, Any] = Depends(_require_user),
) -> JSONResponse:
"""등록된 제품 수정. body: {product_name, product_code, coupang_item_code}."""
store = _store(request)
if store is None:
raise HTTPException(status_code=503, detail="cupang_db 미설정")
try:
product = store.update_product(
product_id=product_id,
product_name=str(payload.get("product_name") or ""),
product_code=str(payload.get("product_code") or ""),
coupang_item_code=str(payload.get("coupang_item_code") or ""),
)
except KeyError:
raise HTTPException(status_code=404, detail="제품을 찾을 수 없습니다.")
except ValueError as exc:
raise HTTPException(status_code=400, detail=str(exc))
return JSONResponse({"ok": True, "product": product})
@router.post("/api/products/{product_id:int}/toggle")
async def product_toggle_active(
request: Request,