playground

Sentivex Incidents Ticket API

POST/api/playground/run

플레이그라운드 서버사이드 릴레이

API 라우트: POST /api/playground/run — 플레이그라운드 서버사이드 릴레이 목적: /playground(#200 표면 ③)의 "외부 계약" 케이스가 SXE_INGEST_SECRET(Bearer)을 브라우저에 노출하지 않고 external 계약 라우트를 실행하게 한다. 릴레이는 자기 자신을 루프백(env.SELF_BASE_URL)으로 **실제 HTTP 호출** — 가짜 응답 없이 external 라우트의 인증·검증·로직을 그대로 태운다(공개 도메인 경유 금지, #194 함정). 보안: 고정 케이스 화이트리스트(z.enum)만 허용 — 범용 프록시 아님. ingest-demo(쓰기)는 requireProjectAccess 로 대상 프로젝트 접근 권한을 강제하고, externalRef 를 `playground:demo:{projectId}` 로 고정해 재실행 시 같은 이슈에 멱등 upsert(오염 최소화), notify:false 로 알림/토스트를 억제한다. 정리(소프트삭제)는 페이지가 DELETE /api/issues/{issueId} 로 수행(흔적 복원). @author jijuta ([email protected]) @since 2026-07-06

Request body

caseenumrequired
ingest-statusresolve-projectingest-demo
analysisIdstring

Responses

200 성공400 입력 검증 실패(zod)401 미인증(JWT 쿠키 필요)403 권한 없음404 없음
cURL
curl -X POST https://sit.in-bridge.com/api/playground/run \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"case":"ingest-status","analysisId":"string"}'
JavaScript
const res = await fetch("https://sit.in-bridge.com/api/playground/run", {
  method: "POST",
  headers: {
    "Authorization": `Bearer ${token}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    "case": "ingest-status",
    "analysisId": "string"
  })
});
const data = await res.json();