From a1ee567f5438b71ae8ed87b9b0ff8802dbf03e4b Mon Sep 17 00:00:00 2001 From: happybell80 Date: Fri, 26 Sep 2025 02:23:41 +0900 Subject: [PATCH] Add NaverWorks date filtering troubleshooting documentation --- ...erworks_mail_api_mailaddress_null_issue.md | 4 +- ..._naverworks_slack_01_base_configuration.md | 8 +-- ...0919_naverworks_slack_02_daily_briefing.md | 5 +- ...0919_naverworks_slack_03_cold_mail_list.md | 9 ++- .../250926_naverworks_date_filtering_fix.md | 66 +++++++++++++++++++ 5 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 troubleshooting/250926_naverworks_date_filtering_fix.md diff --git a/troubleshooting/250918_naverworks_mail_api_mailaddress_null_issue.md b/troubleshooting/250918_naverworks_mail_api_mailaddress_null_issue.md index 779854e..4b43cdf 100644 --- a/troubleshooting/250918_naverworks_mail_api_mailaddress_null_issue.md +++ b/troubleshooting/250918_naverworks_mail_api_mailaddress_null_issue.md @@ -154,6 +154,8 @@ GET /v1.0/users/{userId}/mail/messages?folderId=INBOX # 올바른 방식 (200 성공) GET /v1.0/users/{userId}/mail/mailfolders/0/children?limit=3 # folderId=0은 받은메일함 + +Note: 목록 API는 날짜 파라미터(startSearchDate 등)를 지원하지 않으므로, 기간 제한은 응답의 receivedTime을 기준으로 클라이언트에서 필터링합니다. ``` ### 8.3 테스트 결과 @@ -170,4 +172,4 @@ GET /v1.0/users/{userId}/mail/mailfolders/0/children?limit=3 1. **skill-naverworks 서비스 개발 재개** 2. **메일 요약 기능 구현** -3. **Slack 연동 테스트** \ No newline at end of file +3. **Slack 연동 테스트** diff --git a/troubleshooting/250919_naverworks_slack_01_base_configuration.md b/troubleshooting/250919_naverworks_slack_01_base_configuration.md index c767243..b291149 100644 --- a/troubleshooting/250919_naverworks_slack_01_base_configuration.md +++ b/troubleshooting/250919_naverworks_slack_01_base_configuration.md @@ -154,8 +154,7 @@ Gateway → rb8001 전달 정보: ### 코드 분석 결과 (2025-01-09) - **skill-slack**: 8502 포트 엔드포인트 구현됨, rb8001은 직접 WebClient 사용 중 (미연동) - **provider 구분**: 미구현, 기본 Gmail만 동작 (rb8001/app/skills/email_integration.py:260-266) -- **24시간 필터**: 미구현, orderBy만 있음 (skill-email/services/naverworks_provider.py:167) - - NaverWorks API는 searchDateType, startSearchDate, endSearchDate 파라미터 지원 +- **24시간 필터**: 목록 API는 날짜 파라미터 미지원 → 클라이언트(receivedTime) 기준 필터 적용 - **토큰 갱신**: NaverWorks는 auth-server 위임, 자동 호출 없음 - **UUID 변환**: list 경로에서 변환 없음 (263행 user_id는 입력 그대로 전달) @@ -167,7 +166,7 @@ Gateway → rb8001 전달 정보: **P1 (완료)**: - ✅ Gateway X-Source 헤더 추가 (main.py:552, 240) - ✅ rb8001 provider 로직 구현 (email_integration.py:70-130) -- ✅ skill-email 24시간 필터 (naverworks_provider.py:173-179) +- ✅ skill-email 24시간 로컬 필터(응답 후 receivedTime 비교) - ✅ skill-email DEFAULT_USER_ID 제거 (31행 삭제) - ✅ skill-email 401 에러 시 토큰 갱신 (194-210행) @@ -213,9 +212,8 @@ Gateway → rb8001 전달 정보: ### 구현 결정 1. **Provider 선택**: 키워드 우선 → DB 조회 → 둘 다 있으면 질문 -2. **24시간 필터**: skill-email에서 API 파라미터 처리 (startSearchDate, endSearchDate) +2. **24시간 필터**: skill-email에서 응답 후 receivedTime 기준 클라이언트 필터 처리 3. **토큰 갱신**: 401 에러 후 재시도 (1회) 4. **UUID 변환**: Gateway에서 모두 변환 5. **skill-slack 전환**: 단계적 (새 기능부터) 6. **메일 표시**: 5개 요약 + "더보기" 버튼 - diff --git a/troubleshooting/250919_naverworks_slack_02_daily_briefing.md b/troubleshooting/250919_naverworks_slack_02_daily_briefing.md index 6d0d13a..328c296 100644 --- a/troubleshooting/250919_naverworks_slack_02_daily_briefing.md +++ b/troubleshooting/250919_naverworks_slack_02_daily_briefing.md @@ -29,7 +29,7 @@ ### 2.2 처리 흐름 1. 09:00 스케줄러 트리거 2. DB에서 info@company-x.partners 계정 UUID 조회 -3. skill-email `/messages` 호출 (provider=naverworks, 24시간 필터) +3. skill-email `/messages` 호출 (provider=naverworks), 응답을 24시간(receivedTime) 기준 클라이언트 필터 4. 중요 메일 필터링 (긴급/계약/결제/공지) 5. Gemini 요약 생성 6. SlackFormatter.briefing()으로 포맷팅 @@ -82,7 +82,7 @@ - **DB 접근**: DATABASE_URL 환경변수, asyncpg 사용 - **DB 데이터**: naverworks_token 테이블에 user_id, account_id 저장됨 - **NAVER WORKS API**: /mail/mailfolders/0/children 엔드포인트 확인 -- **24시간 필터**: startSearchDate, endSearchDate 파라미터 지원 +- **24시간 필터**: 목록 API는 날짜 파라미터 미지원 → 클라이언트(receivedTime) 기준 필터 필요 - **LLM 서비스**: process_request() 메서드, model="gemini-2.5-flash-lite", 필수 필드: message, user_id, robeing_id - **skill-slack**: X-API-Key 헤더로 SERVICE_API_KEY 필요 @@ -124,4 +124,3 @@ # 24서버에서 실행 python test_naverworks_briefing.py --test all ``` - diff --git a/troubleshooting/250919_naverworks_slack_03_cold_mail_list.md b/troubleshooting/250919_naverworks_slack_03_cold_mail_list.md index 733adda..d62792f 100644 --- a/troubleshooting/250919_naverworks_slack_03_cold_mail_list.md +++ b/troubleshooting/250919_naverworks_slack_03_cold_mail_list.md @@ -36,7 +36,7 @@ ### 2.2 처리 흐름 (현행 기준 + 계획) 1. 새 메일 수신 이벤트 발생 (또는 주기적 체크) 2. rb8001이 skill-email 호출 - - 현행: GET `/messages?provider=naverworks&user_id={UUID}&startSearchDate={T-24h}&endSearchDate={T}` + - 현행: GET `/messages?provider=naverworks&user_id={UUID}&limit=100` 후 클라이언트(receivedTime) 기준 24시간 필터 - 계획: POST `/cold-mail-list` (필터·구조화까지 일괄 처리) 3. 콜드메일 필터링/구조화 - 현행: rb8001에서 키워드/도메인 기반 필터 후 목록 구성 @@ -73,7 +73,7 @@ COLD_MAIL_KEYWORDS = [ ## 4. 구현 파일 구조 ### skill-email 현황/계획 -- 현행: GET `/messages`로 NAVER WORKS 메일 조회, 날짜 파라미터 지원 +- 현행: GET `/messages`로 NAVER WORKS 메일 조회 (날짜 파라미터 미지원 → 클라이언트 필터 필요) - 계획: - `routers/naverworks_mail.py`: POST `/cold-mail-list` 엔드포인트 - `services/naverworks_mail_service.py`: `filter_cold_mails()` @@ -93,14 +93,13 @@ COLD_MAIL_KEYWORDS = [ ## 5. 구현 체크리스트 ### 5.1 skill-email 구현 -- [ ] 날짜 필터 파라미터 표준화(startSearchDate/endSearchDate) 및 검증 +- [ ] 응답 후 receivedTime 기준 클라이언트 필터 구현(타임존/RFC3339 주의) - [ ] 콜드메일 필터링/패턴 매칭 알고리즘 (`filter_cold_mails()`) - [ ] 메일 정보 구조화(회사/담당/제안/첨부) - [ ] (선택) POST `/cold-mail-list` 일괄 처리 엔드포인트 -### 5.2 rb8001 구현 - [ ] 네이버웍스 등록 사용자 조회(DB)로 대상자 결정 -- [ ] skill-email `/messages` 호출 시 provider=naverworks 및 날짜 파라미터 포함 +- [ ] skill-email `/messages` 호출 시 provider=naverworks만 전달(날짜 파라미터 제거), 클라이언트 필터 적용 - [ ] Block Kit 포맷/전송 (현행) 또는 skill-slack 포맷터 연계(계획) - [ ] 라우팅 정책: DM 기본, 채널 옵션 지원 diff --git a/troubleshooting/250926_naverworks_date_filtering_fix.md b/troubleshooting/250926_naverworks_date_filtering_fix.md new file mode 100644 index 0000000..945ccef --- /dev/null +++ b/troubleshooting/250926_naverworks_date_filtering_fix.md @@ -0,0 +1,66 @@ +# NaverWorks 일일 브리핑 날짜 필터링 문제 해결 + +## 날짜: 2025-09-26 +## 작성자: happybell80 +## 관련 서비스: skill-email, rb8001 + +--- + +## 1. 문제 +- NaverWorks 일일 브리핑이 매일 같은 메일 반복 +- 9/25 요청에 9/23, 9/24 메일도 포함됨 + +## 2. 원인 +- NaverWorks Mail API는 날짜 필터 파라미터 지원 안 함 +- 클라이언트 측 필터링 코드 없었음 +- timezone-aware와 naive datetime 비교 불가 문제 + +## 3. 수정 내역 + +### 3.1. 잘못된 테이블명 수정 +**수정 파일들:** +- auth-server/app/api/slack_router.py +- auth-server/app/api/gmail_refresh.py +- auth-server/scripts/run_migration.py +- skill-email/services/db_credentials_provider.py +- DOCS 문서 78개 파일 + +**변경 내용:** +- `users` → `user` +- `gmail_tokens` → `gmail_token` +- `conversation_logs` → `conversation_log` +- `workspace_members` → `workspace_member` +- `companies` → `company` +- `slack_workspaces` → `slack_workspace` + +### 3.2. NaverWorks 토큰 컬럼명 수정 +**수정 파일:** +- skill-email/services/naverworks_provider.py +- auth-server/app/providers/naverworks_passport.py + +**변경 내용:** +- `expiry` → `expires_at` (naverworks_token 테이블) +- gmail_token은 `expiry` 유지 (다른 테이블) + +### 3.3. NaverWorks 날짜 필터링 구현 +**파일:** skill-email/services/naverworks_provider.py + +**수정 내용 (212-265줄):** +1. 클라이언트 측 날짜 필터링 로직 추가 +2. pytz 모듈 추가 (requirements.txt) +3. timezone-aware datetime 비교 구현 +4. 두 가지 날짜 형식 지원: + - ISO datetime 형식 (naverworks_briefing.py: `yesterday.isoformat()`) + - 날짜만 형식 (email_integration.py: `strftime("%Y-%m-%d")`) +5. 날짜만 받으면 현재 시점 기준 정확한 24시간 전 계산 + +### 3.4. 로그 추가 +- 163줄: 날짜 파라미터 수신 로그 +- 215줄: 각 메일 필터링 과정 로그 + +## 4. 검증 결과 +- 정확한 24시간 범위로 12개 메일 정상 필터링 확인 + +--- + +**문서 끝** \ No newline at end of file