diff --git a/n8n-workflow.json b/n8n-workflow.json index 27d1ab6..0632f79 100644 --- a/n8n-workflow.json +++ b/n8n-workflow.json @@ -1260,119 +1260,6 @@ } } }, - { - "parameters": { - "jsCode": "// Build curl command for callback action execution\nconst data = $input.item.json;\nconst containerId = data.containerId;\nconst action = data.action;\nconst chatId = data.chatId;\nconst messageId = data.messageId;\nconst queryId = data.queryId;\n\n// stop and restart use ?t=10 for graceful timeout\nconst timeout = (action === 'stop' || action === 'restart') ? '?t=10' : '';\n\n// Build curl command that returns HTTP status code\nconst cmd = `curl -s -o /dev/null -w \"%{http_code}\" --max-time 5 -X POST 'http://docker-socket-proxy:2375/v1.47/containers/${containerId}/${action}${timeout}'`;\n\nreturn {\n json: {\n cmd,\n containerId,\n action,\n chatId,\n messageId,\n queryId\n }\n};" - }, - "id": "code-build-callback-cmd", - "name": "Build Callback Action", - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 1340, - 700 - ] - }, - { - "parameters": { - "command": "={{ $json.cmd }}", - "options": {} - }, - "id": "exec-callback-action", - "name": "Execute Callback Action", - "type": "n8n-nodes-base.executeCommand", - "typeVersion": 1, - "position": [ - 1560, - 700 - ] - }, - { - "parameters": { - "jsCode": "// Parse callback action result and get container name\nconst stdout = $input.item.json.stdout;\nconst stderr = $input.item.json.stderr;\nconst cmdData = $('Build Callback Action').item.json;\nconst containerId = cmdData.containerId;\nconst action = cmdData.action;\nconst chatId = cmdData.chatId;\nconst messageId = cmdData.messageId;\nconst queryId = cmdData.queryId;\n\n// Check for curl-level errors first\nif (stderr && stderr.trim()) {\n return {\n json: {\n success: false,\n chatId,\n messageId,\n queryId,\n text: `Failed to ${action} container`,\n answerText: 'Action failed'\n }\n };\n}\n\nconst statusCode = parseInt(stdout.trim());\n\n// 204: Success, 304: Already in state (also success)\nif (statusCode === 204 || statusCode === 304) {\n const verb = action === 'start' ? 'started' :\n action === 'stop' ? 'stopped' : 'restarted';\n return {\n json: {\n success: true,\n chatId,\n messageId,\n queryId,\n containerId,\n text: `Container ${verb} successfully`,\n answerText: `Container ${verb}`\n }\n };\n}\n\n// All error codes get terse message\nreturn {\n json: {\n success: false,\n chatId,\n messageId,\n queryId,\n text: `Failed to ${action} container`,\n answerText: 'Action failed'\n }\n};" - }, - "id": "code-parse-callback-result", - "name": "Parse Callback Result", - "type": "n8n-nodes-base.code", - "typeVersion": 2, - "position": [ - 1780, - 700 - ] - }, - { - "parameters": { - "method": "POST", - "url": "=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN }}/answerCallbackQuery", - "sendBody": true, - "specifyBody": "json", - "jsonBody": "={{ JSON.stringify({ callback_query_id: $json.queryId, text: $json.answerText }) }}", - "options": {} - }, - "id": "http-answer-action", - "name": "Answer Action Query", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [ - 2000, - 700 - ], - "credentials": { - "telegramApi": { - "id": "I0xTTiASl7C1NZhJ", - "name": "Telegram account" - } - } - }, - { - "parameters": { - "method": "POST", - "url": "=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN }}/deleteMessage", - "sendBody": true, - "specifyBody": "json", - "jsonBody": "={{ JSON.stringify({ chat_id: $('Parse Callback Result').item.json.chatId, message_id: $('Parse Callback Result').item.json.messageId }) }}", - "options": {} - }, - "id": "http-delete-suggestion-msg", - "name": "Delete Suggestion Message", - "type": "n8n-nodes-base.httpRequest", - "typeVersion": 4.2, - "position": [ - 2220, - 700 - ], - "credentials": { - "telegramApi": { - "id": "I0xTTiASl7C1NZhJ", - "name": "Telegram account" - } - } - }, - { - "parameters": { - "resource": "message", - "operation": "sendMessage", - "chatId": "={{ $('Parse Callback Result').item.json.chatId }}", - "text": "={{ $('Parse Callback Result').item.json.text }}", - "additionalFields": { - "parse_mode": "HTML" - } - }, - "id": "telegram-send-callback-result", - "name": "Send Callback Result", - "type": "n8n-nodes-base.telegram", - "typeVersion": 1.2, - "position": [ - 2440, - 700 - ], - "credentials": { - "telegramApi": { - "id": "I0xTTiASl7C1NZhJ", - "name": "Telegram account" - } - } - }, { "parameters": { "jsCode": "// Parse update command from message\nconst text = $json.message.text.toLowerCase().trim();\nconst chatId = $json.message.chat.id;\nconst messageId = $json.message.message_id;\n\n// Match update pattern: update followed by container name\nconst match = text.match(/^update\\s+(.+)$/i);\n\nif (!match) {\n return {\n json: {\n error: true,\n errorMessage: 'Invalid update format. Use: update ',\n chatId: chatId\n }\n };\n}\n\nreturn {\n json: {\n containerQuery: match[1].trim(),\n chatId: chatId,\n messageId: messageId\n }\n};" @@ -5151,61 +5038,6 @@ ] ] }, - "Build Callback Action": { - "main": [ - [ - { - "node": "Execute Callback Action", - "type": "main", - "index": 0 - } - ] - ] - }, - "Execute Callback Action": { - "main": [ - [ - { - "node": "Parse Callback Result", - "type": "main", - "index": 0 - } - ] - ] - }, - "Parse Callback Result": { - "main": [ - [ - { - "node": "Answer Action Query", - "type": "main", - "index": 0 - } - ] - ] - }, - "Answer Action Query": { - "main": [ - [ - { - "node": "Delete Suggestion Message", - "type": "main", - "index": 0 - } - ] - ] - }, - "Delete Suggestion Message": { - "main": [ - [ - { - "node": "Send Callback Result", - "type": "main", - "index": 0 - } - ] - ] - }, "Docker List for Action": { "main": [ [