Aller au contenu

Evènements de Pâques

Découvrir la gestion avancée de flux d’éléments : tris, filtres, limites, découpages.

Le “workflow” doit afficher tout les évènements qui sont renseignés dans wikipédia et ayant lieu les jours de Pâques (sur ces dernières années).

Le script récupère un fichier JSON depuis internet avec le protocole HTTPS. Celui-ci contient l’ensemble des derniers jours fériés. Les données sont ensuite reformatées puis seuls les 40 premières dates étant marquées comme étant le jour de Pâques sont conservées, et ce, en partant des plus anciennes dates. Pour chacun de ces dates (sans l’année), une requête est effectuée sur wikipedia. En passant par un composant de type code, un filtre conserve uniquement les descriptifs et titres dont l’année correspond bien aux dates sélectionnées.

Evènements de Pâques
{
  "name": "My workflow",
  "nodes": [
    {
      "parameters": {},
      "id": "cca18e2f-0d8f-4a12-b7db-2a6bd5416550",
      "name": "When clicking ‘Test workflow’",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -580,
        80
      ],
      "typeVersion": 1
    },
    {
      "parameters": {
        "url": "https://etalab.github.io/jours-feries-france-data/json/metropole.json",
        "options": {}
      },
      "id": "1aa3f6fd-db5c-4c45-b692-4846ffad73b8",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        -420,
        80
      ]
    },
    {
      "parameters": {
        "jsCode": "const jsonData = items[0].json;\n\nconst result = [];\n\nfor (const [date, nom] of Object.entries(jsonData)) {\n    result.push({\n        date: date,\n        nom: nom\n    });\n}\n\nreturn result.map(item => ({ json: item }));"
      },
      "id": "04e3222c-67df-4fe8-9adf-30c621e8f937",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -260,
        80
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "f0736b26-aa0d-4a41-b878-a06e0239a16e",
              "leftValue": "={{ $json.date }}",
              "rightValue": "={{ $now }}",
              "operator": {
                "type": "dateTime",
                "operation": "before"
              }
            },
            {
              "id": "7d2d1aa0-72e8-4d3d-841f-3ef4a9b175c3",
              "leftValue": "={{ $json.nom }}",
              "rightValue": "Lundi de Pâques",
              "operator": {
                "type": "string",
                "operation": "equals",
                "name": "filter.operator.equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "ede82360-ed84-4ecf-8908-b33fabe6e336",
      "name": "Filter",
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2,
      "position": [
        -60,
        80
      ]
    },
    {
      "parameters": {
        "fieldToSplitOut": "date",
        "options": {}
      },
      "id": "c4a578f1-9e76-448a-9768-62a0de031dc0",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        460,
        80
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const targetYear = $json.year_req;\nconst targetMonth = $json.month_req;\nconst targetDay = $json.day_req;\nconst events = $json.year.map((year,index) => ({\n  year: year,\n  title: $json.description[index],\n  description: $json.extract_html[index]\n}));\n\n// Filtrer les événements par année\nconst filteredEvents = events.filter(event => parseInt(event.year) === parseInt(targetYear));\n\nreturn { json: {     \n    date: targetYear+\"-\"+targetMonth+\"-\"+targetDay,\n    events: filteredEvents\n  } };"
      },
      "id": "5dfa15b7-83ad-4474-b3e7-6fa31b6fbb67",
      "name": "Code1",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1180,
        320
      ]
    },
    {
      "parameters": {
        "url": "=https://en.wikipedia.org/api/rest_v1/feed/onthisday/events/{{ $json.month_req }}/{{ $json.day_req }}",
        "options": {
          "response": {
            "response": {}
          }
        }
      },
      "id": "83ea53ec-eb98-441a-ae32-eebb66d1ffef",
      "name": "Events",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        840,
        80
      ],
      "alwaysOutputData": true
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "17733484-ebfd-4f3b-b887-e755b3cccd2c",
              "name": "day_req",
              "value": "={{ $json.date.split('-')[2] }}",
              "type": "string"
            },
            {
              "id": "00013606-4b52-4a7e-ace6-10b2ea655c87",
              "name": "month_req",
              "value": "={{ $json.date.split('-')[1] }}",
              "type": "string"
            },
            {
              "id": "9c306822-ab42-48bf-94ed-80cd8265071c",
              "name": "=year_req",
              "value": "={{ $json.date.split('-')[0] }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "55e751e2-e767-4e00-815a-bea9b0dae93d",
      "name": "Set Date Parameters",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.3,
      "position": [
        660,
        80
      ]
    },
    {
      "parameters": {
        "maxItems": 40
      },
      "id": "2eef541d-fbd2-45b8-8c03-507e8667b508",
      "name": "Limit",
      "type": "n8n-nodes-base.limit",
      "typeVersion": 1,
      "position": [
        300,
        80
      ]
    },
    {
      "parameters": {
        "mode": "combine",
        "combinationMode": "mergeByPosition",
        "options": {}
      },
      "id": "3b37fdde-0c39-4e98-974e-203dacba7458",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2.1,
      "position": [
        1020,
        320
      ]
    },
    {
      "parameters": {
        "sortFieldsUi": {
          "sortField": [
            {
              "fieldName": "date"
            }
          ]
        },
        "options": {}
      },
      "id": "bd4eea9a-313d-4f3d-a484-d947b1bcff27",
      "name": "Sort",
      "type": "n8n-nodes-base.sort",
      "typeVersion": 1,
      "position": [
        120,
        80
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const fieldsToKeep = $node[\"Set Fields to Keep\"].json[\"fields\"].split(',').map(field => field.trim());\nconst events = $json.events;\n\n// Fonction pour filtrer et garder uniquement les champs spécifiés\nconst filterFields = (obj, fields) => {\n  return fields.reduce((acc, field) => {\n    if (obj[field] !== undefined) {\n      acc[field] = obj[field];\n    }\n    return acc;\n  }, {});\n};\n\n// Initialiser un objet pour stocker les champs combinés\nlet combinedFields = {};\n\n// Filtrer les événements et combiner les champs spécifiés\nevents.forEach(event => {\n  const page = event.pages[0] || {}; // Prendre la première page si elle existe\n  const eventFields = filterFields(event, fieldsToKeep);\n  const pageFields = filterFields(page, fieldsToKeep);\n\n  // Ajouter ou combiner les champs filtrés dans l'objet combiné\n  Object.keys(eventFields).forEach(key => {\n    if (!combinedFields[key]) {\n      combinedFields[key] = eventFields[key];\n    } else if (Array.isArray(combinedFields[key])) {\n      combinedFields[key].push(eventFields[key]);\n    } else {\n      combinedFields[key] = [combinedFields[key], eventFields[key]];\n    }\n  });\n\n  Object.keys(pageFields).forEach(key => {\n    if (!combinedFields[key]) {\n      combinedFields[key] = pageFields[key];\n    } else if (Array.isArray(combinedFields[key])) {\n      combinedFields[key].push(pageFields[key]);\n    } else {\n      combinedFields[key] = [combinedFields[key], pageFields[key]];\n    }\n  });\n});\n\nreturn { json: combinedFields };"
      },
      "id": "f1dae467-3a1c-4c01-b59c-234d2be00fb9",
      "name": "Code2",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1400,
        -40
      ]
    },
    {
      "parameters": {
        "mode": "chooseBranch",
        "output": "input2"
      },
      "id": "92533dd4-238d-4483-a4da-cf9fcef05e15",
      "name": "Merge1",
      "type": "n8n-nodes-base.merge",
      "typeVersion": 2.1,
      "position": [
        1140,
        -80
      ]
    },
    {
      "parameters": {
        "values": {
          "string": [
            {
              "name": "fields",
              "value": "year,description,extract_html"
            }
          ]
        },
        "options": {}
      },
      "name": "Set Fields to Keep",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        720,
        -120
      ],
      "id": "da9dccf7-4178-4ac8-b65d-f735a84d1112"
    }
  ],
  "pinData": {},
  "connections": {
    "When clicking ‘Test workflow’": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter": {
      "main": [
        [
          {
            "node": "Sort",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Set Date Parameters",
            "type": "main",
            "index": 0
          },
          {
            "node": "Set Fields to Keep",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Events": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Set Date Parameters": {
      "main": [
        [
          {
            "node": "Events",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Limit": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Code1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sort": {
      "main": [
        [
          {
            "node": "Limit",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code2": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge1": {
      "main": [
        [
          {
            "node": "Code2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Fields to Keep": {
      "main": [
        [
          {
            "node": "Merge1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e8655611-30ed-4986-9452-faea30e1b59b",
  "meta": {
    "templateCredsSetupCompleted": true,
    "instanceId": "09cd35d1aba7444d7fe329ac311b153e435db7ca8bc4395ee2bc3a4fef5e2050"
  },
  "id": "LzUBin8kNsI7Y2QA",
  "tags": []
}