feat(cafe24): 읽기 지연 보정("마지막 쓰기가 권위") + 상품 정보 패널
증상: 상세페이지를 적용해도 편집기에 수정 전 소스가 보이고 한참 뒤에야 반영됨. 원인은 우리 캐시가 아니라(전부 no-store) 카페24 관리자 API 가 PUT 뒤 한동안 GET 에서 예전 값을 돌려주는 읽기 지연. 예전 코드는 2.4초만 기다린 뒤 GET 값을 그대로 믿어 예전 소스 표시·지문 충돌 오판·예전 값 백업이 생겼다. - 상세설명: 쓰기 성공 시 MANUAL/SCHEDULED revision 을 기준으로, 카페24 값이 유예시간 안의 revision 중 하나와 같으면 지연(pending)으로 보고 마지막 쓰기를 표시·지문 기준으로 쓴다. 모르는 값이면 외부 변경(external). store.resolve_description / db.revision_digests(md5) / 배너 2종. - 적용(apply)은 유효 현재값으로 BACKUP·지문 대조·변경없음 판정. 재조회 확인 결과는 감사로그에만 남긴다. - 스칼라(상품명·가격·이미지·진열/판매): PUT 응답을 cafe24_products. last_write_snapshot(JSONB, 마이그레이션 004)에 남기고 GET 의 updated_date 가 그보다 이전이면 스냅샷으로 덮어씀. 옵션/품목도 섹션별 스냅샷. - 3분할 화면: 목록 | 편집기 | 상품 정보 패널(_side.html, /pane 이 두 조각을 한 응답으로). routes_product_info.py JSON API — 상품명/판매가/공급가/ 소비자가, 대표이미지 업로드(POST /admin/products/images → PUT detail_image + image_upload_type=A), 옵션 생성/이름·썸네일·표시방식 수정/삭제, 품목 자체코드·추가금액·진열·판매 일괄 수정. 화면은 PUT 응답으로 그린다. - client.delete/timeout, products.upload_images·options·variants 래퍼. - 유닛테스트 21건 추가(88 통과), 문서(CAFE24_MODULE 3-3/3-4, DATABASES, .env.example CAFE24_READ_LAG_GRACE_MIN) 갱신. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -148,8 +148,12 @@ class Cafe24Client:
|
||||
params: dict[str, Any] | None = None,
|
||||
json: dict[str, Any] | None = None,
|
||||
product_no: int | None = None,
|
||||
timeout: float | None = None,
|
||||
) -> dict[str, Any]:
|
||||
"""카페24 Admin API 호출. 성공 시 응답 JSON(dict) 반환."""
|
||||
"""카페24 Admin API 호출. 성공 시 응답 JSON(dict) 반환.
|
||||
|
||||
timeout 은 호출별 초과 지정(이미지 업로드처럼 본문이 큰 요청용). 없으면 기본값.
|
||||
"""
|
||||
if not self._config.configured:
|
||||
raise Cafe24ConfigError(
|
||||
"카페24 설정이 없습니다. 미설정 항목: " + ", ".join(self._config.missing)
|
||||
@@ -167,7 +171,7 @@ class Cafe24Client:
|
||||
status: int | None = None
|
||||
try:
|
||||
access_token = self._tokens.get_access_token()
|
||||
with httpx.Client(timeout=self._timeout) as client:
|
||||
with httpx.Client(timeout=timeout or self._timeout) as client:
|
||||
response = client.request(
|
||||
method,
|
||||
url,
|
||||
@@ -256,3 +260,6 @@ class Cafe24Client:
|
||||
|
||||
def post(self, path: str, **kwargs: Any) -> dict[str, Any]:
|
||||
return self.request("POST", path, **kwargs)
|
||||
|
||||
def delete(self, path: str, **kwargs: Any) -> dict[str, Any]:
|
||||
return self.request("DELETE", path, **kwargs)
|
||||
|
||||
Reference in New Issue
Block a user