feat(cafe24): 편집기에 상품 다이렉트 주소 + 클립보드 복사
상세 화면 상단에 고객이 보는 상세페이지 주소를 보여주고 「주소 복사」·「쇼핑몰에서
열기」를 붙였다.
https://miras.co.kr/product/detail.html?product_no=119
도메인은 하드코딩하지 않고 CAFE24_SHOP_URL 로 받는다. 커스텀 도메인은 mall_id 로
알 수 없기 때문이다. 미설정 시 카페24 기본 도메인(https://<mall_id>.cafe24.com)으로
대체해 환경변수가 없어도 항상 유효한 주소가 나온다. 스킴 누락·끝 슬래시도 정규화한다.
주소 칸은 readonly <input> 이라 기존 복사 버튼(data-copy)이 값을 그대로 읽어간다 —
클립보드 로직을 새로 만들지 않았다. 클립보드 API 가 막힌 환경에서는 입력칸 선택으로
대체되고, 칸을 클릭하면 전체 선택된다.
CAFE24_SHOP_URL 은 .env.example 과 문서에 설명을 함께 넣었다(신규 환경변수 규칙).
검증: 유닛테스트 61개 통과(신규 2개 — 스킴/슬래시 유무 3가지 입력에서 같은 주소,
미설정 시 카페24 도메인 대체). 렌더 확인 — 주소 표시·복사 버튼·새 창 열기(noopener),
주소를 만들 수 없으면 줄 자체를 숨김.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -52,6 +52,9 @@ class Cafe24Config:
|
||||
api_version: str
|
||||
token_secret: str
|
||||
scopes: tuple[str, ...]
|
||||
# 쇼핑몰 표시 주소(고객이 보는 도메인). 커스텀 도메인은 mall_id 로 알 수 없어
|
||||
# 환경변수로 받는다. 미설정 시 카페24 기본 도메인으로 대체한다.
|
||||
shop_url: str = ""
|
||||
|
||||
@property
|
||||
def configured(self) -> bool:
|
||||
@@ -78,6 +81,23 @@ class Cafe24Config:
|
||||
def scope_param(self) -> str:
|
||||
return ",".join(self.scopes)
|
||||
|
||||
@property
|
||||
def shop_base(self) -> str:
|
||||
"""고객이 보는 쇼핑몰 주소(끝 슬래시 없음).
|
||||
|
||||
`CAFE24_SHOP_URL` 이 없으면 카페24 기본 도메인을 쓴다 — 커스텀 도메인을
|
||||
모르더라도 항상 유효한 주소가 나온다.
|
||||
"""
|
||||
url = (self.shop_url or "").strip().rstrip("/")
|
||||
if url:
|
||||
return url if "://" in url else f"https://{url}"
|
||||
return f"https://{self.mall_id}.cafe24.com" if self.mall_id else ""
|
||||
|
||||
def product_url(self, product_no: int | str) -> str:
|
||||
"""상품 상세페이지 다이렉트 주소."""
|
||||
base = self.shop_base
|
||||
return f"{base}/product/detail.html?product_no={product_no}" if base else ""
|
||||
|
||||
|
||||
def load_config(*, scopes: tuple[str, ...] = DEFAULT_SCOPES) -> Cafe24Config:
|
||||
"""환경변수에서 설정을 읽는다. 값이 없어도 예외를 던지지 않는다.
|
||||
@@ -93,4 +113,5 @@ def load_config(*, scopes: tuple[str, ...] = DEFAULT_SCOPES) -> Cafe24Config:
|
||||
api_version=_env("CAFE24_API_VERSION", DEFAULT_API_VERSION),
|
||||
token_secret=_env("CAFE24_TOKEN_SECRET"),
|
||||
scopes=scopes,
|
||||
shop_url=_env("CAFE24_SHOP_URL"),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user