Skip to content

Commit f6f368e

Browse files
committed
refactor(slack): remove hardcoded messages and implement direct notifications for guideline upload
Details: - Moved success/failure texts to lexicon.py. - Added notify_slack_upload_success and notify_slack_upload_failure callbacks. - Passed user_id from API to task to enable Direct Messages via Slack.
1 parent 9bf338d commit f6f368e

4 files changed

Lines changed: 64 additions & 26 deletions

File tree

backend/api/routes/feedback.py

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -261,7 +261,6 @@ async def slack_interactions(request: Request):
261261
)
262262
# --- СЦЕНАРІЙ 3: Завантаження гайдлайну ---
263263
elif callback_id == "modal_upload_guideline":
264-
# Slack повертає масив об'єктів файлів
265264
files = (
266265
state_values.get("block_file_upload", {})
267266
.get("input_file", {})
@@ -271,23 +270,7 @@ async def slack_interactions(request: Request):
271270
return Response(status_code=400)
272271

273272
file_info = files[0]
274-
# file_url = file_info.get("url_private_download")
275-
file_name = file_info.get("name")
276-
277-
logger.info("slack_file_uploaded", user_id=user_id, file_name=file_name)
278-
279-
# --- СЦЕНАРІЙ 3: Завантаження гайдлайну ---
280-
elif callback_id == "modal_upload_guideline":
281-
files = (
282-
state_values.get("block_file_upload", {})
283-
.get("input_file", {})
284-
.get("files", [])
285-
)
286-
if not files:
287-
return Response(status_code=400)
288-
289-
file_info = files[0]
290-
file_url = file_info.get("url_private_download") # РОЗКОМЕНТОВАНО
273+
file_url = file_info.get("url_private_download")
291274
file_name = file_info.get("name")
292275

293276
logger.info("slack_file_uploaded", user_id=user_id, file_name=file_name)
@@ -300,12 +283,6 @@ async def slack_interactions(request: Request):
300283
status_code=200,
301284
)
302285

303-
# Закриваємо модалку
304-
return Response(
305-
content=json.dumps({"response_action": "clear"}),
306-
media_type="application/json",
307-
status_code=200,
308-
)
309286
return Response(status_code=200)
310287

311288

backend/config/lexicon.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,7 @@
4747
"upload_modal_title": "База знань",
4848
"upload_modal_submit": "Завантажити",
4949
"upload_modal_input_label": "Оберіть файл (PDF/TXT)",
50+
# --- Upload Notifications ---
51+
"upload_success": "✅ Гайдлайн *{file_name}* успішно завантажено та векторизовано у базу знань!",
52+
"upload_failure": "❌ *Помилка* обробки гайдлайну *{file_name}*.\n\nДеталі:\n```{error_msg}```",
5053
}

backend/workers/callbacks.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,43 @@ async def notify_slack_on_failure(
9494
],
9595
}
9696
await _send_slack_message(payload)
97+
98+
99+
async def notify_slack_upload_success(user_id: str, file_name: str) -> None:
100+
"""Відправляє повідомлення про успішну векторизацію гайдлайну."""
101+
slack_token = (
102+
settings.SLACK_BOT_TOKEN.get_secret_value()
103+
if hasattr(settings.SLACK_BOT_TOKEN, "get_secret_value")
104+
else settings.SLACK_BOT_TOKEN
105+
)
106+
async with httpx.AsyncClient() as client:
107+
await client.post(
108+
"https://slack.com/api/chat.postMessage",
109+
headers={"Authorization": f"Bearer {slack_token}"},
110+
json={
111+
"channel": user_id,
112+
"text": SLACK_UI["upload_success"].format(file_name=file_name),
113+
},
114+
)
115+
116+
117+
async def notify_slack_upload_failure(
118+
user_id: str, file_name: str, error_msg: str
119+
) -> None:
120+
"""Відправляє повідомлення про провал завантаження/векторизації."""
121+
slack_token = (
122+
settings.SLACK_BOT_TOKEN.get_secret_value()
123+
if hasattr(settings.SLACK_BOT_TOKEN, "get_secret_value")
124+
else settings.SLACK_BOT_TOKEN
125+
)
126+
async with httpx.AsyncClient() as client:
127+
await client.post(
128+
"https://slack.com/api/chat.postMessage",
129+
headers={"Authorization": f"Bearer {slack_token}"},
130+
json={
131+
"channel": user_id,
132+
"text": SLACK_UI["upload_failure"].format(
133+
file_name=file_name, error_msg=error_msg
134+
),
135+
},
136+
)

backend/workers/tasks/ingest_guideline.py

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414

1515
from backend.config.settings import settings
1616
from backend.workers.broker import broker
17+
from backend.workers.callbacks import (
18+
notify_slack_upload_failure,
19+
notify_slack_upload_success,
20+
)
1721

1822
logger = structlog.get_logger()
1923

@@ -30,7 +34,9 @@
3034

3135

3236
@broker.task(task_name="ingest_guideline_task", timeout=300)
33-
async def ingest_guideline_task(file_url: str, file_name: str) -> None:
37+
async def ingest_guideline_task(
38+
file_url: str, file_name: str, user_id: str | None = None
39+
) -> None: # Додано user_id
3440
logger.info("ingest_guideline_started", file_name=file_name)
3541

3642
try:
@@ -79,8 +85,20 @@ async def ingest_guideline_task(file_url: str, file_name: str) -> None:
7985
"guideline_ingestion_success", file_name=file_name, chunks=len(documents)
8086
)
8187

82-
# TODO: Додати notify_slack_on_complete для сповіщення користувача про успіх (опціонально)
88+
logger.info(
89+
"guideline_ingestion_success", file_name=file_name, chunks=len(documents)
90+
)
91+
92+
# ДОДАНО: Сповіщення про успіх
93+
if user_id:
94+
await notify_slack_upload_success(user_id=user_id, file_name=file_name)
8395

8496
except Exception as e:
8597
logger.error("guideline_ingestion_failed", file_name=file_name, error=str(e))
98+
99+
# ДОДАНО: Сповіщення про помилку
100+
if user_id:
101+
await notify_slack_upload_failure(
102+
user_id=user_id, file_name=file_name, error_msg=str(e)
103+
)
86104
raise

0 commit comments

Comments
 (0)