feat(cafe24): 상품 목록·검색 + 현재 상세페이지 HTML 조회 (Phase 2)
상세설명 API 경로가 틀려 있던 것을 실물 확인으로 바로잡았다.
`/admin/products/{no}/description` 은 존재하지 않는다(운영몰 호출 결과
`No API found.`). 상세설명은 상품 리소스의 필드이므로 GET/PUT 을
`/admin/products/{no}` 로 옮겼고, PUT body 는 {"request": {...}} 다.
PC/모바일 상세설명이 별도 필드라는 것도 확인됐다. `separated_mobile_description`
('T'/'F') 이 분리 사용 여부이며, 미분리 상품을 수정할 때 description 만 바꾸면
모바일이 어긋난다. Descriptions 데이터클래스에 이 플래그와 불일치 여부를 담아
화면에서 경고로 노출한다.
목록 응답에는 description 이 없어(확인됨) 상세설명은 상품 1건씩 조회한다.
그래서 목록 화면에 미리보기를 뿌리지 않는다 — 상품 87개면 87호출이라 호출
제한에 걸린다.
화면은 읽기 전용이다(편집·적용은 Phase 3~4). 목록은 카페24를 매번 조회해
현재값을 보여주고, 결과를 cafe24_products 에 UPSERT 해둔다(예약·로그 화면에서
API 없이 상품명을 쓰기 위함).
상단 탭의 예약관리가 404 였으므로 Phase 5 안내 화면을 붙였다.
토큰 만료 시각이 화면에 +00:00 로 보이던 것도 고쳤다. 컬럼이 timestamptz 라
psycopg 가 UTC 로 돌려주는 값을 그대로 출력하고 있었다(시각 자체는 정확했다).
검증: 유닛테스트 23개 통과(신규 7개 — 상세설명 경로가 /description 으로
되돌아가지 않는지, PUT payload 모양, 미분리 플래그 파싱, 페이징 clamp).
라우트 8개 등록 확인. 실제 화면은 서버 배포 후 확인 필요.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -9,8 +9,9 @@
|
||||
|
||||
라우트가 많아 기능별 파일로 나눈다(다른 모듈의 단일 router.py 패턴을 규모 때문에
|
||||
확장한 것). 여기서는 루트 라우터를 만들고 서브 라우터를 결합한다.
|
||||
routes_products 상품 목록/검색 · 상세설명 조회
|
||||
routes_system 연결(OAuth)·상태·API 로그·작업 로그
|
||||
(Phase 2~) routes_products / routes_schedules
|
||||
(Phase 5) routes_schedules
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
@@ -21,12 +22,14 @@ from fastapi import APIRouter, Request
|
||||
from fastapi.responses import HTMLResponse
|
||||
|
||||
from .common import base_ctx, guard
|
||||
from .routes_products import products_router
|
||||
from .routes_system import system_router
|
||||
|
||||
logger = logging.getLogger("cafe24.router")
|
||||
|
||||
router = APIRouter(prefix="/cafe24", tags=["cafe24"])
|
||||
|
||||
router.include_router(products_router)
|
||||
router.include_router(system_router)
|
||||
|
||||
|
||||
@@ -36,9 +39,12 @@ def health() -> dict[str, str]:
|
||||
return {"status": "ok"}
|
||||
|
||||
|
||||
@router.get("/", response_class=HTMLResponse)
|
||||
def index(request: Request) -> HTMLResponse:
|
||||
"""상품 목록 (Phase 2 에서 구현). 지금은 연결 상태 안내만."""
|
||||
@router.get("/schedules", response_class=HTMLResponse)
|
||||
def schedules(request: Request) -> HTMLResponse:
|
||||
"""예약관리 안내. Phase 5 에서 routes_schedules.py 로 옮긴다.
|
||||
|
||||
상단 탭에 링크가 있으므로 404 를 내지 않고 안내 화면을 보여준다.
|
||||
"""
|
||||
from app.main import render_template # noqa: WPS433
|
||||
|
||||
checked = guard(request)
|
||||
@@ -46,11 +52,11 @@ def index(request: Request) -> HTMLResponse:
|
||||
return checked
|
||||
_st, user = checked
|
||||
|
||||
ctx = base_ctx(request, user, active_tab="products")
|
||||
ctx = base_ctx(request, user, active_tab="schedules")
|
||||
ctx.update(
|
||||
{
|
||||
"page_title": "카페24 상품관리",
|
||||
"page_subtitle": "상품 상세페이지 조회·편집·예약",
|
||||
"page_title": "카페24 — 예약관리",
|
||||
"page_subtitle": "예약 적용 · 자동 복원",
|
||||
}
|
||||
)
|
||||
return render_template(request, "cafe24/index.html", ctx)
|
||||
return render_template(request, "cafe24/schedules.html", ctx)
|
||||
|
||||
Reference in New Issue
Block a user