Skip to content

feat: 상점주 예약 관리 및 메뉴 드래그 정렬 개선 - #322

Merged
xodn09 merged 35 commits into
developfrom
feat/merchant-reservation-query
Oct 20, 2026
Merged

xodn09 merged 35 commits into
developfrom
feat/merchant-reservation-query

Conversation

@xodn09

@xodn09 xodn09 commented Oct 20, 2026 •

Copy link
Copy Markdown
Member

변경 요약

feat/merchant-reservation-query → develop

기존 상점주 예약 조회·승인·반려와 메뉴 드래그 정렬 작업에 관리자 예약 조회 전용 전환, 다중 브랜드 선택 UX, release 배포 설정 동기화 및 최신 API 계약 검증을 통합합니다. 사용자 요청에 따라 별도 PR을 만들지 않고 #322에 추가합니다. 기존 커밋은 보존하며 강제 푸시하지 않습니다.

상점주 예약 조회·승인·반려 (#315, #316)

  • 상태·소유 매장·예약 시작 기간을 서버 필터로 전달하고 입력 조건과 적용 조건을 구분합니다. 한국 시각을 UTC 경계로 변환하며 시작 이상·종료 미만 계약을 유지합니다.
  • 예약 장소·시간·인원·예약자·요청사항·처리 이력을 조회합니다. 제공되지 않은 처리자 이름이나 역할을 추정하지 않습니다.
  • 정상 조회한 PENDING 상세에만 승인·반려를 제공합니다. 확인창에서 장소·시간·인원·예약 번호를 확인합니다.
  • 승인 사유는 선택이며 비어 있으면 본문을 생략합니다. 반려 사유는 필수이며 공백·최대 500자와 응답 예약 ID·상태를 검증합니다.
  • 중복 제출, 처리 중 닫기·필터·대상 전환을 방지하고 계정·역할·매장·조회 범위 변경 뒤 늦은 응답을 무효화합니다.
  • 처리 후 목록·상세·이력을 재조회합니다. 쓰기 성공 후 재조회 실패와 쓰기 실패를 구분하고 타임아웃 쓰기를 자동 재시도하지 않습니다.
  • 과거 confirmation null, 취소 정책과 환불 선행 안내를 유지합니다. 재고·환불 요청을 임의로 추가하지 않습니다.
  • 예약 조건 모달은 항상 표시되는 시간대·취소 가능 여부를 같은 줄에 두고 조건부 취소 기한을 별도로 배치합니다. 상세 승인·반려 버튼은 처리 이력 아래로 이동합니다.
  • 취소 조건을 확인할 수 없는 상태를 취소 불가로 단정하지 않으며 안내 문구를 정리합니다.

메뉴 드래그 정렬 (#319)

  • 행 선택과 드래그 손잡이를 구분하고 마우스·터치·자동 스크롤·이동 미리보기를 지원합니다. 기존 목록 UI를 유지하며 중복 테두리를 없애고 호버를 흰 배경으로 구분합니다.
  • 키보드 Enter/Space 집기·놓기, 방향키/Home/End 이동, Escape 취소와 포커스 복원을 지원합니다. 비활성 메뉴 직접 이동 제한을 유지합니다.
  • 드래그 중 요청하지 않고 놓을 때 목표 인덱스로 PATCH 한 번만 전송합니다. 서버 전체 재정렬 기준으로 목록을 재조회합니다.
  • 저장 중 중복 정렬·매장 전환·탐색을 보호하고 실패·타임아웃 후 서버 순서를 재확인합니다. 새 메뉴 초안·기존 편집값과 선택을 유지합니다.
  • 계정·세션·매장 변경 뒤 이전 조회·정렬 응답이 새 화면을 덮어쓰지 않도록 보호합니다.

관리자 예약을 기록 조회 전용으로 전환 (#317)

  • 관리자 confirm/reject API 함수, 요청 타입, hook action, 버튼·사유 확인창을 제거합니다. 목록·상세 GET은 유지합니다.
  • 메뉴·제목·대시보드 바로가기를 '예약 관리 이력'으로 통일하고 승인·반려는 해당 장소의 상점주가 처리함을 안내합니다.
  • 기존 /reservations/review 딥링크·예약 ID·필터·페이지·인증 복귀를 유지합니다.
  • 현재 상점주와 당시 처리자·처리 시각·사유·상태 이력을 구분하며 과거 관리자 기록은 보존합니다.
  • 관리자 직접 처리 대기 업무에서 예약 조회를 제외합니다. 나머지 11개 업무의 총계·실패·이전 값·재시도 회귀를 함께 갱신합니다.
  • 공유 합성 adapter는 폐기된 관리자 예약 mutation을 handler 실행 전 차단합니다.

상점주 다중 브랜드 선택 UX (#320)

  • 브랜드가 이벤트에 표시할 가게·업체의 이름·소개·로고이며 사업자명·개인 이름·운영 장소와 다름을 설명합니다.
  • 브랜드 0개·1개·복수·조회 실패를 구분합니다. 1개일 때만 자동 선택하고 복수일 때 첫 브랜드를 임의 선택하지 않습니다.
  • 기존 이벤트의 저장된 브랜드와 신규 브랜드 생성 후의 명시적 선택을 보존합니다. 조회 실패·재시도 중에도 입력한 이벤트 내용을 유지합니다.
  • 선택 브랜드 이름·소개·로고 미리보기 및 로고 없음·깨진 이미지 대체 표시를 제공합니다. 로고 주소는 http(s)만 허용합니다.
  • 계정·역할 변경 시 이전 화면 상태를 초기화하고 소유 브랜드 목록에 없는 값의 제출을 막습니다.

release 배포 설정 동기화 (#321)

  • release에 이미 있는 workflow·compose·SSH host identity·배포 스크립트·mock 검사를 develop에도 반영합니다. 별도 개발 환경을 신설하지 않습니다.
  • 동일 저장소의 release push 검증 성공, 현재 release SHA, digest 기반 배포, 동시 실행 제어, 기존 게이트웨이 경유와 이전 이미지·설정 복구를 유지합니다.
  • 기존 조직 Secret 이름 HOST, USERNAME, KEY, DOCKER_USERNAME, DOCKER_TOKEN을 사용하며 비밀값은 읽거나 출력하지 않았습니다.
  • 수동 workflow_dispatch는 접속·설정 확인용이고 실제 웹을 교체하지 않음을 문서화합니다. 이번 작업에서 배포를 실행하거나 운영 컨테이너를 변경하지 않았습니다.
  • 기존 release 16022ff의 배포 실행은 성공으로 확인했습니다. 이번 새 커밋의 배포 성공과는 별개입니다. 최초 인증 실패는 토큰 만료가 원인이었고 담당자가 해결했다고 2026-10-21 사용자가 확인했습니다. #321은 완료 처리하고 미병합 develop 동기화·신규 코드 배포 확인은 #318에서 이어서 추적합니다.

API 계약·통합 회귀 (#318)

  • Admin·Merchant·App·Common 공개 OpenAPI 원본과 출처·수집 시각·해시·구조적 차이·계약표를 갱신합니다. 별도 서버 소스 참조는 fada91615237a7d6093afd30b68c5cbe643b6bac입니다.
  • 관리자 승인·반려 제거와 상점주 상세·필터·승인 선택 본문·반려 필수 본문을 대조합니다. 공개 문서의 버전과 실제 배포 커밋을 혼동하지 않습니다.
  • 상점주 confirm/reject 경로를 정적 계약 수집에서 각각 식별하도록 정리합니다. 동작·응답 검증은 유지합니다.
  • 현재 문서에 추가된 상세 API의 과거 문서 누락 예외를 해제하고 폐기 관리자 POST는 removed로 기록합니다. 무관한 기존 누락·대체 경로는 완료 처리하지 않습니다.
  • 근거와 재현·검증 경계는 docs/reservation-role-transfer-318.md에 기록합니다.

함께 유지되는 공통 UX

  • 매장 선택 버튼·옵션은 '장소명 · #ID', 주소는 보조 정보로 통일합니다.
  • 상점주 선택·날짜·시간 컨트롤을 흰 배경·테두리로 구분하고 hover/focus/disabled·포털에도 유지합니다.
  • 로고 클릭 시 관리자 대시보드·상점주 내 가게로 이동하며 basename·미저장 입력 보호를 유지합니다.
  • 추가 정보 GET의 명시적 404 PLACE_INFORMATION_NOT_FOUND만 정상 미등록으로 처리합니다. 다른 오류·인증 갱신 실패는 숨기지 않습니다.
  • 새 로그인·계정 전환 시 사이드바를 맨 위로 초기화합니다. 고객센터는 지정된 수신자의 Gmail 작성 창을 안전한 새 탭으로 엽니다.
  • 신규 장소 증빙 업로드 영역 높이, 예약 조건 및 일부 관리자·상점주 안내 문구를 정리합니다.
  • 관리자 추가 UI·문구 개선을 아래 8개 커밋으로 반영했습니다. 친숙한 '밴'·'증빙' 용어는 유지하고, 개발자 중심 안내만 정리했습니다.

앞서 반영한 추가 커밋 (4개)

  1. 52fc79e refactor: 관리자 예약을 기록 조회 전용으로 전환
  2. b1c2bdd feat: 상점주 다중 브랜드 선택 UX 개선
  3. 0dd342f chore: 릴리스 자동 배포 설정 동기화
  4. fbc79c2 test: 예약 역할 이관 계약과 통합 회귀 검증

이번 추가 UI·문구 개선 (8개 커밋)

  1. 1144b54 장소 상태 모달의 필드 여백 및 상점주 신청 첨부 파일의 수직 정렬·좁은 화면 배치 개선.
  2. 3142ffe 장소 검증 선택 영역을 가로로 확장하고 직접 입력의 라벨 간격·조회 버튼 위치 고정. 미선택·미조회·성공한 빈 결과·조회 실패 및 재시도를 구분.
  3. 98c285a 밴 필터·날짜 컨트롤 호버 표시, 목록 연한 핑크 호버, 제목과 밴 해제 버튼을 같은 줄·동일 안쪽 여백으로 정렬.
  4. dd41493 관리자 계정명 검색을 역할 조회 옆으로 이동하고 관리자 예약 필터·검색/초기화/조회 버튼을 데스크톱 한 줄로 배치. 좁은 화면은 줄바꿈 유지.
  5. a82107a 운영 이력의 필터 카드만 overflow를 허용해 개인정보 처리 유형 드롭다운 잘림 수정. 옵션 클릭·키보드 회귀 추가.
  6. aa54fda 일반 오류에서 CORS 설정 지시를 제거하고 재시도·문의 중심으로 변경. 화면의 업주 표현은 상점주로 통일하고 감사 로그의 원본 코드·사유는 보존.
  7. b9d0ab8 추천 버전별 적용 비율·대체 버전·다시 계산 및 신뢰 점수 운영 문구 정리. enum·API 키·내부 진단 로그는 변경하지 않음.
  8. 5c55bb2 알림 처리 작업과 실패 상태를 구분하고 원본 코드·상세 오류를 접힌 기술 정보에 보존. 데이터 품질 대상·규칙 코드와 미연결 파일 삭제 경고를 사용자 중심으로 정리.

상세 테스트는 각 변경 커밋에 함께 분리했습니다. 서버 endpoint·schema를 추가하거나 변경하지 않았고, 이번 추가 검증에서 운영 데이터를 수정하지 않았습니다.

최종 배포 후속 확인 (2026-10-21)

  • 웹 release: 93a40f65268c9a19822407c0a0e4701d13f38154 (PR #323, 2026-10-21 03:00 KST 병합).
  • Release verification: verify·ec2-image 모두 성공.
  • 자동 배포: 동일 SHA 이미지 build/push·digest 기준 EC2 교체 및 HTTP 검사 성공. 완료 시각 2026-10-21 03:07:44 KST. 로그에서 Container pingdom-admin-web-1 Healthy, Deployment and HTTP checks passed를 확인했습니다.
  • 공개 GET 확인(2026-10-21 03:15 KST): /console/login HTML 200, 새 /console/assets/index-BYgR28Ml.js JavaScript 200, /consulting/ HTML 200, 비로그인 /api/users/me JSON 401. 이전 자산 index-qeZI8awm.js와 구분합니다.
  • 서버 release: fada91615237a7d6093afd30b68c5cbe643b6bac 및 해당 SHA의 서버 배포 workflow 성공 확인. 서버 workflow는 해당 SHA 이미지 태그로 교체하고 상태 검사·이미지 일치를 확인합니다. 직접 SSH/JVM 런타임 조회는 수행하지 않았습니다.

최종 develop 66e6921의 PR·push CI도 모두 성공했습니다. #321의 develop 동기화와 #318의 새 배포본 인증된 읽기 확인까지 완료했습니다. 아래 구현 당시의 미배포·병합 전 기록은 당시 검증 범위를 보존한 기록입니다.

  • 2026-10-21 03:17 KST, 사용자가 인증을 완료한 상점주 세션으로 /console/merchant/reservations에서 예약 목록 5건과 선택한 예약의 상세·상태 변경 이력을 정상 조회했습니다. 페이지의 실제 script가 /console/assets/index-BYgR28Ml.js임을 DOM에서 확인해 웹 release 93a40f65268c9a19822407c0a0e4701d13f38154의 배포 결과와 연결했습니다. 에이전트는 로그인 자격증명을 읽거나 CAPTCHA를 풀지 않았고 승인·반려·취소·결제·환불·메뉴 변경도 실행하지 않았습니다. 개인정보 값은 이슈에 기록하지 않습니다. 관리자 계정의 새 배포본 재조회까지 수행했다는 의미는 아닙니다.

검증

  • 변경 범위에 맞는 lint, type check, build 또는 직접 검증을 수행했습니다.
  • 수행하지 않은 검증과 이유를 적었습니다.

실행 결과:

  • 커밋 전 전체 단위·컴포넌트 검사 node --test --test-reporter=dot tests/*.test.mjs 재실행 통과. 예약 역할·대시보드·배포 mock 회귀를 포함합니다.
  • npm run lint, TypeScript 포함 npm run build, git diff --check 통과.
  • npm run check:api-matrix 재생성 일치 및 npm run check:api-contracts 네 그룹 compatible 확인. 기존 타 API 누락·대체 경로 경고는 남아 있습니다.
  • 구현 검증에서 전체 릴리스 브라우저 23개 스위트 통과. 관리자 조회 복귀·대시보드, 상점주 조회·승인/반려, 메뉴 정렬·입력 보존, 브랜드 0/1/복수·재시도·로고 실패·명시 선택을 합성 응답으로 검사했습니다.
  • 브랜드 최종 작은 스타일 변경 뒤 해당 스위트를 1920×1080·1366×768·390×844에서 재실행해 통과했습니다. 이번 커밋 작업에서는 전체 브라우저 묶음을 재실행하지 않았습니다.
  • 배포 검사에서는 subprocess mock으로 구버전·실패 복구·중복 방어를 검증했습니다. 실제 Docker·SSH 배포 검증과 구분합니다.

미수행 및 제한:

  • 에이전트는 실제 관리자·상점주 로그인, 핑차 경유, 운영 소유권 이전·동시 수정 QA를 수행하지 않았습니다. 에이전트 검증 과정에서 운영 예약·메뉴·브랜드·이벤트를 생성·승인·반려·취소·수정·삭제하지 않았습니다. 사용자가 직접 완료한 QA와 구분합니다.
  • Docker daemon이 꺼져 있어 에이전트의 로컬 실제 이미지·컨테이너 검증은 수행하지 않았습니다. 새 HEAD의 원격 CI·develop/release 병합·실제 배포 및 새 배포 커밋에 연결된 인증된 읽기 결과 기록은 남아 있습니다. 사용자 QA를 미완료로 표시하지 않습니다.
  • 기존 배포의 비로그인 공개 GET에서 /console/login·JS 자산·/consulting/ 200, /api/users/me JSON 401을 확인했습니다. 새 코드의 배포 완료나 인증된 화면 정상 동작을 뜻하지 않습니다.
  • 외부 폰트 CSS는 브라우저 검사에서 격리하며 실제 폰트 픽셀 비교·모든 스크린리더 검증을 대체하지 않습니다. 메인 핑크 작은 글자의 기존 AA 대비 제한은 유지됩니다.

2026-10-21 추가 검증 및 사용자 QA

  • 최신 HEAD 5c55bb2: 전체 단위·컴포넌트 검사, lint, TypeScript 포함 build, diff 공백 검사 재실행 통과.
  • 추가 UI 변경 검증에서 관리자 문구/드롭다운, 데이터 품질, 장소 검증 레이아웃, 밴 구조, 신뢰 점수 이력, 관리자 대상 선택 등 관련 합성 브라우저 회귀를 통과했습니다. 마지막 친숙한 용어 복원 후 밴·장소 검증 관련 브라우저와 단위 검사를 다시 통과했습니다. 전체 23개 브라우저 묶음을 최신 HEAD에서 다시 실행했다고 주장하지 않습니다.
  • 사용자 확인: 2026-10-21 사용자가 QA를 직접 모두 완료했다고 전달했습니다. 이를 사용자 검증 완료로 기록하며 사용자의 환경·세부 시나리오·배포 버전을 임의로 추정하지 않습니다.
  • 최신 원격 Release verification은 푸시 후 실행 중입니다. 이전 HEAD의 성공을 최신 HEAD의 성공으로 표시하지 않습니다.

Web API 계약

  • Web API 영향 없음 — 이번 8개 UI·문구 커밋은 endpoint/schema 변경 없음. PR 전체의 기존 API 영향은 아래에 기록.
  • 영향 operation을 아래에 METHOD /path 형식으로 모두 기록했습니다.
  • 계약 변경 시 docs/web-api-contract-matrix.csv의 schema, status, issue, canonical 상태, last_verified를 갱신했습니다.
  • 제거·legacy API를 구현 완료로 표시하지 않았습니다.
  • 파괴적 mutation의 경고, 사유 입력, 대상 재입력 등 확인 수준을 검토했습니다.

영향 operation (웹 /api 접두사 제외):

  • GET /admin/reservations — 관리자 조회 전용, 대기 업무 집계에서 제외.
  • GET /admin/reservations/{reservationId} — 현재 상점주와 당시 처리자·이력 구분.
  • POST /admin/reservations/{reservationId}/confirm — 폐기, 호출 제거.
  • POST /admin/reservations/{reservationId}/reject — 폐기, 호출 제거.
  • GET /merchant-owner/reservations — 상태·매장·시작 기간·페이지 필터.
  • GET /merchant-owner/reservations/{reservationId} — 상세·이력 및 응답 검증.
  • POST /merchant-owner/reservations/{reservationId}/confirm — 선택 사유, 공백 사유는 본문 생략.
  • POST /merchant-owner/reservations/{reservationId}/reject — 필수 사유·500자 검증.
  • POST /merchant-owner/reservations/{reservationId}/cancel — 기존 취소·환불 선행 보호 유지.
  • GET /merchant-owner/me — 소유 매장 참조 및 실패 구분.
  • GET /merchant-owner/availabilities — 예약 시간 참조 및 실패 구분.
  • GET /merchant-owner/places/{placeId} — 매장 이름·주소 표시.
  • GET /merchant-owner/places/{placeId}/menus — 정렬 후 전체 목록 재확인.
  • PATCH /merchant-owner/places/{placeId}/menus/{menuId}/order — 목표 인덱스 한 번 전송.
  • GET /merchant-owner/places/{placeId}/information — 명시적 미등록만 빈 상태로 처리.
  • PUT /merchant-owner/places/{placeId}/information — 기존 명시적 저장 유지, 자동 쓰기 없음.
  • GET /merchant-owner/campaigns/brands — 브랜드 0/1/복수 및 실패 구분.
  • POST /merchant-owner/campaigns/brands — 생성 후 명시 선택·초안 보존.
  • PATCH /merchant-owner/campaigns/brands/{brandId} — 기존 편집 시 선택 브랜드 검증·미리보기.
  • GET /merchant-owner/campaigns — 저장된 브랜드 연결 보존.
  • POST /merchant-owner/campaigns — 소유 브랜드 명시 선택 검증.
  • PATCH /merchant-owner/campaigns/{campaignId} — 기존 이벤트 브랜드 보존 및 제출 검증.
  • GET /merchant-owner/offers — 병렬 조회 실패를 미등록 정보와 혼동해 숨기지 않도록 유지.
  • GET /merchant-owner/places/{placeId}/operating-notices — 병렬 조회 실패 구분 유지.

위 기존 브랜드·이벤트 API의 서버 계약 자체를 변경하지 않습니다. 스냅샷에 수집된 App/Common의 웹 비관련 추가 operation까지 구현했다고 표시하지 않습니다.

관련 이슈

@xodn09 xodn09 added enhancement New feature or request priority:p1 핵심 운영 기능 다음 우선순위 labels Oct 20, 2026
@xodn09 xodn09 self-assigned this Oct 20, 2026
@xodn09 xodn09 changed the title feat: 상점주 예약 필터 및 상세 처리 이력 조회 연동 feat: 상점주 예약 관리 및 메뉴 드래그 정렬 개선 Oct 20, 2026
@xodn09
xodn09 merged commit 5761932 into develop Oct 20, 2026
2 checks passed
@xodn09
xodn09 deleted the feat/merchant-reservation-query branch October 20, 2026 17:28
@xodn09 xodn09 mentioned this pull request Oct 20, 2026
21 tasks done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request priority:p1 핵심 운영 기능 다음 우선순위

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants