# NAVER WORKS → Slack 연동 [4/5] Slack Lists API skill-slack 통합 실행 계획

## 작성일: 2025-09-30, 수정: 2025-10-10
## 작성자: Claude (로컬 개발자)
## 위치: `/home/happybell80/ivada_project/DOCS/troubleshooting/250930_naverworks_slack_04_lists_api_skill_integration.md`
## 상태: ✅ 완료

---

## 목표

rb8001의 Slack Lists API 오류 수정 및 원칙 위반 구조 개선

### 현재 문제
1. **API 엔드포인트 오류**: rb8001/app/services/slack_lists_client.py
   - 35줄: `lists.items.create` (잘못됨) → `slackLists.items.create` (정답)
   - 84줄: `lists.items.update` (잘못됨) → `slackLists.items.update` (정답)
   - 136-143줄: 필드 형식 오류 (column_id 기반 구조 필요)
2. **원칙 위반**: rb8001(뇌)이 직접 aiohttp로 Slack API 호출

### 목표
skill-slack에 올바른 Lists 엔드포인트 추가 → rb8001은 HTTP로만 호출

## 테스트 파일 확인 완료

### skill-slack/tests/test_slack_lists.py
- 실제 동작하는 헬퍼 함수 포함:
  - `list_all_items(list_id, slack_token)` - 리스트 아이템 조회
  - `add_file_to_list(list_id, file_id, slack_token, email?, phone?)` - 아이템 추가
- pytest 테스트 클래스: TestSlackLists
- 스탠드얼론 실행 지원

### 실제 사용 리스트 (콜드메일) ✅
- **Lists ID**: F09J1HPPQJG
- **채널 ID**: C09HR9BMT51
- **환경변수**: SLACK_LIST_ID, COLDMAIL_CHANNEL_ID

### 콜드메일 리스트 컬럼 구조 (확인 완료)
| Column ID | 타입 | 설명 | 사용 |
|-----------|------|------|------|
| `Col00` | checkbox | 완료 체크박스 | ✅ False |
| `Col01` | user | 담당자 (assignee) | - |
| `Col02` | date | 마감일 (due_date) | - |
| `Col09HGCGB45D` | attachment | 첨부파일 (IR) | ✅ document_ids |
| `Col09HQTDUM0T` | rich_text | 회사명 (name) | ✅ business_area |
| `Col09JATRA4GZ` | email | 이메일 | ✅ contact_person |
| `Col09JRU1U1FA` | checkbox | 체크박스 | - |

---

## 컬럼 구조 동적 처리 전략

### 문제
- 컬럼은 Slack에서 수동 추가/수정 가능 → 변경 시마다 코드 수정 필요

### 조사 결과 (2025-10-10)
- `slackLists.items.list` 응답에는 `column_id`만 있고, column name/type 없음
- Slack API에 컬럼 메타데이터 조회 API 없음 (확인: https://docs.slack.dev/reference/methods/)
- **결론**: 컬럼명→column_id 자동 매핑 불가능

### 현재 방식 (유지)
- column_id 하드코딩 (rb8001/app/scheduler/jobs/coldmail_briefing.py:188-200)
- 컬럼 변경 시 코드 직접 수정 필요

---

## Slack Lists API 스펙

### 리스트 조회
- **엔드포인트**: `https://slack.com/api/slackLists.items.list`
- **메서드**: POST
- **요청**: `{"list_id": "...", "limit": 100}`
- **응답**: `{"ok": true, "items": [{"fields": [{"column_id": "Col00", "checkbox": false, ...}]}]}`

### 아이템 생성
- **엔드포인트**: `https://slack.com/api/slackLists.items.create`
- **메서드**: POST
- **요청**: `{"list_id": "...", "initial_fields": [{"column_id": "Col00", "checkbox": false}, ...]}`
- **응답**: `{"ok": true, "item": {"id": "..."}}`

### 아이템 업데이트
- **엔드포인트**: `https://slack.com/api/slackLists.items.update`
- **메서드**: POST
- **요청**: `{"list_id": "...", "cells": [{"row_id": "Rec...", "column_id": "Col00", "checkbox": true}]}`
- **응답**: `{"ok": true}`
- **출처**: https://docs.slack.dev/reference/methods/slackLists.items.update/

---

## 구현 가이드

### 1. skill-slack 폴더 구조 확인 완료 ✅
- app/services/ 존재 (slack_client.py, digest.py 등 7개 파일)
- app/api/endpoints/ 존재 (messages.py, actions.py, digest.py, summary.py)
- messages.py:19-64 참고 (토큰 처리, 인증, 에러 핸들링)

### 2. 테스트 파일 확인 완료 ✅
- skill-slack/tests/test_slack_lists.py:137-222 - 실제 동작 확인됨 (51124 서버)
  - list_all_items() - slackLists.items.list 호출 (53줄)
  - add_file_to_list() - slackLists.items.create 호출 (97줄, 188줄)
  - initial_fields 구조: column_id + 타입별 필드 (103-118줄)
  - files_upload_v2 사용 (81줄)

### 3. 생성 파일 (FastAPI 구조 원칙 준수)
- **app/models/requests.py** (60-68줄 참고, 추가)
  - `SlackListRequest(list_id, initial_fields?, token?)`
- **app/services/slack_lists_service.py** (신규, 비즈니스 계층)
  - `list_items(list_id, token)`, `create_item(list_id, fields, token)`
  - test_slack_lists.py:137-222 로직 이전
- **app/api/endpoints/lists.py** (신규, 요청 계층)
  - `GET /lists/{list_id}/items`, `POST /lists/items`
  - messages.py:19-64 패턴 (토큰/인증/에러)
- **app/api/__init__.py** (4줄, 12줄 참고, 추가)
  - `from .endpoints import lists`
  - `router.include_router(lists.router, prefix="/lists", tags=["Lists"])`

### 4. rb8001 수정 ✅
- **rb8001/app/services/slack_lists_client.py** 제거 완료
- **rb8001/scheduler/jobs/coldmail_briefing.py:83** - import 제거 완료
- **rb8001/scheduler/jobs/coldmail_briefing.py:184-194** - skill-slack HTTP 호출로 교체 완료
  - POST `{SKILL_SLACK_URL}/api/v1/lists/items`
  - Payload: list_id, initial_fields (실제 컬럼 구조 적용)
  - 사용 필드:
    - Col00 (checkbox): False
    - Col09HQTDUM0T (rich_text): company_name
    - Col09JATRA4GZ (email): [contact_person]
    - Col09HGCGB45D (attachment): [document_id] (첫 번째만)

---

## 참고 문서

- `/home/happybell80/ivada_project/skill-slack/tests/test_slack_lists.py` - 실제 동작 코드
- `/DOCS/troubleshooting/250919_skill_slack_deployment_plan.md` - skill-slack 아키텍처
- `/DOCS/troubleshooting/250930_naverworks_slack_03_cold_mail_list.md` - 콜드메일 시스템
- `/DOCS/troubleshooting/20251004_happybell80_로빙_뇌_기관_원칙_위반_현황.md` - 원칙 위반 현황

## 테스트 결과

### 2025-10-05 (51124 서버) - skill-slack Lists API 동작 검증 ✅
1. **POST /api/v1/lists/items** - 성공
   - Item ID: Rec09JV81HM6G 생성
   - 회사명, 이메일, 첨부파일 정상 등록
2. **파일 업로드 방식**:
   - `files_upload_v2(channel=...)` → 채널 메시지 생성
   - `files_upload_v2()` (channel 생략) → 업로드만 (메시지 없음) ✅

### 2025-10-10 - rb8001 rich_text 필드 형식 수정 완료 ✅
- **파일 업로드**: F09KG5EUDSP
- **Lists 아이템 생성**: Rec09KLEQGQCW
- **모든 필드 정상 작동**: checkbox, rich_text, email, attachment
- **적용된 형식** (rb8001/app/scheduler/jobs/coldmail_briefing.py:189-198):
  - **checkbox** (Col00): `{"column_id": "Col00", "checkbox": false}`
  - **rich_text** (Col09HQTDUM0T): `{"column_id": "...", "rich_text": [{"type": "rich_text", "elements": [{"type": "rich_text_section", "elements": [{"type": "text", "text": "회사명"}]}]}]}`
  - **email** (Col09JATRA4GZ): `{"column_id": "...", "email": ["test@example.com"]}`
  - **attachment** (Col09HGCGB45D): `{"column_id": "...", "attachment": ["file_id"]}`
- **출처**: https://docs.slack.dev/reference/block-kit/blocks/rich-text-block/

## 주의사항

1. **컬럼 ID 하드코딩 유지**: Slack API에 컬럼 메타데이터 조회 불가능, 동적 처리 불가
2. **Slack Lists 제약**: 유료 플랜에서만 사용 가능
3. **파일 업로드**: files_upload_v2(channel 생략) 사용 - 채널 메시지 생성 안 함

---

*"로빙(뇌)은 판단만, skill-slack(손)이 실행한다"*
