From 4169c8d4fd7b666ae96f630d28ce7cfe79503efd Mon Sep 17 00:00:00 2001 From: happybell80 Date: Tue, 19 Aug 2025 11:22:19 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20Gmail=20=EC=95=84=EC=9D=B4=ED=85=9C=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20=ED=83=9C=EC=8A=A4=ED=81=AC=20=EC=A7=84?= =?UTF-8?q?=ED=96=89=20=EC=83=81=ED=99=A9=20=EC=A0=95=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 섹션 3,4,4-1: 실제로 아직 구현 안 됨 ([ ]로 복구) - 섹션 5: 프론트엔드만 완료 (배포 정보 추가) - 섹션 7,8: 통합 테스트와 문서화 아직 미완료 - 실수로 전체 체크박스를 [x]로 변경한 것 복구 --- plans/250819_gmail_item_detailed_tasks.md | 236 ++++++++++++++-------- 1 file changed, 150 insertions(+), 86 deletions(-) diff --git a/plans/250819_gmail_item_detailed_tasks.md b/plans/250819_gmail_item_detailed_tasks.md index 9747ec9..a2d7ca4 100644 --- a/plans/250819_gmail_item_detailed_tasks.md +++ b/plans/250819_gmail_item_detailed_tasks.md @@ -142,8 +142,8 @@ ### 4.1 환경 설정 - [ ] .env 파일 생성/수정 - [ ] DATABASE_URL 설정 - - [ ] SKILL_EMAIL_URL 설정 - - [ ] STATE_SERVICE_URL 설정 + - [ ] SKILL_EMAIL_URL=http://192.168.219.52:8501 + - [ ] MONITOR_SERVICE_URL=http://192.168.219.52:9024 - [ ] 환경변수 로드 확인 - [ ] 연결 테스트 스크립트 작성 @@ -190,100 +190,164 @@ --- -## 5. 프론트엔드 구현 (종태) +## 4-1. rb10508_micro 통합 (종태) + +### 4-1.1 환경 설정 +- [ ] .env 파일 수정 + - [ ] MONITOR_SERVICE_URL=http://192.168.219.52:9024 + - [ ] SKILL_EMAIL_URL=http://192.168.219.52:8501 +- [ ] 환경변수 로드 확인 + +### 4-1.2 Gmail 의도 분류 추가 +- [ ] app/core/intent_classifier.py 수정 + - [ ] Gmail 관련 키워드 감지 ("이메일", "메일", "전송", "보내") + - [ ] Gmail 의도 분류 추가 (INTENT_GMAIL) +- [ ] 의도 분류 테스트 + +### 4-1.3 아이템 확인 미들웨어 +- [ ] app/middleware/gmail_item_check.py 생성 +- [ ] robeing-monitor API 클라이언트 + - [ ] get_gmail_status(user_id) 함수 + - [ ] is_gmail_equipped(user_id) 함수 +- [ ] 미장착 시 응답 메시지 + - [ ] "Gmail 패스포트를 먼저 장착해주세요" + - [ ] 인벤토리 링크 제공 + +### 4-1.4 skill-email 통합 +- [ ] app/skills/email_handler.py 생성 +- [ ] skill-email API 호출 함수 + - [ ] send_email_request(user_id, to, subject, body) + - [ ] 응답 파싱 및 포맷팅 +- [ ] 에러 처리 + - [ ] 토큰 만료 → "Gmail 재인증이 필요합니다" + - [ ] 네트워크 에러 → 재시도 로직 + +### 4-1.5 메시지 라우터 수정 +- [ ] app/core/handlers/message_handler.py 수정 + - [ ] Gmail 의도 감지 시 분기 + - [ ] 아이템 장착 확인 + - [ ] skill-email 호출 + - [ ] 응답 반환 + +### 4-1.6 테스트 시나리오 +- [ ] "종태님한테 회의 일정 메일 보내줘" + - [ ] Gmail 미장착 → 장착 안내 + - [ ] Gmail 장착 → 이메일 발송 성공 +- [ ] "프로젝트 진행 상황 이메일 작성해줘" + - [ ] 이메일 내용 생성 + - [ ] 발송 확인 요청 +- [ ] 토큰 만료 시나리오 + - [ ] 재인증 안내 메시지 + +### 4-1.7 배포 +- [ ] 코드 커밋 및 푸시 +- [ ] Gitea Actions 배포 확인 +- [ ] 로그 모니터링 +- [ ] 실제 테스트 + +--- + +## 5. 프론트엔드 구현 (종태) ✅ 완료 ### 5.1 API 클라이언트 확장 -- [ ] src/api/robeing-api.ts 수정 -- [ ] 타입 정의 - - [ ] GmailCredentialItem 인터페이스 - - [ ] GmailItemsResponse 인터페이스 - - [ ] EquipResponse 인터페이스 - - [ ] ReauthResponse 인터페이스 -- [ ] API 함수 구현 - - [ ] getGmailItems() - - [ ] 헤더 설정 (JWT 토큰) - - [ ] 에러 처리 - - [ ] 응답 타입 변환 - - [ ] equipGmailItem() - - [ ] 요청 바디 구성 - - [ ] 에러 처리 - - [ ] 성공 콜백 - - [ ] startGmailReauth() - - [ ] OAuth 리다이렉트 처리 - - [ ] state 저장 - - [ ] revokeGmailItem() - - [ ] 확인 다이얼로그 - - [ ] 삭제 요청 - - [ ] 상태 업데이트 +- [x] src/api/robeing-api.ts 수정 +- [x] 타입 정의 + - [x] GmailCredentialItem 인터페이스 + - [x] GmailItemsResponse 인터페이스 + - [x] EquipResponse 인터페이스 + - [x] ReauthResponse 인터페이스 +- [x] API 함수 구현 + - [x] getGmailItems() + - [x] 헤더 설정 (JWT 토큰) + - [x] 에러 처리 + - [x] 응답 타입 변환 + - [x] equipGmailItem() + - [x] 요청 바디 구성 + - [x] 에러 처리 + - [x] 성공 콜백 + - [x] startGmailReauth() + - [x] OAuth 리다이렉트 처리 + - [x] state 저장 + - [x] revokeGmailItem() + - [x] 확인 다이얼로그 + - [x] 삭제 요청 + - [x] 상태 업데이트 ### 5.2 Context 상태 관리 -- [ ] src/contexts/ItemContext.tsx 생성 -- [ ] State 인터페이스 정의 - - [ ] equippedItem: GmailCredentialItem | null - - [ ] availableItems: GmailCredentialItem[] - - [ ] loading: boolean - - [ ] error: string | null -- [ ] Actions 정의 - - [ ] FETCH_ITEMS_START - - [ ] FETCH_ITEMS_SUCCESS - - [ ] FETCH_ITEMS_ERROR - - [ ] EQUIP_ITEM_SUCCESS - - [ ] UNEQUIP_ITEM_SUCCESS -- [ ] Reducer 구현 -- [ ] Context Provider 구현 -- [ ] Custom hooks - - [ ] useGmailItems() - - [ ] useEquipItem() +- [x] src/contexts/ItemContext.tsx 생성 +- [x] State 인터페이스 정의 + - [x] equippedItem: GmailCredentialItem | null + - [x] availableItems: GmailCredentialItem[] + - [x] loading: boolean + - [x] error: string | null +- [x] Actions 정의 + - [x] FETCH_ITEMS_START + - [x] FETCH_ITEMS_SUCCESS + - [x] FETCH_ITEMS_ERROR + - [x] EQUIP_ITEM_SUCCESS + - [x] UNEQUIP_ITEM_SUCCESS +- [x] Reducer 구현 +- [x] Context Provider 구현 +- [x] Custom hooks + - [x] useGmailItems() + - [x] useEquipItem() ### 5.3 인벤토리 UI 컴포넌트 -- [ ] src/components/Inventory 디렉토리 생성 -- [ ] GmailPassportCard.tsx - - [ ] 카드 레이아웃 - - [ ] Gmail 로고 아이콘 - - [ ] 이메일 주소 표시 - - [ ] 권한 뱃지 (send/read/modify) - - [ ] 장착 상태 표시 - - [ ] 장착/해제 버튼 - - [ ] 재인증 버튼 (필요시) -- [ ] InventoryGrid.tsx - - [ ] 카드 그리드 레이아웃 - - [ ] 장착된 아이템 섹션 - - [ ] 사용 가능 아이템 섹션 - - [ ] 빈 상태 메시지 -- [ ] EquipModal.tsx - - [ ] 장착 확인 다이얼로그 - - [ ] 레벨 요구사항 표시 - - [ ] 애니메이션 효과 -- [ ] LevelRequirement.tsx - - [ ] 레벨 부족 시 표시 - - [ ] "레벨 5가 되면 사용 가능해요!" 메시지 - - [ ] 현재 레벨 표시 +- [x] src/components/Inventory 디렉토리 생성 +- [x] GmailPassportCard.tsx + - [x] 카드 레이아웃 + - [x] Gmail 로고 아이콘 + - [x] 이메일 주소 표시 + - [x] 권한 뱃지 (send/read/modify) + - [x] 장착 상태 표시 + - [x] 장착/해제 버튼 + - [x] 재인증 버튼 (필요시) +- [x] InventoryGrid.tsx + - [x] 카드 그리드 레이아웃 + - [x] 장착된 아이템 섹션 + - [x] 사용 가능 아이템 섹션 + - [x] 빈 상태 메시지 +- [x] EquipModal.tsx + - [x] 장착 확인 다이얼로그 + - [x] 레벨 요구사항 표시 + - [x] 애니메이션 효과 +- [x] LevelRequirement.tsx + - [x] 레벨 부족 시 표시 + - [x] "레벨 5가 되면 사용 가능해요!" 메시지 + - [x] 현재 레벨 표시 ### 5.4 스타일링 -- [ ] src/styles/inventory.css 생성 -- [ ] 카드 스타일 - - [ ] 호버 효과 - - [ ] 장착 상태 하이라이트 - - [ ] 비활성 상태 (레벨 부족) -- [ ] 버튼 스타일 - - [ ] 장착 버튼 (Primary) - - [ ] 해제 버튼 (Secondary) - - [ ] 재인증 버튼 (Warning) -- [ ] 애니메이션 - - [ ] 페이드인/아웃 - - [ ] 장착 시 반짝임 - - [ ] 로딩 스피너 +- [x] src/styles/inventory.css 생성 +- [x] 카드 스타일 + - [x] 호버 효과 + - [x] 장착 상태 하이라이트 + - [x] 비활성 상태 (레벨 부족) +- [x] 버튼 스타일 + - [x] 장착 버튼 (Primary) + - [x] 해제 버튼 (Secondary) + - [x] 재인증 버튼 (Warning) +- [x] 애니메이션 + - [x] 페이드인/아웃 + - [x] 장착 시 반짝임 + - [x] 로딩 스피너 ### 5.5 통합 및 테스트 -- [ ] App.tsx에 라우트 추가 -- [ ] 네비게이션 메뉴 추가 -- [ ] Context Provider 연결 -- [ ] 개발 서버 테스트 -- [ ] 에러 케이스 테스트 - - [ ] 네트워크 에러 - - [ ] 인증 만료 - - [ ] 레벨 부족 - - [ ] 서버 에러 +- [x] App.tsx에 라우트 추가 +- [x] 네비게이션 메뉴 추가 +- [x] Context Provider 연결 +- [x] 개발 서버 테스트 +- [x] 에러 케이스 테스트 + - [x] 네트워크 에러 + - [x] 인증 만료 + - [x] 레벨 부족 + - [x] 서버 에러 + +### 5.6 배포 (2025-08-19 11:10 완료) +- [x] Git 커밋 (Hash: 09b1001) +- [x] Gitea Actions 빌드 +- [x] dist 디렉토리 생성 +- [x] Nginx 배포 +- [x] https://ro-being.com/inventory 접속 확인 ---