{
  "name": "Google Drive \u2192 Produkt-Bilder Upload",
  "nodes": [
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "triggerOn": "specificFolder",
        "folderToWatch": "={{ $env.GDRIVE_PRODUCTS_FOLDER_ID }}",
        "event": "fileCreated",
        "options": {}
      },
      "id": "trigger-gdrive",
      "name": "Google Drive Trigger",
      "type": "n8n-nodes-base.googleDriveTrigger",
      "typeVersion": 1,
      "position": [
        180,
        300
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "file",
        "fileId": "={{ $json.id }}",
        "options": {
          "fields": [
            "id",
            "name",
            "mimeType",
            "parents",
            "size"
          ]
        }
      },
      "id": "get-file-info",
      "name": "Datei-Info holen",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        400,
        300
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "file",
        "fileId": "={{ $json.parents[0] }}",
        "options": {
          "fields": [
            "id",
            "name"
          ]
        }
      },
      "id": "get-folder-name",
      "name": "Ordnername holen",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        620,
        300
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// Ordnername-Format: \"<Produkt-ID>\" oder \"<Produkt-ID> - Produktname\"\n// Beispiele: \"42\", \"42 - Flaschen\u00f6ffner\", \"product_42\"\n\nconst folderName = $input.first().json.name;\nconst fileName = $('Datei-Info holen').first().json.name;\nconst mimeType = $('Datei-Info holen').first().json.mimeType;\nconst fileId = $('Datei-Info holen').first().json.id;\n\n// Nur Bilder verarbeiten\nconst allowedMimes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];\nif (!allowedMimes.includes(mimeType)) {\n  return []; // Keine Bilder - ueberspringen\n}\n\n// Produkt-ID aus Ordnername extrahieren\n// Unterstuetzt: \"42\", \"42 - Name\", \"product_42\", \"P42\"\nlet productId = null;\n\n// Versuch 1: Ordnername ist nur eine Zahl\nif (/^\\d+$/.test(folderName.trim())) {\n  productId = parseInt(folderName.trim());\n}\n// Versuch 2: Zahl am Anfang gefolgt von Trennzeichen\nelse {\n  const match = folderName.match(/^(\\d+)\\s*[-_]/);\n  if (match) {\n    productId = parseInt(match[1]);\n  }\n}\n// Versuch 3: \"product_\" oder \"P\" Prefix\nif (!productId) {\n  const match = folderName.match(/(?:product[_-]?|P)(\\d+)/i);\n  if (match) {\n    productId = parseInt(match[1]);\n  }\n}\n\nif (!productId) {\n  console.log('Keine Produkt-ID erkannt im Ordner: ' + folderName);\n  return [];\n}\n\n// Typ bestimmen: Dateiname oder Ordner enthaelt 'raw' -> raw, sonst product\nlet imageType = 'product';\nif (folderName.toLowerCase().includes('raw') || fileName.toLowerCase().includes('raw')) {\n  imageType = 'raw';\n}\n\nreturn [{\n  json: {\n    productId,\n    fileId,\n    fileName,\n    mimeType,\n    imageType,\n    folderName\n  }\n}];"
      },
      "id": "extract-product-id",
      "name": "Produkt-ID extrahieren",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        840,
        300
      ]
    },
    {
      "parameters": {
        "resource": "file",
        "operation": "download",
        "fileId": "={{ $json.fileId }}",
        "options": {}
      },
      "id": "download-image",
      "name": "Bild herunterladen",
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1060,
        300
      ],
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $env.LARAVEL_APP_URL || 'http://host.docker.internal:8000' }}/api/products/{{ $('Produkt-ID extrahieren').first().json.productId }}/images/upload",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer {{ $env.LARAVEL_API_TOKEN }}"
            },
            {
              "name": "Accept",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "parameterType": "formBinaryData",
              "name": "image",
              "inputDataFieldName": "data"
            },
            {
              "parameterType": "formData",
              "name": "type",
              "value": "={{ $('Produkt-ID extrahieren').first().json.imageType }}"
            }
          ]
        },
        "options": {
          "timeout": 30000
        }
      },
      "id": "upload-to-laravel",
      "name": "Upload zu Laravel",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1280,
        300
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "log-success",
              "name": "status",
              "value": "={{ 'Bild ' + $('Produkt-ID extrahieren').first().json.fileName + ' erfolgreich zu Produkt ' + $('Produkt-ID extrahieren').first().json.productId + ' hochgeladen' }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "success-log",
      "name": "Erfolg",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1500,
        300
      ]
    }
  ],
  "connections": {
    "Google Drive Trigger": {
      "main": [
        [
          {
            "node": "Datei-Info holen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Datei-Info holen": {
      "main": [
        [
          {
            "node": "Ordnername holen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Ordnername holen": {
      "main": [
        [
          {
            "node": "Produkt-ID extrahieren",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Produkt-ID extrahieren": {
      "main": [
        [
          {
            "node": "Bild herunterladen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Bild herunterladen": {
      "main": [
        [
          {
            "node": "Upload zu Laravel",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload zu Laravel": {
      "main": [
        [
          {
            "node": "Erfolg",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "staticData": null,
  "tags": [
    {
      "name": "Google Drive",
      "createdAt": "2026-04-19T00:00:00.000Z",
      "updatedAt": "2026-04-19T00:00:00.000Z"
    },
    {
      "name": "Bilder",
      "createdAt": "2026-04-19T00:00:00.000Z",
      "updatedAt": "2026-04-19T00:00:00.000Z"
    }
  ]
}