# 내부 API

## PHP 웹 API

모든 경로는 로그인 세션과 CSRF 토큰이 필요합니다.

- `GET /api/apps/{id}/definition`: 앱 설정 조회
- `PUT /api/apps/{id}/definition`: 설정 저장
- `POST /api/apps/{id}/validate`: 설정 검증
- `POST /api/apps/{id}/build`: 버전 스냅샷 및 빌드 작업 생성
- `GET /api/builds/{id}`: 빌드 상태와 산출물
- `GET /api/builds/{id}/logs?after={logId}`: 증분 로그
- `POST /api/builds/{id}/cancel`: 취소
- `POST /api/builds/{id}/retry`: 재시도
- `POST /api/builds/{id}/release`: 스토어 출시 작업 생성

빌드 요청:

```json
{
  "platforms": ["android", "ios"],
  "environment": "production",
  "releaseNotes": "첫 번째 정식 버전"
}
```

출시 요청:

```json
{
  "storeConnectionId": 1,
  "track": "internal",
  "releaseStatus": "draft"
}
```

## Node 내부 API

기본 주소: `http://127.0.0.1:4100`

모든 `/v1` 요청은 다음 헤더가 필요합니다.

```text
X-Builder-Timestamp: Unix timestamp
X-Builder-Signature: hex HMAC-SHA256
Content-Type: application/json
```

서명 원문:

```text
timestamp + "." + raw_request_body
```

### 작업 생성

`POST /v1/jobs`

```json
{
  "appId": 1,
  "appVersionId": 1,
  "platform": "android",
  "environment": "production",
  "requestedBy": 1,
  "priority": 10
}
```

### 작업 조회·제어

- `GET /v1/jobs/{id}`
- `POST /v1/jobs/{id}/cancel`
- `POST /v1/jobs/{id}/retry`

GET도 빈 본문을 기준으로 HMAC 서명을 생성합니다.

### 상태 점검

`GET /health`

로컬 네트워크 전용이며 DB 버전, DRY RUN, 허용 플랫폼, 빌드·릴리스 워커 상태를 반환합니다.
