{
  "name": "index_blog",
  "nodes": [
    {
      "parameters": {
        "splitInBatchesNotice": "",
        "batchSize": 1,
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        -3664,
        -64
      ],
      "id": "348a5934-bf0c-4a01-9c96-a554226e33e7",
      "name": "Loop Over Items"
    },
    {
      "parameters": {
        "authentication": "googleFirebaseCloudFirestoreOAuth2Api",
        "resource": "document",
        "operation": "create",
        "projectId": "permifastdev-96c9b",
        "database": "(default)",
        "collection": "blog",
        "documentId": "_id",
        "columns": "=",
        "simple": true
      },
      "type": "n8n-nodes-base.googleFirebaseCloudFirestore",
      "typeVersion": 1.1,
      "position": [
        -48,
        480
      ],
      "id": "b73542c8-01da-4430-83a1-73fde3769219",
      "name": "Google Cloud Firestore1",
      "credentials": {
        "googleFirebaseCloudFirestoreOAuth2Api": {
          "id": "KSV8PLmmliYiqrsu",
          "name": "Google Firebase Cloud Firestore account"
        }
      }
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "\n\nreturn $input.all();",
        "notice": ""
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -1088,
        448
      ],
      "id": "50d6408d-9b2f-4755-bd42-54532b307e9c",
      "name": "Code1"
    },
    {
      "parameters": {
        "preBuiltAgentsCalloutHttpRequest": "",
        "curlImport": "",
        "method": "POST",
        "url": "=https://queue.fal.run/workflows/meyergreg/n3",
        "authentication": "none",
        "provideSslCertificates": false,
        "sendQuery": false,
        "sendHeaders": true,
        "specifyHeaders": "keypair",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key 10d22129-9163-4468-bf78-5d9cc36addfb:d7561fcb3538a3463cd75ff764e95519"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "json",
        "specifyBody": "keypair",
        "bodyParameters": {
          "parameters": [
            {
              "name": "prompt",
              "value": "={{ $json.message.content }}"
            }
          ]
        },
        "options": {},
        "infoMessage": ""
      },
      "id": "57db2332-df12-4add-96fc-ab84d27e9c63",
      "name": "Subscribe to FLUX Stream1",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        -2768,
        368
      ]
    },
    {
      "parameters": {
        "preBuiltAgentsCalloutHttpRequest": "",
        "curlImport": "",
        "method": "GET",
        "url": "={{ $node[\"Extract IDs1\"].json.status_url.replace('/status','') }}",
        "authentication": "none",
        "provideSslCertificates": false,
        "sendQuery": false,
        "sendHeaders": true,
        "specifyHeaders": "keypair",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key 10d22129-9163-4468-bf78-5d9cc36addfb:d7561fcb3538a3463cd75ff764e95519"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": false,
        "options": {},
        "infoMessage": ""
      },
      "id": "0960334b-ad29-41c2-a1ce-b8e2ec0c673f",
      "name": "Fetch Final Result",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        -1216,
        0
      ]
    },
    {
      "parameters": {
        "keepOnlySet": false,
        "values": {
          "string": [
            {
              "name": "status_url",
              "value": "={{ $node[\"Subscribe to FLUX Stream1\"].json.status_url }}"
            }
          ],
          "number": [
            {
              "name": "request_id",
              "value": "={{ $node[\"Subscribe to FLUX Stream1\"].json.request_id }}"
            }
          ]
        },
        "options": {}
      },
      "id": "91d3d38e-4ec4-4678-9f2d-bc22afdc9204",
      "name": "Extract IDs1",
      "type": "n8n-nodes-base.set",
      "typeVersion": 1,
      "position": [
        -2464,
        368
      ]
    },
    {
      "parameters": {
        "preBuiltAgentsCalloutHttpRequest": "",
        "curlImport": "",
        "method": "GET",
        "url": "={{ $node[\"Extract IDs1\"].json.status_url }}",
        "authentication": "none",
        "provideSslCertificates": false,
        "sendQuery": false,
        "sendHeaders": true,
        "specifyHeaders": "keypair",
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Key 10d22129-9163-4468-bf78-5d9cc36addfb:d7561fcb3538a3463cd75ff764e95519"
            }
          ]
        },
        "sendBody": false,
        "options": {},
        "infoMessage": ""
      },
      "id": "f84872c0-472c-4b56-b1a7-d8984970c766",
      "name": "Check Status3",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        -2128,
        368
      ]
    },
    {
      "parameters": {
        "conditions": {
          "string": [
            {
              "value1": "={{ $json.status }}",
              "operation": "equal",
              "value2": "COMPLETED"
            }
          ]
        },
        "combineOperation": "all"
      },
      "id": "3d78c60e-c693-4f59-b9b2-803f14ff3786",
      "name": "Is Completed?1",
      "type": "n8n-nodes-base.if",
      "typeVersion": 1,
      "position": [
        -1600,
        208
      ]
    },
    {
      "parameters": {
        "resume": "timeInterval",
        "amount": 5,
        "unit": "seconds"
      },
      "id": "f7ea0c56-f8cf-4ac7-b082-8d483bcf113b",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1344,
        400
      ],
      "webhookId": "150069ed-885b-497f-a32a-09e7088136e6",
      "typeVersion": 1.1
    },
    {
      "parameters": {
        "preBuiltAgentsCalloutHttpRequest": "",
        "curlImport": "",
        "method": "POST",
        "url": "=https://bo.permifast.com/api/upload",
        "authentication": "none",
        "provideSslCertificates": false,
        "sendQuery": false,
        "sendHeaders": false,
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "parameterType": "formData",
              "name": "folder",
              "value": "image_upload_from_n8n"
            },
            {
              "parameterType": "formBinaryData",
              "name": "file",
              "inputDataFieldName": "data"
            }
          ]
        },
        "options": {},
        "infoMessage": ""
      },
      "id": "a1a866c3-ef4f-4c2a-9e64-e34882662245",
      "name": "Get Signed URL2",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        -784,
        0
      ]
    },
    {
      "parameters": {
        "mode": "raw",
        "duplicateItem": false,
        "jsonOutput": "={\n  \"url\": {{ $json.url.toJsonString() }},\n\n}",
        "includeOtherFields": false,
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -384,
        -400
      ],
      "id": "d7bdc024-1132-4a03-8de7-a602f3881fe8",
      "name": "Edit Fields1"
    },
    {
      "parameters": {
        "mode": "append",
        "numberInputs": 2
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.1,
      "position": [
        -384,
        -176
      ],
      "id": "a3a4c3e7-8aa6-4f00-8f99-f33971bc44ec",
      "name": "Merge"
    },
    {
      "parameters": {
        "resource": "text",
        "operation": "message",
        "modelId": {
          "__rl": true,
          "value": "gpt-4o-mini",
          "mode": "list",
          "cachedResultName": "GPT-4O-MINI"
        },
        "messages": {
          "values": [
            {
              "content": "=Tu es un expert un prompt ingenieur pour g\u00e9n\u00e9rer des images IA \u00e0 partir de situations.\nTu dois g\u00e9n\u00e9rer un prompt qui permetrra ensuite de g\u00e9nrer une image thumbnail pour article de blog du site internet Permifast. Il faudra utiliser la charte graphique, le titre et la description.\nChaque image que tu g\u00e9n\u00e8re doit respecter la charte graphique obligatoire:\n**Charte Graphique Obligatoire :**\n\n- **Type d'Illustration :** Illustration vectorielle en \"flat design\" (design plat).\n\n- **Contours :** Tous les \u00e9l\u00e9ments doivent imp\u00e9rativement avoir des contours noirs \u00e9pais, nets et audacieux.\n\n- **Palette de Couleurs :** Utiliser strictement et exclusivement les couleurs fournies ci-dessous, en respectant leurs pourcentages de pr\u00e9sence approximatifs. Le noir est r\u00e9serv\u00e9 uniquement aux contours. Le blanc pur (#FFFFFF) est utilis\u00e9 pour les rehauts, les reflets et les touches de contraste.\n  - Couleur Primaire (~60% de pr\u00e9sence) : #3B82F6\n  - Couleur Secondaire (~20% de pr\u00e9sence) : #EC4899\n  - (Optionnel) Couleur d'Accent 1 (~10% de pr\u00e9sence) : #F59E0B\n\n- **Arri\u00e8re-plan :** L'arri\u00e8re-plan doit \u00eatre un fond blanc uni, propre et enti\u00e8rement vide.\n\n- **Ombrage & Texture :** NE PAS utiliser de d\u00e9grad\u00e9s de couleurs ou d'ombres douces. C'est une r\u00e8gle absolue. TOUS les effets d'ombrage, de volume et de texture doivent \u00eatre cr\u00e9\u00e9s exclusivement \u00e0 l'aide de motifs de points de trame (halftone dots) noirs et stylis\u00e9s. C'est une exigence critique du style.\n\n- **Perspective :** Adopter une perspective simple, soit en vue de c\u00f4t\u00e9 2D, soit une perspective l\u00e9g\u00e8rement isom\u00e9trique. \u00c9viter toute complexit\u00e9.\n\n- **Composition :** La composition doit \u00eatre minimaliste, \u00e9pur\u00e9e et dynamique. Elle doit se concentrer sur un seul sujet principal, facilement reconnaissable et clairement d\u00e9fini.\n\n- **\u00c9l\u00e9ments Interdits :** Absolument AUCUNE photo r\u00e9aliste, AUCUNE texture complexe (autre que les points de trame), AUCUN d\u00e9grad\u00e9 de couleur, et AUCUNE ombre port\u00e9e douce. L'image finale doit \u00eatre une illustration graphique nette, professionnelle et percutante, parfaite pour un blog d'une startup technologique moderne comme \"PermiFast\".\n\nVoici le titre de l'article:{{ $json.fieldData.name }}\nVoici la description de l'article:\n{{ $json.fieldData.summary }}",
              "role": "user"
            }
          ]
        },
        "simplify": true,
        "jsonOutput": false,
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.8,
      "position": [
        -3376,
        368
      ],
      "id": "9e4c8564-234b-4432-86e1-d759badc9fba",
      "name": "OpenAI4",
      "credentials": {
        "openAiApi": {
          "id": "r6W68f8eF9fuaQbZ",
          "name": "OpenAi account"
        }
      }
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "return items.map(item => {\n  // On parse le JSON contenu dans message.content\n  const data2 = $input.first().json.message.content;\n  return { json: data2 };\n});",
        "notice": ""
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -3008,
        208
      ],
      "id": "7631f11a-3ed1-4275-b52c-613c3b27c1dc",
      "name": "alt_image"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.noOp",
      "typeVersion": 1,
      "position": [
        -3104,
        -144
      ],
      "id": "3bdddf3c-327c-49ab-8c5d-4af5edcea96b",
      "name": "No Operation, do nothing"
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "language": "javaScript",
        "jsCode": "const input = $input.all();\n\nlet qcm = input.find(item => item.json.question)?.json || {};\nlet image = input.find(item => item.json.url)?.json || null;\n//let details = input.find(item => item.json.niveau)?.json || {};\nconst data = [{\n  json: {\n    question: qcm.question || \"\",\n    options: qcm.options || [],\n    correctAnswer: qcm.correctAnswer ?? null,\n    explanation: qcm.explanation || \"\",\n    niveau: qcm.niveau || \"\",\n    theme: qcm.theme || \"\",\n    image: image.url || null,\n    alt_image: image.alt_image || null,\n  }\n}]\n\nreturn data\n/* const merged = $input.item.json;\n\n// Pour debug, tu peux d\u00e9commenter la ligne suivante pour voir la structure exacte :\n// console.log(JSON.stringify(merged, null, 2));\n\n// On r\u00e9cup\u00e8re les champs de la question\nlet question = merged.question || (merged.Code && merged.Code.question);\nlet options = merged.options || (merged.Code && merged.Code.options);\nlet correctAnswer = merged.correctAnswer || (merged.Code && merged.Code.correctAnswer);\nlet explanation = merged.explanation || (merged.Code && merged.Code.explanation);\nlet imagePrompt = merged.imagePrompt || (merged.Code && merged.Code.imagePrompt);\n\n// On r\u00e9cup\u00e8re l'URL de l'image\nlet image = merged.url\n  || (merged.OpenAI1 && merged.OpenAI1.url)\n  || merged.image\n  || (merged.OpenAI1 && merged.OpenAI1.image);\n\n// Si jamais l'image est dans un tableau (rare, mais possible avec certains mod\u00e8les)\nif (!image && merged.OpenAI1 && Array.isArray(merged.OpenAI1.data) && merged.OpenAI1.data[0]?.url) {\n  image = merged.OpenAI1.data[0].url;\n}\n\nreturn [\n  {\n    json: {\n      question,\n      options,\n      correctAnswer,\n      explanation,\n      image,\n      imagePrompt\n    }\n  }\n]; */",
        "notice": ""
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        -96,
        -176
      ],
      "id": "1844ce01-a446-4511-9757-536bf5bb4ac2",
      "name": "Code2"
    },
    {
      "parameters": {
        "preBuiltAgentsCalloutHttpRequest": "",
        "curlImport": "",
        "method": "GET",
        "url": "={{ $json.images[0].url }}",
        "authentication": "none",
        "provideSslCertificates": false,
        "sendQuery": false,
        "sendHeaders": false,
        "sendBody": false,
        "options": {},
        "infoMessage": ""
      },
      "id": "181a70b9-03fd-4af7-a8b8-384cae0809fa",
      "name": "Download Image",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        -1008,
        0
      ]
    },
    {
      "parameters": {
        "preBuiltAgentsCalloutHttpRequest": "",
        "curlImport": "",
        "method": "GET",
        "url": "={{ $json.images[0].url }}",
        "authentication": "none",
        "provideSslCertificates": false,
        "sendQuery": false,
        "sendHeaders": false,
        "sendBody": false,
        "options": {},
        "infoMessage": ""
      },
      "id": "ed126930-35dc-402a-b4fe-ac9af4e77e9a",
      "name": "Download Image1",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4,
      "position": [
        -1056,
        240
      ]
    },
    {
      "parameters": {
        "notice": ""
      },
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        -4384,
        -64
      ],
      "id": "21515e4c-eed1-469b-8aa3-c2f139d8f7a8",
      "name": "When clicking \u2018Execute workflow\u2019"
    },
    {
      "parameters": {
        "resource": "item",
        "operation": "getAll",
        "siteId": "679c8c5391580cab87a5e771",
        "collectionId": "67b47664f9d9d772437be20c",
        "returnAll": true
      },
      "type": "n8n-nodes-base.webflow",
      "typeVersion": 2,
      "position": [
        -4064,
        -64
      ],
      "id": "51869bae-d144-41bc-aa2a-da115f605459",
      "name": "Webflow",
      "credentials": {
        "webflowOAuth2Api": {
          "id": "Mqp11wBXUiLzx3mA",
          "name": "Webflow account"
        }
      }
    },
    {
      "parameters": {
        "resource": "item",
        "operation": "update",
        "siteId": "679c8c5391580cab87a5e771",
        "collectionId": "67b47664f9d9d772437be20c",
        "itemId": "={{ $('Webflow').item.json.id }}",
        "live": false,
        "fieldsUi": {
          "fieldValues": [
            {
              "fieldId": "image-principale",
              "fieldValue": "={{ {url: $json.url} }}"
            }
          ]
        }
      },
      "type": "n8n-nodes-base.webflow",
      "typeVersion": 2,
      "position": [
        -400,
        400
      ],
      "id": "64b4116a-e012-4844-a238-1df6b88780cf",
      "name": "Webflow1",
      "credentials": {
        "webflowOAuth2Api": {
          "id": "Mqp11wBXUiLzx3mA",
          "name": "Webflow account"
        }
      }
    }
  ],
  "connections": {
    "Loop Over Items": {
      "main": [
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "OpenAI4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Cloud Firestore1": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Subscribe to FLUX Stream1": {
      "main": [
        [
          {
            "node": "Extract IDs1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Final Result": {
      "main": [
        [
          {
            "node": "Download Image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract IDs1": {
      "main": [
        [
          {
            "node": "Check Status3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Status3": {
      "main": [
        [
          {
            "node": "Is Completed?1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Is Completed?1": {
      "main": [
        [
          {
            "node": "Fetch Final Result",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "Check Status3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Signed URL2": {
      "main": [
        [
          {
            "node": "Webflow1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields1": {
      "main": [
        []
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Code2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI4": {
      "main": [
        [
          {
            "node": "Subscribe to FLUX Stream1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "alt_image": {
      "main": [
        []
      ]
    },
    "Code2": {
      "main": [
        []
      ]
    },
    "Download Image": {
      "main": [
        [
          {
            "node": "Get Signed URL2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Webflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webflow": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webflow1": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "tags": [],
  "versionId": "2c09ba5d-47e8-4735-b81e-7a61282b4909"
}