{"id":"14","name":"extract_swifts","nodes":[{"name":"On clicking 'execute'","type":"n8n-nodes-base.manualTrigger","position":[-140,820],"parameters":{},"typeVersion":1,"id":"node-e7b4b603"},{"name":"HTTP Request","type":"n8n-nodes-base.httpRequest","position":[320,820],"parameters":{"url":"{{ $env.BASE_URL }}","options":{},"responseFormat":"string"},"typeVersion":1,"id":"node-0466b065"},{"name":"HTML Extract","type":"n8n-nodes-base.htmlExtract","position":[510,820],"parameters":{"options":{},"extractionValues":{"values":[{"key":"countries","attribute":"href","cssSelector":"ol > li > a","returnArray":true,"returnValue":"attribute"}]}},"typeVersion":1,"id":"node-a16e57d5"},{"name":"SplitInBatches","type":"n8n-nodes-base.splitInBatches","position":[910,820],"parameters":{"options":{"reset":false},"batchSize":1},"typeVersion":1,"id":"node-e5183d87"},{"name":"HTTP Request1","type":"n8n-nodes-base.httpRequest","position":[2250,740],"parameters":{"url":"{{ $env.BASE_URL }}","options":{},"responseFormat":"file"},"typeVersion":1,"id":"node-c9fcffa2"},{"name":"HTML Extract1","type":"n8n-nodes-base.htmlExtract","position":[2750,590],"parameters":{"options":{},"sourceData":"binary","extractionValues":{"values":[{"key":"{{ $credentials.key }}","attribute":"href","cssSelector":"span.next > a","returnValue":"attribute"},{"key":"names","cssSelector":"td.table-name","returnArray":true},{"key":"swifts","cssSelector":"td.table-swift","returnArray":true},{"key":"cities","cssSelector":"td.table-city","returnArray":true},{"key":"branches","cssSelector":"td.table-branch","returnArray":true}]}},"typeVersion":1,"id":"node-5b3dc56f"},{"name":"MongoDB1","type":"n8n-nodes-base.mongoDb","position":[3280,590],"parameters":{"fields":"iso_code,country,page,name,branch,city,swift_code,createdAt,updatedAt","options":{"dateFields":"createdAt,updatedAt"},"operation":"insert","collection":"swifts.meetup"},"credentials":{"mongoDb":"db-mongo"},"typeVersion":1,"id":"node-c0512f26"},{"name":"uProc","type":"n8n-nodes-base.uproc","position":[1100,820],"parameters":{"tool":"getCountryNormalized","group":"geographic","country":"={{$node[\"SplitInBatches\"].json[\"country\"].replace(/[\\/0-9]/g, \"\")}}","additionalOptions":{}},"credentials":{"uprocApi":"uproc-miquel"},"typeVersion":1,"id":"node-8e5a5453"},{"name":"Prepare Documents","type":"n8n-nodes-base.function","position":[2930,590],"parameters":{"functionCode":"var newItems = [];\n\nfor (i = 0; i < items[0].json.swifts.length; i++) {\n  var item = {\n    iso_code: $node['uProc'].json.message.code,\n    country: $node['SplitInBatches'].json.country.replace(/[-\\/0-9]/g, \"\"),\n    page: $node['Set Page to Scrape'].json.page,\n    name: items[0].json.names[i],\n    city: items[0].json.cities[i],\n    branch: items[0].json.branches[i],\n    swift_code: items[0].json.swifts[i],\n    createdAt: new Date(),\n    updatedAt: new Date()\n  }\n  newItems.push({json: item});\n}\n\nreturn newItems;\n\n"},"typeVersion":1,"id":"node-b46a277d"},{"name":"More Countries","type":"n8n-nodes-base.if","position":[2810,1100],"parameters":{"conditions":{"string":[{"value1":"={{$node[\"SplitInBatches\"].context[\"noItemsLeft\"] + \"\"}}","value2":"true"}]}},"typeVersion":1,"id":"node-b3e675d4"},{"name":"Set Page to Scrape","type":"n8n-nodes-base.functionItem","position":[1290,680],"parameters":{"functionCode":"const staticData = getWorkflowStaticData('global');\n\nitem.page = \"\";\nif (staticData.page && staticData.page.length) {\n  item.page = staticData.page;\n} else {\n  item.page = $node['SplitInBatches'].json.country;\n}\nreturn item;\n"},"typeVersion":1,"id":"node-e6a9d2f4"},{"name":"More Pages","type":"n8n-nodes-base.if","position":[3070,1020],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"more_pages\"] + \"\"}}","value2":"true"}]}},"typeVersion":1,"id":"node-03a73501"},{"name":"Set More Pages","type":"n8n-nodes-base.function","position":[3470,590],"parameters":{"functionCode":"var next_page = $node['HTML Extract1'].json.next_button && $node['HTML Extract1'].json.next_button.length ? $node['HTML Extract1'].json.next_button : \"\";\nvar more_pages = next_page.length > 0;\nconst staticData = getWorkflowStaticData('global');\n\n//all current items are after date: needs pagination\nif (more_pages) {\n  staticData.page = next_page;\n} else {\n  //don't check more items in previous pages;\n  delete staticData.page;\n}\n\nreturn [\n  {\n    json: {\n      more_pages: more_pages\n    }\n  }\n];\n"},"typeVersion":1,"id":"node-bcdc0c59"},{"name":"Set","type":"n8n-nodes-base.set","position":[1440,680],"parameters":{"values":{"string":[{"name":"url","value":"=https://www.theswiftcodes.com{{$node[\"Set Page to Scrape\"].json[\"page\"]}}"}]},"options":{}},"typeVersion":1,"id":"node-33298176"},{"name":"Generate filename","type":"n8n-nodes-base.functionItem","position":[1600,610],"parameters":{"functionCode":"var generateNameFromUrl = function(url){\n    return url.replace(/[^a-z0-9]/gi, \"_\");\n}\n\nitem.file = generateNameFromUrl(item.url) + \".html\"\nreturn item;"},"typeVersion":1,"id":"node-661aa3b4"},{"name":"Read Binary File","type":"n8n-nodes-base.readBinaryFile","position":[1770,610],"parameters":{"filePath":"=/home/node/.cache/scrapper/{{$json[\"file\"]}}"},"typeVersion":1,"continueOnFail":true,"alwaysOutputData":true,"id":"node-ca60c168"},{"name":"File exists?","type":"n8n-nodes-base.if","position":[1950,610],"parameters":{"conditions":{"string":[{"value1":"={{$node[\"Read Binary File\"].binary.data.mimeType}}","value2":"text/html"}]}},"typeVersion":1,"id":"node-4cd8fd67"},{"name":"Write Binary File","type":"n8n-nodes-base.writeBinaryFile","position":[2400,740],"parameters":{"fileName":"=/home/node/.cache/scrapper/{{$node[\"Generate filename\"].json[\"file\"]}}","dataPropertyName":"=data"},"typeVersion":1,"id":"node-41f9d05d"},{"name":"Read Binary File1","type":"n8n-nodes-base.readBinaryFile","position":[2570,590],"parameters":{"filePath":"=/home/node/.cache/scrapper/{{$json[\"file\"]}}"},"typeVersion":1,"continueOnFail":true,"alwaysOutputData":true,"id":"node-c944171d"},{"name":"Wait","type":"n8n-nodes-base.function","position":[2090,740],"parameters":{"functionCode":"const waitTimeSeconds = 1;\n\nreturn new Promise((resolve) => {\n  setTimeout(() => {\n    resolve([]);\n  }, waitTimeSeconds * 1000);\n});\n"},"typeVersion":1,"continueOnFail":true,"alwaysOutputData":true,"id":"node-b7ada444"},{"name":"Prepare countries","type":"n8n-nodes-base.function","position":[700,820],"parameters":{"functionCode":"return items[0].json.countries.map(function(country) {\n  return {\n  json: {country: country}\n  }\n});"},"typeVersion":1,"id":"node-ff97b954"},{"name":"Create Directory","type":"n8n-nodes-base.executeCommand","position":[70,820],"parameters":{"command":"mkdir -p  /home/node/.cache/scrapper/"},"typeVersion":1,"continueOnFail":true,"id":"node-02ba593b"},{"name":"MongoDB","type":"n8n-nodes-base.mongoDb","disabled":true,"position":[3100,520],"parameters":{"query":"={\"swift_code\": \"{{$json[\"swift_code\"]}}\"}","options":{},"collection":"swifts.meetup"},"credentials":{"mongoDb":"db-mongo"},"executeOnce":false,"typeVersion":1,"alwaysOutputData":true,"id":"node-69bc1832"},{"id":"error-0f4d14c6","name":"Error Handler","type":"n8n-nodes-base.stopAndError","typeVersion":1,"position":[1000,400],"parameters":{"message":"Workflow execution error","options":{}}}],"active":false,"settings":{"executionOrder":"v1","saveManualExecutions":true,"callerPolicy":"workflowsFromSameOwner","errorWorkflow":null,"timezone":"UTC","executionTimeout":3600,"maxExecutions":1000,"retryOnFail":true,"retryCount":3},"connections":{},"meta":{"instanceId":"workflow-5626dd8f","versionId":"1.0.0","createdAt":"2025-09-29T07:07:45.056973","updatedAt":"2025-09-29T07:07:45.056984","owner":"n8n-user","license":"MIT","category":"automation","status":"active","priority":"high","environment":"production"},"description":"Production-ready workflow: extract_swifts. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."}