관리자 Slack API
참고: 이 문서에 설명된 모든 API는
dta-wi-mono모노레포의dta-wi-medi-api애플리케이션에 구현되어 있습니다.
개요
관리자 Slack API는 Slack을 통한 등록 관리 인터랙티브 기능을 제공합니다.
주요기능
- Slack 등록 인터랙티브 처리: Slack에서 발생하는 등록 관련 인터랙티브 이벤트 처리
[POST] /v1/slack/interactive/registrations - Slack 등록 인터랙티브 처리
Slack 등록 인터랙티브 처리
Slack에서 발생하는 등록 관련 인터랙티브 이벤트를 처리합니다. 등록 모달 열기 또는 등록 승인 액션을 수행할 수 있습니다.
- HTTP Method:
POST - 인증: Slack Signature 검증 필요 (JWT 인증 불필요)
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Content-Type | application/json | 요청 본문 형식 | ✔ |
| X-Slack-Signature | string | Slack 서명 | ✔ |
| X-Slack-Request-Timestamp | string | Slack 요청 타임스탬프 | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| payload | string | Slack 인터랙티브 페이로드 (JSON 문자열) | ✔ |
Payload 구조
payload 필드는 JSON 문자열로, 파싱 후 다음과 같은 구조를 가집니다:
| 필드 | 타입 | 설명 |
|---|---|---|
| user | object | Slack 사용자 정보 |
| actions | array | 인터랙티브 액션 배열 |
| actions[0].value | string | 액션 데이터 (JSON 문자열) |
| trigger_id | string | 모달 열기용 트리거 ID |
| container | object | 메시지 컨테이너 정보 |
| container.type | string | 컨테이너 타입 (예: 'message') |
| container.channel_id | string | 채널 ID (container.type이 'message'인 경우) |
| message.ts | string | 메시지 타임스탬프 (container.type이 'message'인 경우) |
Actions[0].value 구조
actions[0].value는 JSON 문자열로, 파싱 후 다음과 같은 구조를 가집니다:
| 필드 | 타입 | 설명 |
|---|---|---|
| action | string | 액션 타입 ('open_modal' 또는 'approve') |
| data | object | 액션 데이터 |
action: 'open_modal'인 경우 data 구조
| 필드 | 타입 | 설명 |
|---|---|---|
| viewId | string | 뷰 ID |
| messageData | object | 메시지 데이터 |
| doctors | array | 의사 정보 배열 |
| ...rest | any | 기타 등록 관련 데이터 |
action: 'approve'인 경우 data 구조
| 필드 | 타입 | 설명 |
|---|---|---|
| viewId | string | 뷰 ID |
| messageData | object | 메시지 데이터 |
| doctors | array | 의사 정보 배열 |
| ...rest | any | 기타 등록 관련 데이터 |
Request Body 예시
{
"payload": "{\"type\":\"block_actions\",\"user\":{\"id\":\"U12345678\",\"username\":\"john.doe\",\"name\":\"John Doe\"},\"actions\":[{\"action_id\":\"approve_registration\",\"value\":\"{\\\"action\\\":\\\"open_modal\\\",\\\"data\\\":{\\\"siteId\\\":\\\"123e4567-e89b-12d3-a456-426614174000\\\",\\\"doctors\\\":[{\\\"name\\\":\\\"김철수\\\",\\\"email\\\":\\\"doctor@example.com\\\"}],\\\"viewId\\\":\\\"V12345\\\",\\\"messageData\\\":{}}}\"}],\"trigger_id\":\"1234567890.1234567890.abc123def456\",\"container\":{\"type\":\"message\",\"channel_id\":\"C12345678\"},\"message\":{\"ts\":\"1234567890.123456\"}}"
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 처리 성공 | - |
400 Bad Request | 잘못된 요청 | - |
401 Unauthorized | Slack 서명 검증 실패 | - |
500 Internal Server Error | 서버 내부 오류 | 1092 |
200 OK - 성공 (open_modal)
등록 모달이 성공적으로 열렸을 때의 응답입니다. Slack API 응답 형식을 따릅니다.
200 OK - 성공 (approve)
등록 승인이 성공적으로 처리되었을 때의 응답입니다. 커맨드 실행 결과를 반환합니다.
400 Bad Request - 잘못된 액션 타입
알 수 없는 action 타입인 경우, 로그를 남기고 처리를 종료합니다.
401 Unauthorized - Slack 서명 검증 실패
Slack 서명이 유효하지 않은 경우 발생합니다.
처리 흐름
1. open_modal 액션
- Slack payload에서 trigger_id, 등록 데이터, 의사 정보 추출
- container.type이 'message'인 경우 채널 ID와 메시지 타임스탬프 추출
- OpenSheetRegistrationModalCommand 실행하여 Slack 모달 열기
2. approve 액션
- Slack payload에서 viewId, 등록 데이터, 의사 정보, 메시지 데이터, 사용자 정보 추출
- ApproveSheetRegistrationCommand 실행하여 등록 승인 처리
참고사항
- 이 API는 Slack Signature 검증을 통해 인증됩니다 (JWT 인증 불필요)
- Slack 워크스페이스의 'siteRegistration' 설정과 연동되어 작동합니다
- 알 수 없는 action 타입이 전달되면 경고 로그를 남기고 처리를 종료합니다