From 30f3806ae62c1c20e1dd8f403d102a73453b7aa7 Mon Sep 17 00:00:00 2001 From: KWON Date: Tue, 22 Jul 2025 15:01:26 +0900 Subject: [PATCH] =?UTF-8?q?=EB=85=B8=EC=85=98=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EB=B0=9C=EC=83=9D=20=EC=8B=9C=20=ED=95=B4=EB=8B=B9=20=EC=9D=B4?= =?UTF-8?q?=EB=B2=A4=ED=8A=B8=EB=A5=BC=20=ED=98=B8=EC=B6=9C=ED=95=B4?= =?UTF-8?q?=EC=84=9C=20=EC=A0=95=EB=B3=B4=EB=A5=BC=20=EB=B0=9B=EC=95=84?= =?UTF-8?q?=EC=98=A8=20=ED=9B=84=20=ED=95=B4=EB=8B=B9=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=EC=9D=98=20=EA=B0=84=EB=8B=A8=ED=95=9C=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=EC=99=80=20URL=EC=9D=84=20mattermost=EB=A1=9C=20?= =?UTF-8?q?=EC=A0=84=EB=8B=AC=ED=95=98=EB=8A=94=20=EB=B6=80=EB=B6=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/common.py | 21 ++++++++++++++ lib/notion_api.py | 72 ++++++++++++++++++++++++++++------------------- 2 files changed, 64 insertions(+), 29 deletions(-) diff --git a/lib/common.py b/lib/common.py index e69de29..987a00a 100644 --- a/lib/common.py +++ b/lib/common.py @@ -0,0 +1,21 @@ +# lib/common.py + +EVENT_TYPE_LABELS = { + "page.content_updated": "πŸ“ Notion νŽ˜μ΄μ§€ λ‚΄μš© μ—…λ°μ΄νŠΈ λ°œμƒ", + "page.created": "πŸ“„ Notion νŽ˜μ΄μ§€ 생성됨", + "page.deleted": "πŸ—‘οΈ Notion νŽ˜μ΄μ§€ μ‚­μ œλ¨", + "page.locked": "πŸ”’ Notion νŽ˜μ΄μ§€ 잠금", + "page.moved": "πŸ“¦ Notion νŽ˜μ΄μ§€ μœ„μΉ˜ 이동", + "page.properties_updated": "🧾 Notion νŽ˜μ΄μ§€ 속성 λ³€κ²½", + "page.undeleted": "♻️ Notion νŽ˜μ΄μ§€ 볡ꡬ됨", + "page.unlocked": "πŸ”“ Notion νŽ˜μ΄μ§€ 잠금 ν•΄μ œλ¨", + "database.content_updated": "πŸ“š λ°μ΄ν„°λ² μ΄μŠ€ μ½˜ν…μΈ  변경됨", + "database.created": "πŸ†• λ°μ΄ν„°λ² μ΄μŠ€ 생성됨", + "database.deleted": "πŸ—‘οΈ λ°μ΄ν„°λ² μ΄μŠ€ μ‚­μ œλ¨", + "database.moved": "πŸ“¦ λ°μ΄ν„°λ² μ΄μŠ€ μœ„μΉ˜ 이동", + "database.schema_updated": "πŸ“ λ°μ΄ν„°λ² μ΄μŠ€ μŠ€ν‚€λ§ˆ 변경됨", + "database.undeleted": "♻️ λ°μ΄ν„°λ² μ΄μŠ€ 볡ꡬ됨", + "comment.created": "πŸ’¬ λŒ“κΈ€ 생성됨", + "comment.deleted": "πŸ—‘οΈ λŒ“κΈ€ μ‚­μ œλ¨", + "comment.updated": "✏️ λŒ“κΈ€ μˆ˜μ •λ¨", +} diff --git a/lib/notion_api.py b/lib/notion_api.py index c88d39e..adbcbf5 100644 --- a/lib/notion_api.py +++ b/lib/notion_api.py @@ -10,16 +10,7 @@ from datetime import datetime sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) from lib.config import Config - -NOTION_API_BASE = "https://api.notion.com/v1" -NOTION_VERSION = "2022-06-28" - -HEADERS = { - "Authorization": f"Bearer {Config.NOTION_API_SECRET}", - "Notion-Version": NOTION_VERSION, - "Content-Type": "application/json" -} - +from lib.common import EVENT_TYPE_LABELS def get_page_details(page_id: str) -> Optional[Dict]: url = f"{NOTION_API_BASE}/pages/{page_id}" @@ -57,25 +48,25 @@ def handle_notion_event(event: dict) -> Optional[str]: μˆ˜μ‹  이벀트λ₯Ό μ½˜μ†”μ— 좜λ ₯ν•˜κ³ , λ…Έμ…˜ APIλ₯Ό ν˜ΈμΆœν•΄ 상세 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. """ + import logging + from datetime import datetime + # 1) μˆ˜μ‹  이벀트 원본 λ‘œκΉ… logging.info("πŸ”” μˆ˜μ‹ λœ Notion μ›Ήν›… 이벀트:") logging.info(json.dumps(event, ensure_ascii=False, indent=2)) - # 2) μ›Œν¬μŠ€νŽ˜μ΄μŠ€ ID 확인 및 이름 쑰회 (예: workspace_id ν•„λ“œ) + # 2) workspace_id 및 workspace_name 확인 workspace_id = event.get("workspace_id") if not workspace_id: logging.warning("⚠️ workspace_id μ—†μŒ - 이벀트 λ¬΄μ‹œ") return None - # 3) workspace_name 확인 (λ…Έμ…˜ API둜 쑰회 ν•„μš”) - # μ‹€μ œ λ…Έμ…˜ 곡식 API에 workspace 이름 쑰회 μ—”λ“œν¬μΈνŠΈκ°€ μ—†μŒ - # ν…ŒμŠ€νŠΈ 편의λ₯Ό μœ„ν•΄ ν•˜λ“œμ½”λ”© λ°˜ν™˜ workspace_name = get_workspace_name(workspace_id) if workspace_name != "νΌμŠ€νŠΈκ°€λ“ ": logging.info(f"μ›Œν¬μŠ€νŽ˜μ΄μŠ€λͺ…이 '{workspace_name}'μ΄λ―€λ‘œ λ¬΄μ‹œν•¨") return None - # 4) 이벀트 κΈ°λ³Έ 정보 + # 3) 이벀트 κΈ°λ³Έ 정보 event_type = event.get("type", "unknown") timestamp = event.get("timestamp") readable_time = None @@ -89,30 +80,53 @@ def handle_notion_event(event: dict) -> Optional[str]: entity_id = entity.get("id", "unknown") entity_type = entity.get("type", "unknown") + # 4) μž‘μ„±μž 정보 authors = event.get("authors", []) author = authors[0] if authors else {"id": "unknown", "type": "unknown"} author_type = author.get("type", "unknown") author_id = author.get("id", "unknown") - # 5) ꡬ체적 변경사항 API 호좜 (예: νŽ˜μ΄μ§€ 상세 정보) + # 5) λ…Έμ…˜ API둜 상세 νŽ˜μ΄μ§€ 정보 쑰회 detail = fetch_entity_detail(entity_type, entity_id) - # detail은 dict or None - message_lines = [ - f"πŸ“’ Notion 이벀트 λ°œμƒ: `{event_type}`", - f"- πŸ•’ μ‹œκ°„: {readable_time}", - f"- πŸ“ μ›Œν¬μŠ€νŽ˜μ΄μŠ€: {workspace_name}", - f"- πŸ“„ μ—”ν‹°ν‹°: `{entity_type}` / ID: `{entity_id}`", - f"- πŸ‘€ μž‘μ„±μž: `{author_type}` / ID: `{author_id}`", - ] + if not detail: + logging.warning("⚠️ 상세 νŽ˜μ΄μ§€ 정보λ₯Ό κ°€μ Έμ˜€μ§€ λͺ»ν•¨") + return None - if detail: - detail_str = json.dumps(detail, ensure_ascii=False, indent=2) - message_lines.append(f"- πŸ” 상세 λ‚΄μš©:\n```json\n{detail_str}\n```") + # 6) νŽ˜μ΄μ§€ 제λͺ© μΆ”μΆœ + page_title = "(제λͺ© μ—†μŒ)" + try: + props = detail.get("properties", {}) + title_prop = props.get("μž‘μ—… 이름", {}) + if title_prop.get("type") == "title": + title_arr = title_prop.get("title", []) + if title_arr: + page_title = "".join(t.get("plain_text", "") for t in title_arr) + except Exception as e: + logging.error(f"νŽ˜μ΄μ§€ 제λͺ© μΆ”μΆœ 쀑 였λ₯˜: {e}") + + # 7) μž‘μ„±μž 이름 μΆ”μΆœ (μ΅œμ’… νŽΈμ§‘μž 이름) + editor_name = "(μ•Œ 수 μ—†μŒ)" + try: + last_edited_by = props.get("μ΅œμ’… νŽΈμ§‘μž", {}).get("last_edited_by", {}) + editor_name = last_edited_by.get("name", editor_name) + except Exception as e: + logging.error(f"μž‘μ„±μž 이름 μΆ”μΆœ 쀑 였λ₯˜: {e}") + + # 8) νŽ˜μ΄μ§€ URL + page_url = detail.get("url", "URL μ—†μŒ") + + # 9) λ©”μ‹œμ§€ ꡬ성 + event_label = EVENT_TYPE_LABELS.get(event_type, f"πŸ“’ Notion 이벀트 λ°œμƒ: `{event_type}`") + message = ( + f"{event_label}\n" + f"- πŸ•’ μ‹œκ°„: {readable_time}\n" + f"- πŸ“„ νŽ˜μ΄μ§€ 제λͺ©: {page_title}\n" + f"- πŸ‘€ μž‘μ—…μž: {editor_name}\n" + f"- πŸ”— [νŽ˜μ΄μ§€ λ°”λ‘œκ°€κΈ°]({page_url})" + ) - message = "\n".join(message_lines) logging.info("πŸ”” μƒμ„±λœ λ©”μ‹œμ§€:\n" + message) - return message