Workflow: Workflow management
Integrations: airtable, cron, dropbox, function, httpRequest, if, manualTrigger, moveBinaryData, noOp, set, splitInBatches

{"id": "48", "name": "Workflow management", "nodes": [{"name": "On clicking 'execute'", "type": "n8n-nodes-base.manualTrigger", "position": [240, 300], "parameters": {}, "typeVersion": 1}, {"name": "Function", "type": "n8n-nodes-base.function", "position": [570, 300], "parameters": {"functionCode": "//console.log(items[0].json.data);\nlet data = items[0].json.data;\nitems = data.map(i => {\n//  console.log({json:i});\n  return {json:i};\n});\n//console.log(items);\nreturn items;"}, "typeVersion": 1}, {"name": "SplitInBatches", "type": "n8n-nodes-base.splitInBatches", "position": [760, 300], "parameters": {"options": {}, "batchSize": 1}, "typeVersion": 1}, {"name": "IF", "type": "n8n-nodes-base.if", "position": [2090, 570], "parameters": {"conditions": {"boolean": [{"value1": "={{$node[\"SplitInBatches\"].context[\"noItemsLeft\"]}}", "value2": true}]}}, "typeVersion": 1}, {"name": "NoOp", "type": "n8n-nodes-base.noOp", "position": [2270, 550], "parameters": {}, "typeVersion": 1}, {"name": "Airtable", "type": "n8n-nodes-base.airtable", "position": [1100, 200], "parameters": {"table": "Workflows", "operation": "list", "application": "<YOUR_APP_ID>", "additionalOptions": {"fields": [], "filterByFormula": "=workflowId={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"}}, "credentials": {"airtableApi": "n8n management demo"}, "typeVersion": 1, "alwaysOutputData": true}, {"name": "Airtable1", "type": "n8n-nodes-base.airtable", "position": [1750, 130], "parameters": {"id": "={{$node[\"Airtable\"].json[\"id\"]}}", "table": "Workflows", "options": {"typecast": true}, "operation": "update", "application": "<YOUR_APP_ID>"}, "credentials": {"airtableApi": "n8n management demo"}, "typeVersion": 1}, {"name": "Airtable2", "type": "n8n-nodes-base.airtable", "position": [1750, 320], "parameters": {"table": "Workflows", "options": {"typecast": true}, "operation": "append", "application": "<YOUR_APP_ID>"}, "credentials": {"airtableApi": "n8n management demo"}, "typeVersion": 1}, {"name": "Set", "type": "n8n-nodes-base.set", "position": [1590, 130], "parameters": {"values": {"string": [{"name": "workflowId", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"}, {"name": "name", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"name\"]}}"}, {"name": "errorWorkflowId", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"errorWorkflow\"]}}"}, {"name": "createdAt", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"createdAt\"]}}"}, {"name": "updatedAt", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}"}, {"name": "nodes", "value": "={{$node[\"Prepare data\"].json[\"fields\"][\"nodes\"]}}"}, {"name": "timezone", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"timezone\"]}}"}, {"name": "CRON_details", "value": "={{$node[\"Prepare data\"].json[\"fields\"][\"CRON_details\"]}}"}, {"name": "rawData", "value": "={{$node[\"Prepare data\"].json[\"fields\"][\"rawData\"]}}"}], "boolean": [{"name": "isActive", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"active\"]}}"}, {"name": "isCRON", "value": "={{$node[\"Prepare data\"].json[\"fields\"][\"isCRON\"]}}"}, {"name": "saveManualExecutions", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"saveManualExecutions\"]}}"}, {"name": "isTrigger", "value": "={{$node[\"Prepare data\"].json[\"fields\"][\"isTrigger\"]}}"}]}, "options": {}, "keepOnlySet": true}, "typeVersion": 1}, {"name": "Set1", "type": "n8n-nodes-base.set", "position": [1590, 320], "parameters": {"values": {"string": [{"name": "workflowId", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}"}, {"name": "name", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"name\"]}}"}, {"name": "errorWorkflowId", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"errorWorkflow\"]}}"}, {"name": "createdAt", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"createdAt\"]}}"}, {"name": "updatedAt", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}"}, {"name": "nodes", "value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"nodes\"]}}"}, {"name": "timezone", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"timezone\"]}}"}, {"name": "CRON_details", "value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"CRON_details\"]}}"}, {"name": "rawData", "value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"rawData\"]}}"}], "boolean": [{"name": "isActive", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"active\"]}}"}, {"name": "isCRON", "value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"isCRON\"]}}"}, {"name": "saveManualExecutions", "value": "={{$node[\"Get Workflow Details\"].json[\"data\"][\"settings\"][\"saveManualExecutions\"]}}"}, {"name": "isTrigger", "value": "={{$node[\"Prepare data1\"].json[\"fields\"][\"isTrigger\"]}}"}]}, "options": {}, "keepOnlySet": true}, "typeVersion": 1}, {"name": "Get All Workflows", "type": "n8n-nodes-base.httpRequest", "position": [410, 300], "parameters": {"url": "http://localhost:5678/rest/workflows", "options": {"fullResponse": false}, "headerParametersUi": {"parameter": [{"name": "Authorization", "value": "<TOKEN>"}]}, "allowUnauthorizedCerts": true}, "typeVersion": 1}, {"name": "Prepare data", "type": "n8n-nodes-base.function", "position": [1430, 130], "parameters": {"functionCode": "let data = $node[\"Get Workflow Details\"].json[\"data\"];\nlet file = $node[\"Get file link\"].json[\"link\"];\nlet nodes = new Set(data[\"nodes\"].map(i => i.type));\nlet nodes2 = [...nodes];\n//console.log(...nodes);\nlet data2 = data[\"nodes\"].map(i => i.name);\nif(nodes2.includes('n8n-nodes-base.cron')){\n  console.log('Cron found!');\n//  console.log(data);\n  let cron_node = data[\"nodes\"].filter(i => i.type == 'n8n-nodes-base.cron');\n  //console.log(cron_node[0].parameters.triggerTimes.item);\n  items[0].json[\"fields\"][\"isCRON\"]=true;\n  items[0].json[\"fields\"][\"nodes\"]=[...nodes];\n  items[0].json[\"fields\"][\"CRON_details\"]=cron_node[0].parameters.triggerTimes.item;\n  items[0].json[\"fields\"][\"rawData\"]=[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}];\n} else {  \n  //console.log('Cron not found!');\n  items[0].json[\"fields\"][\"isCRON\"]=false;\n  items[0].json[\"fields\"][\"nodes\"]=[...nodes];\n  items[0].json[\"fields\"][\"rawData\"]=[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}];\n}\nif(nodes2.some(i => {\n  let regExp = new RegExp(/n8n-nodes-base\\.[\\w]+Trigger/);\n  if(i=='n8n-nodes-base.webhook'){\n    return true;\n  }\n  if(regExp.test(i)){\n    return true;\n  }\n  return false;\n})){\n  items[0].json[\"fields\"][\"isTrigger\"]=true;  \n} else {\n  items[0].json[\"fields\"][\"isTrigger\"]=false;\n}\n  \n//console.log(items);\nreturn items;\n"}, "typeVersion": 1}, {"name": "Prepare data1", "type": "n8n-nodes-base.function", "position": [1430, 320], "parameters": {"functionCode": "let data = $node[\"Get Workflow Details\"].json[\"data\"];\nlet file = $node[\"Get file link\"].json[\"link\"];\nlet nodes = new Set(data[\"nodes\"].map(i => i.type));\nlet nodes2 = [...nodes];\n//console.log(data);\nlet data2 = data[\"nodes\"].map(i => i.name);\nif(nodes2.includes('n8n-nodes-base.cron')){\n  //console.log('Cron found!');\n  let cron_node = data[\"nodes\"].filter(i => i.type == 'n8n-nodes-base.cron');\n  items[0].json={\n    fields:{\n      isCRON:true,\n      nodes:[...nodes],\n      CRON_details:cron_node[0].parameters.triggerTimes.item,\n      rawData:[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}]\n    }\n  };\n} else {  \n  //console.log('Cron not found!');\n  items[0].json={\n    fields:{\n      isCRON:false,\n      nodes:[...nodes],\n      rawData:[{url:file ,filename: 'workflow_'+data[\"id\"]+'__'+data[\"updatedAt\"]+'.json'}]\n    }\n  };\n}\nif(nodes2.some(i => {\n  let regExp = new RegExp(/n8n-nodes-base\\.[\\w]+Trigger/);\n  if(i=='n8n-nodes-base.webhook'){\n    return true;\n  }\n  if(regExp.test(i)){\n    return true;\n  }\n  return false;\n})){\n  items[0].json[\"fields\"][\"isTrigger\"]=true;  \n} else {\n  items[0].json[\"fields\"][\"isTrigger\"]=false;\n}\n//console.log(items);\nreturn items;\n\n"}, "typeVersion": 1}, {"name": "Cron", "type": "n8n-nodes-base.cron", "position": [250, 510], "parameters": {"triggerTimes": {"item": [{"mode": "everyHour", "minute": 15}, {"mode": "everyHour", "minute": 45}]}}, "typeVersion": 1}, {"name": "Move Binary Data", "type": "n8n-nodes-base.moveBinaryData", "position": [1000, -10], "parameters": {"mode": "jsonToBinary", "options": {"keepSource": true}}, "typeVersion": 1}, {"name": "Dropbox", "type": "n8n-nodes-base.dropbox", "position": [1140, -10], "parameters": {"path": "=/workflows/workflow_{{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}/workflow_{{$node[\"Get Workflow Details\"].json[\"data\"][\"id\"]}}__{{$node[\"Get Workflow Details\"].json[\"data\"][\"updatedAt\"]}}.json", "binaryData": true}, "credentials": {"dropboxApi": "My n8n backups"}, "typeVersion": 1}, {"name": "Get Workflow Details", "type": "n8n-nodes-base.httpRequest", "position": [840, -10], "parameters": {"url": "=http://localhost:5678/rest/workflows/{{$node[\"SplitInBatches\"].json[\"id\"]}}", "options": {}, "headerParametersUi": {"parameter": [{"name": "Authorization", "value": "<TOKEN>"}]}, "allowUnauthorizedCerts": true}, "typeVersion": 1}, {"name": "Get file link", "type": "n8n-nodes-base.httpRequest", "position": [1290, -10], "parameters": {"url": "https://api.dropboxapi.com/2/files/get_temporary_link", "options": {}, "requestMethod": "POST", "bodyParametersUi": {"parameter": [{"name": "path", "value": "={{$node[\"Dropbox\"].json[\"path_lower\"]}}"}]}, "headerParametersUi": {"parameter": [{"name": "Authorization", "value": "<TOKEN>"}]}}, "typeVersion": 1, "continueOnFail": true, "alwaysOutputData": true}, {"name": "IF Airtable record exists?", "type": "n8n-nodes-base.if", "position": [1270, 200], "parameters": {"conditions": {"boolean": [{"value1": "={{$node[\"Airtable\"].json[\"id\"] != \"\" && $node[\"Airtable\"].json[\"id\"] != null && $node[\"Airtable\"].json[\"id\"] != undefined}}", "value2": true}]}}, "typeVersion": 1}], "active": true, "settings": {"errorWorkflow": "5"}, "connections": {"IF": {"main": [[{"node": "NoOp", "type": "main", "index": 0}], [{"node": "SplitInBatches", "type": "main", "index": 0}]]}, "Set": {"main": [[{"node": "Airtable1", "type": "main", "index": 0}]]}, "Cron": {"main": [[{"node": "Get All Workflows", "type": "main", "index": 0}]]}, "Set1": {"main": [[{"node": "Airtable2", "type": "main", "index": 0}]]}, "Dropbox": {"main": [[{"node": "Get file link", "type": "main", "index": 0}]]}, "Airtable": {"main": [[{"node": "IF Airtable record exists?", "type": "main", "index": 0}]]}, "Function": {"main": [[{"node": "SplitInBatches", "type": "main", "index": 0}]]}, "Airtable1": {"main": [[{"node": "IF", "type": "main", "index": 0}]]}, "Airtable2": {"main": [[{"node": "IF", "type": "main", "index": 0}]]}, "Prepare data": {"main": [[{"node": "Set", "type": "main", "index": 0}]]}, "Get file link": {"main": [[{"node": "Airtable", "type": "main", "index": 0}]]}, "Prepare data1": {"main": [[{"node": "Set1", "type": "main", "index": 0}]]}, "SplitInBatches": {"main": [[{"node": "Get Workflow Details", "type": "main", "index": 0}]]}, "Move Binary Data": {"main": [[{"node": "Dropbox", "type": "main", "index": 0}]]}, "Get All Workflows": {"main": [[{"node": "Function", "type": "main", "index": 0}]]}, "Get Workflow Details": {"main": [[{"node": "Move Binary Data", "type": "main", "index": 0}]]}, "On clicking 'execute'": {"main": [[{"node": "Get All Workflows", "type": "main", "index": 0}]]}, "IF Airtable record exists?": {"main": [[{"node": "Prepare data", "type": "main", "index": 0}], [{"node": "Prepare data1", "type": "main", "index": 0}]]}}}