From d2a6ae12f5587fe2fb71d70621314240ba69e6f8 Mon Sep 17 00:00:00 2001 From: happybell80 Date: Fri, 19 Sep 2025 03:12:46 +0900 Subject: [PATCH] =?UTF-8?q?Update:=20NaverWorks=20=EC=9D=B4=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=ED=99=95=EC=9E=A5=20=EA=B5=AC=ED=98=84=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C=20=EB=AC=B8=EC=84=9C=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - async 변경 사항 반영 - URL 패턴 수정 (/users/{userId}/...) - asyncio.run() 이벤트 루프 충돌 해결 내용 추가 - AccountContext 패턴 도입 내용 추가 - NaverWorks get_message body 처리 개선 추가 - API 엔드포인트 실제 구현 반영 (/send, /messages) --- ...250918_skill_email_naverworks_extension.md | 51 +++++++++++-------- 1 file changed, 30 insertions(+), 21 deletions(-) diff --git a/plans/250918_skill_email_naverworks_extension.md b/plans/250918_skill_email_naverworks_extension.md index 125e050..c72a158 100644 --- a/plans/250918_skill_email_naverworks_extension.md +++ b/plans/250918_skill_email_naverworks_extension.md @@ -73,31 +73,40 @@ --- -## 4. 구현 완료 (2025-09-19) +## 4. 구현 완료 (2025-09-19 ~ 2025-09-20) ### Phase 1: 기반 구조 ✅ -- [x] Provider 인터페이스 정의 (EmailProvider Protocol) -- [x] 기존 Gmail 코드를 GmailProvider로 리팩토링 -- [x] 테스트 코드 작성 (tests/test_provider.py) +- [x] Provider 인터페이스를 async로 변경 (EmailProvider Protocol) +- [x] 기존 Gmail 코드를 GmailProvider로 리팩토링 (run_in_executor 사용) +- [x] NaverWorksProvider async 구현 -### Phase 2: NAVER WORKS 구현 ✅ +### Phase 2: NAVER WORKS API 구현 ✅ - [x] NaverWorksProvider 클래스 생성 -- [x] Mail API 클라이언트 구현 - - [x] 메일 목록 조회 (`/mailfolders/{folderId}/children`) - - [x] 메일 발송 (`POST /mail`) - - [x] 메일 상세 조회 (`GET /mail/{mailId}`) +- [x] Mail API URL 패턴 수정 + - [x] 메일 목록: `/users/{userId}/mail/mailfolders/0/children` + - [x] 메일 발송: `POST /users/{userId}/mail` + - [x] 메일 상세: `GET /users/{userId}/mail/{mailId}` (응답 구조 {"mail": {...}}) + - [x] 메일 삭제: `POST /users/{userId}/mail/{mailId}/trash` - [x] 토큰 갱신 로직 (auth-server 연동) -### Phase 3: DB 스키마 문제 수정 ✅ -- [x] slack_user_id 컬럼 참조를 user JOIN으로 변경 -- [x] token_data JSONB로 토큰 저장 통일 -- [x] 하드코딩 OAuth 설정 제거 +### Phase 3: asyncio 이벤트 루프 문제 해결 ✅ +- [x] NaverWorksProvider의 asyncio.run() 제거 (FastAPI 충돌 해결) +- [x] 모든 Provider 메서드를 async로 통일 +- [x] main.py에서 await 추가 -### Phase 4: 테스트 결과 ✅ +### Phase 4: AccountContext 패턴 도입 ✅ +- [x] AccountContext dataclass 정의 (토큰 + account_id) +- [x] _get_account_context() 메서드로 DB 조회 통합 +- [x] 한 번의 쿼리로 token_data와 account_id 조회 +- [x] account_id NULL 시 DEFAULT_USER_ID 폴백 +- [x] 기존 _get_access_token() 유지 (하위 호환성) + +### Phase 5: 테스트 및 검증 ✅ - [x] 토큰 갱신 테스트 성공 -- [x] Refresh Token Rotation 정상 작동 -- [x] 갱신된 토큰으로 메일 30개 조회 성공 -- [x] Git push 완료 (skill-email, auth-server) +- [x] NaverWorks 메일 목록 조회 성공 +- [x] NaverWorks 메일 상세 조회 성공 (응답 구조 수정) +- [x] NaverWorks get_message body 처리 개선 (문자열/dict 타입 대응) +- [x] Git push 및 Actions 배포 완료 --- @@ -146,7 +155,7 @@ CREATE TABLE slack_naverworks_mapping ( ### 7.1 메일 발송 ```http -POST /v2/send-email +POST /send { "provider": "naverworks", "user_id": "3550cef6-63e1-4ceb-8802-a25c9d1c6917", @@ -158,12 +167,12 @@ POST /v2/send-email ### 7.2 메일 조회 ```http -GET /v2/list-emails?provider=naverworks&user_id={user_id}&limit=10 +GET /messages?provider=naverworks&user_id={user_id}&limit=10 ``` -### 7.3 메일 요약 (Slack용) +### 7.3 메일 요약 (Slack용) - 미구현 ```http -POST /v2/mail-summary +POST /mail-summary { "provider": "naverworks", "user_id": "3550cef6-63e1-4ceb-8802-a25c9d1c6917",