Skip to content

Commit 480cdd3

Browse files
committed
feat(slack): implement interactive button handlers and move UI strings to lexicon
1 parent d06779f commit 480cdd3

File tree

2 files changed

+52
-2
lines changed

2 files changed

+52
-2
lines changed

backend/api/routes/feedback.py

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import json
22

3+
import httpx
34
import structlog
45
from fastapi import APIRouter, HTTPException, Request, Response
56

67
from backend.config.lexicon import SLACK_UI
78
from backend.workers.tasks.generate_draft import generate_draft_task
9+
from backend.workers.tasks.publish_post import publish_post_task
810

911
logger = structlog.get_logger()
1012
router = APIRouter(prefix="/slack", tags=["Slack Integration"])
@@ -60,7 +62,6 @@ async def slack_slash_command(request: Request):
6062

6163
@router.post("/interactions")
6264
async def slack_interactions(request: Request):
63-
# ... код обробки кнопок залишається тим самим ...
6465
form_data = await request.form()
6566
payload_str = form_data.get("payload")
6667

@@ -69,6 +70,7 @@ async def slack_interactions(request: Request):
6970

7071
payload = json.loads(str(payload_str))
7172
user_id = payload.get("user", {}).get("id")
73+
response_url = payload.get("response_url")
7274

7375
if payload.get("type") == "block_actions":
7476
actions = payload.get("actions", [])
@@ -78,7 +80,50 @@ async def slack_interactions(request: Request):
7880
if action_id == "action_publish_draft":
7981
logger.info("slack_draft_approved_button", user_id=user_id)
8082

83+
# TODO: Витягнути реальний контент з payload/DB
84+
await publish_post_task.kiq(
85+
post_id="temp_id",
86+
platform="telegram",
87+
content="Згенерований контент",
88+
)
89+
90+
async with httpx.AsyncClient() as client:
91+
await client.post(
92+
response_url,
93+
json={
94+
"replace_original": True,
95+
"text": SLACK_UI["interact_approved_text"],
96+
"blocks": [
97+
{
98+
"type": "section",
99+
"text": {
100+
"type": "mrkdwn",
101+
"text": SLACK_UI["interact_approved_section"],
102+
},
103+
}
104+
],
105+
},
106+
)
107+
81108
elif action_id == "action_reject_draft":
82109
logger.info("slack_draft_rejected_button", user_id=user_id)
83110

111+
async with httpx.AsyncClient() as client:
112+
await client.post(
113+
response_url,
114+
json={
115+
"replace_original": True,
116+
"text": SLACK_UI["interact_rejected_text"],
117+
"blocks": [
118+
{
119+
"type": "section",
120+
"text": {
121+
"type": "mrkdwn",
122+
"text": SLACK_UI["interact_rejected_section"],
123+
},
124+
}
125+
],
126+
},
127+
)
128+
84129
return Response(status_code=200)

backend/config/lexicon.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,14 @@
99
"error_fallback": "❌ Помилка задачі: {topic}",
1010
"error_header": "🚨 Сталася помилка",
1111
"error_details": "*Тема/Задача:* {topic}\n*Замовник:* <@{user_id}>\n\n*Деталі помилки:*\n```{error_msg}```",
12-
# --- НОВІ КЛЮЧІ: Slash Commands ---
12+
# --- Slash Commands ---
1313
"cmd_unknown": "Невідома команда.",
1414
"cmd_missing_args": "Вкажіть тему та платформу. Формат: `/draft Тема | платформа`\nНаприклад: `/draft Тривога і кава | telegram`",
1515
"cmd_invalid_platform": "Невідома платформа '{platform}'. Доступні: {valid_platforms}",
1616
"cmd_accepted": "⏳ Прийнято в роботу! Починаю RAG-пошук та генерацію на тему: *{topic}* для {platform}...",
17+
# --- Interactions ---
18+
"interact_approved_text": "✅ Драфт схвалено!",
19+
"interact_approved_section": "✅ *Опубліковано!*\nДрафт відправлено в чергу на публікацію.",
20+
"interact_rejected_text": "❌ Драфт відхилено.",
21+
"interact_rejected_section": "❌ *Відхилено!*\nЦей варіант видалено. Можете спробувати іншу тему.",
1722
}

0 commit comments

Comments
 (0)