Skip to main content
앱은 서드파티 코드를 실행하지 않고 선언적 블록 JSON 으로 VPMS 안에 자기 설정 화면을 그린다. 서버가 소유한 컴포넌트 레지스트리로만 렌더링되므로 manifest 는 심사 대상이며, 알 수 없는 블록/필드는 거부된다. 이 문서는 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

urlhttps 만 허용 (VPMS 프론트가 https 라 mixed-content 차단).

divider

configForm

manifest.configSchema 를 폼으로 렌더링해 설치 단위 설정을 입력받는다. 값은 Installation.config 에 저장되고 앱은 GET /api/v1/installationconfig 로 읽는다. 저장 시 config.updated webhook 이 발행된다.
configSchema (manifest 최상위):

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 엔티티가 여러 외부 항목을 가질 수 있다. 단, 외부 항목은 항상 하나의 엔티티에만 속한다(외부→엔티티 해석 유일성). 예: 한 채널(거래처)에 여러 플랫폼을 묶되, 한 플랫폼은 한 채널에만 배정.
매핑 가능한 (vpmsEntity, externalDataset) 조합은 manifest surface 에 선언된 것만이다. 선언 밖 조합으로 매핑을 시도하면 setResourceMappingBAD_REQUEST 로 거부한다.

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 를 호출해야 전환.

7. 데이터 흐름 요약

관련 Open API 엔드포인트:

8. 전체 예시

객실 타입(필수) + 판매 채널(선택) 매핑 + 수동 동기화 action 을 갖춘 표면: