manifest.surfaces (Level 1 UI Kit) 의 전체
레퍼런스다.
1. Manifest 최상위 구조
앱 버전을 생성할 때(createAppVersion) 제출하는 manifest 의 형태:
UI Kit 표면은 현재
settings 하나만 지원한다 — 앱별 설정 페이지이며, 설치 직후 최초
방문이 온보딩을 겸한다. 블록은 최대 32개.2. surfaces.settings 블록 종류
surfaces.settings.blocks 는 아래 6종 블록의 배열이다. 렌더러는 선언 순서대로 그린다.
markdown
정적 안내 텍스트 (GFM). 최대 20,000자.image
url 은 https 만 허용 (VPMS 프론트가 https 라 mixed-content 차단).
divider
configForm
manifest.configSchema 를 폼으로 렌더링해 설치 단위 설정을 입력받는다. 값은
Installation.config 에 저장되고 앱은 GET /api/v1/installation 의 config 로 읽는다.
저장 시 config.updated webhook 이 발행된다.
entityMapping
VPMS 엔티티 ↔ 앱이 푸시한 외부 항목(ExternalDataset)을 잇는 매핑 편집기. 가장 핵심 블록이다 — §3 참조.action
사용자가 버튼 한 번으로 앱에 작업을 위임하는 트리거 — §4 참조.3. entityMapping 상세
호텔(테넌트)이 VPMS 엔티티와 앱의 외부 엔티티를 잇는다. 왼쪽은 우리 데이터(예: 객실 타입), 오른쪽은 앱이 Open API 로 푸시한 dataset 항목이다.vpmsEntity 종류
roomType · room · package · ratePlan · accommodation · channel
accommodation— 설치 숙소 자신 1행. 외부 시스템 계정 페어링(account linking) 용.channel— 판매 채널(거래처 연결 단위). 외부 플랫폼 코드 매핑용.
cardinality 의미
- ONE_TO_ONE — VPMS 엔티티 ↔ 외부 항목이 양방향 1:1. 한 쪽을 재배정하면 반대쪽 기존 매핑을 대체한다(steal).
- ONE_TO_MANY — 한 VPMS 엔티티가 여러 외부 항목을 가질 수 있다. 단, 외부 항목은 항상 하나의 엔티티에만 속한다(외부→엔티티 해석 유일성). 예: 한 채널(거래처)에 여러 플랫폼을 묶되, 한 플랫폼은 한 채널에만 배정.
4. action 상세
버튼 클릭 →action.invoked webhook 발행 → (선택) 앱이 완료 보고.
completion: "none"— 버튼을 누르면 webhook 발행 즉시 완료로 간주한다.completion: "event"— 앱이 작업을 마친 뒤POST /api/v1/action-runs/{run_id}/complete로 결과를 보고할 때까지 프론트가 진행 중 상태를 표시한다.
action.invoked payload: { "action": "<key>", "run_id": "<id>", "completion": "none|event" }.
action 버튼은
required entityMapping 이 모두 채워지기 전(PROVISIONING·SETUP_REQUIRED)에는
비활성이다 — 매핑 없이 위임된 작업은 앱 쪽에서 실패/부분 처리되기 때문.5. requestedScopes 카탈로그
resource:action 표기. 카탈로그 밖 값은 manifest 검증에서 거부된다.
6. setupStatus 상태 머신
설치 후 초기 설정 진행 상태.InstallationStatus(토큰 발급 기준) 와 직교하며, API 를
게이팅하지 않는다 — 앱/프론트가 상태를 보고 스스로 판단한다.
파생 계산이라 다운그레이드도 일어난다(매핑 삭제 → SETUP_REQUIRED 복귀). 변경 시
installation.setup_status_changed webhook 이 발행된다.
surfaces.settings.readiness 로 PROVISIONING → SETUP_REQUIRED 전환 조건을 정한다:
implicit(기본) — required 매핑이 참조하는 dataset 이 하나라도 준비되면 전환.explicit— 추가로 앱이POST /api/v1/installation/setup-ready를 호출해야 전환.