feat(09-02): add batch summary with failure emphasis
- Add Is Batch Complete IF node to check loop termination - Add Build Batch Summary code node with failure-first format - Add Send Batch Summary HTTP node with Back to List button - Connect Is Batch Complete true output to summary flow - Connect Is Batch Complete false output back to Batch Loop - Summary shows failures with reasons prominently - Warnings shown in detail (<=3) or summary (>3) - Success count shown last
This commit is contained in:
@@ -4747,6 +4747,38 @@
|
||||
-400
|
||||
]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"conditions": {
|
||||
"options": {
|
||||
"caseSensitive": true,
|
||||
"leftValue": "",
|
||||
"typeValidation": "strict"
|
||||
},
|
||||
"conditions": [
|
||||
{
|
||||
"id": "is-batch-complete",
|
||||
"leftValue": "={{ $json.isComplete }}",
|
||||
"rightValue": true,
|
||||
"operator": {
|
||||
"type": "boolean",
|
||||
"operation": "equals"
|
||||
}
|
||||
}
|
||||
],
|
||||
"combinator": "and"
|
||||
},
|
||||
"options": {}
|
||||
},
|
||||
"id": "if-batch-complete",
|
||||
"name": "Is Batch Complete",
|
||||
"type": "n8n-nodes-base.if",
|
||||
"typeVersion": 2,
|
||||
"position": [
|
||||
5620,
|
||||
-400
|
||||
]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"jsCode": "// Prepare batch stop data for execution\n// Input from Check Batch Stop Expired (not expired)\nconst data = $json;\n\n// containerNames is a comma-separated array from callback\nconst containerNames = data.containerNames || [];\n\nreturn {\n json: {\n allMatched: containerNames.map(name => ({ Name: name, Id: null })),\n action: 'stop',\n chatId: data.chatId,\n messageId: data.messageId\n }\n};"
|
||||
@@ -4772,6 +4804,37 @@
|
||||
1560,
|
||||
900
|
||||
]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"jsCode": "// Build batch summary message with failure emphasis\n// Input: final batch state with results array and counters\nconst data = $json;\n\nconst action = data.action;\nconst results = data.results || [];\nconst successCount = data.successCount || 0;\nconst failureCount = data.failureCount || 0;\nconst warningCount = data.warningCount || 0;\nconst totalCount = data.totalCount || results.length;\nconst chatId = data.chatId;\nconst progressMessageId = data.progressMessageId;\n\n// Build summary text - failures emphasized first\nlet summaryText = `<b>Batch ${action} Complete</b>\\n\\n`;\n\n// Show failures first and prominently\nconst failures = results.filter(r => r.status === 'error');\nif (failures.length > 0) {\n summaryText += `<b>\\u274c Failed (${failures.length}):</b>\\n`;\n for (const f of failures) {\n summaryText += `\\u2022 ${f.name}: ${f.reason || 'Unknown error'}\\n`;\n }\n summaryText += '\\n';\n}\n\n// Show warnings summary (not individual) per context discretion\nconst warnings = results.filter(r => r.status === 'warning');\nif (warnings.length > 0) {\n // If 3 or fewer warnings, show details; otherwise just count\n if (warnings.length <= 3) {\n summaryText += `<b>\\u26a0\\ufe0f Warnings (${warnings.length}):</b>\\n`;\n for (const w of warnings) {\n summaryText += `\\u2022 ${w.name}: ${w.reason}\\n`;\n }\n summaryText += '\\n';\n } else {\n summaryText += `\\u26a0\\ufe0f Warnings: ${warnings.length} (containers already in desired state)\\n\\n`;\n }\n}\n\n// Show success count\nif (successCount > 0) {\n summaryText += `<b>\\u2705 Successful:</b> ${successCount}/${totalCount}\\n`;\n} else if (failureCount === 0 && warningCount > 0) {\n // All warnings, no success/failures\n summaryText += `No changes needed for ${totalCount} container(s)\\n`;\n}\n\nreturn {\n json: {\n chatId: chatId,\n messageId: progressMessageId,\n text: summaryText,\n hasFailures: failureCount > 0\n }\n};"
|
||||
},
|
||||
"id": "code-build-batch-summary",
|
||||
"name": "Build Batch Summary",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"position": [
|
||||
5740,
|
||||
-400
|
||||
]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"method": "POST",
|
||||
"url": "=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN }}/editMessageText",
|
||||
"sendBody": true,
|
||||
"specifyBody": "json",
|
||||
"jsonBody": "={{ JSON.stringify({ chat_id: $json.chatId, message_id: $json.messageId, text: $json.text, parse_mode: 'HTML', reply_markup: { inline_keyboard: [[{ text: 'Back to List', callback_data: 'list:0' }]] } }) }}",
|
||||
"options": {}
|
||||
},
|
||||
"id": "http-send-batch-summary",
|
||||
"name": "Send Batch Summary",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"position": [
|
||||
5960,
|
||||
-400
|
||||
]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
@@ -6954,6 +7017,24 @@
|
||||
},
|
||||
"Prepare Next Iteration": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Is Batch Complete",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Is Batch Complete": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Build Batch Summary",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
],
|
||||
[
|
||||
{
|
||||
"node": "Batch Loop",
|
||||
@@ -6963,6 +7044,17 @@
|
||||
]
|
||||
]
|
||||
},
|
||||
"Build Batch Summary": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Send Batch Summary",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Prepare Batch Stop Exec": {
|
||||
"main": [
|
||||
[
|
||||
|
||||
Reference in New Issue
Block a user