{
  "name": "Piinti Otomatik Blog \u00dcretimi",
  "nodes": [
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 2 * * *"
            }
          ]
        }
      },
      "name": "Herg\u00fcn 02:00",
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1,
      "position": [
        250,
        300
      ]
    },
    {
      "parameters": {
        "operation": "executeQuery",
        "query": "SELECT \n    p.title, \n    c.name as category,\n    p.image_url,\n    pp.price as current_price, \n    pp.original_price as previous_price,\n    ROUND(((pp.original_price - pp.price) / pp.original_price * 100), 1) as discount_pct\nFROM products p\nJOIN product_prices pp ON p.id = pp.product_id\nLEFT JOIN categories c ON p.category_id = c.id\nWHERE pp.original_price > pp.price \n  AND pp.updated_at > NOW() - INTERVAL '48 hours'\nORDER BY discount_pct DESC\nLIMIT 1;"
      },
      "name": "Supabase - Fiyat\u0131 D\u00fc\u015fenleri \u00c7ek",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.1,
      "position": [
        450,
        300
      ]
    },
    {
      "parameters": {
        "model": "claude-3-5-sonnet-20240620",
        "messages": {
          "messageValues": [
            {
              "content": "A\u015fa\u011f\u0131daki \u00fcr\u00fcn verilerini kullanarak Piinti.com i\u00e7in SEO optimizeli T\u00fcrk\u00e7e blog yaz\u0131s\u0131 yaz.\n\n\u00dcr\u00fcn: {{$json.title}}\nKategori: {{$json.category}}  \nEski fiyat: {{$json.previous_price}} TL\nYeni fiyat: {{$json.current_price}} TL\n\u0130ndirim: %{{Math.round($json.discount_pct)}}\n\nFormat:\n- Ba\u015fl\u0131k (H1): \u00c7OK \u00d6NEML\u0130! Asla \"En \u0130yi \u00dcr\u00fcnler\", \"\u0130ndirimli \u00dcr\u00fcn F\u0131rsat\u0131\" gibi genel ge\u00e7er, s\u0131k\u0131c\u0131 ve \u015fablon ba\u015fl\u0131klar KULLANMA. \u00dcr\u00fcn\u00fcn ad\u0131n\u0131, kategorisini veya \"2026 Y\u0131l\u0131\", \"Son d\u00f6nemin en iyisi\" gibi merak uyand\u0131r\u0131c\u0131, spesifik ve clickbait'e yak\u0131n ama do\u011fru ba\u015fl\u0131klar \u00fcret (\u00d6rnek: \"2026'n\u0131n Fiyat Performans Canavar\u0131: [\u00dcr\u00fcn Ad\u0131] B\u00fcy\u00fck \u0130ndirimde!\" veya \"Neden [\u00dcr\u00fcn Ad\u0131] Almal\u0131s\u0131n\u0131z? \u015eok Fiyat D\u00fc\u015f\u00fc\u015f\u00fc\").\n- \u00d6zet/Excerpt: 155 karakterlik SEO a\u00e7\u0131klamas\u0131 (\u00dcr\u00fcn ad\u0131n\u0131 mutlaka ge\u00e7ir)\n- Giri\u015f paragraf\u0131 (Okuyucuyu hemen yakalayacak bir giri\u015f)\n- Fiyat analizi b\u00f6l\u00fcm\u00fc (\u0130ndirim oran\u0131n\u0131 vurgula)\n- Sat\u0131n alma tavsiyesi (Neden bu fiyata ka\u00e7maz?)\n- SSS b\u00f6l\u00fcm\u00fc (\u00dcr\u00fcnle veya kategoriyle ilgili 3 soru)\n- Slug: t\u00fcrk\u00e7e karaktersiz, bo\u015fluklar yerine tire olan k\u00fc\u00e7\u00fck harfli SEO url (\u00f6rnek: urun-adi-fiyat-dususu)\n\nTon: samimi, yard\u0131mc\u0131, g\u00fcven verici, ticari a\u011f\u0131zdan uzak\nKelime say\u0131s\u0131: 600-800\n\nL\u00dcTFEN \u00c7IKTIYI SADECE A\u015eA\u011eIDAK\u0130 G\u0130B\u0130 GE\u00c7ERL\u0130 B\u0130R JSON FORMATINDA VER. Ba\u015f\u0131nda, sonunda veya i\u00e7inde ekstra a\u00e7\u0131klama veya markdown kodu (```json vb.) kullanma. Sadece saf JSON dizisi olsun.\n\n\u00c7OK \u00d6NEML\u0130: JSON i\u00e7indeki metinlerde (\u00f6zellikle 'content' alan\u0131nda) sat\u0131r sonu, yeni sat\u0131r veya paragraf ba\u015f\u0131 yapmak i\u00e7in kesinlikle GER\u00c7EK SATIR SONU (ENTER) KULLANMA. Bunun yerine mutlaka `\\n` (ters b\u00f6l\u00fc ve n) karakterlerini yazarak escape et. JSON i\u00e7inde kontrol karakterleri (\n, \r, \t) bulunmamal\u0131d\u0131r!\n\n{\n  \"title\": \"Harika ve Spesifik Ba\u015fl\u0131k Buraya\",\n  \"slug\": \"harika-ve-spesifik-baslik\",\n  \"content\": \"Buraya Markdown format\u0131nda i\u00e7eri\u011fin tamam\u0131 (## ba\u015fl\u0131klar gibi)\",\n  \"excerpt\": \"Buraya meta a\u00e7\u0131klamas\u0131/\u00f6zeti\"\n}"
            }
          ]
        }
      },
      "name": "Groq - Blog Yaz\u0131s\u0131 \u00dcret",
      "type": "n8n-nodes-base.anthropic",
      "typeVersion": 1,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "jsCode": "for (let item of $input.all()) {\n  let text = item.json.message?.content || item.json.content || item.json.text || \"\";\n  if (typeof text !== 'string') text = JSON.stringify(text);\n  text = text.replace(/```json/gi, '').replace(/```/g, '').trim();\n  \n  let inString = false;\n  let escaped = false;\n  let result = '';\n  for (let i = 0; i < text.length; i++) {\n    const char = text[i];\n    if (char === '\"' && !escaped) {\n      inString = !inString;\n      result += char;\n    } else if (char === '\\\\' && !escaped) {\n      escaped = true;\n      result += char;\n    } else {\n      escaped = false;\n      if (inString) {\n        if (char === '\\n') result += '\\\\n';\n        else if (char === '\\r') result += '\\\\r';\n        else if (char === '\\t') result += '\\\\t';\n        else result += char;\n      } else {\n        result += char;\n      }\n    }\n  }\n  item.json.sanitized = result;\n}\nreturn $input.all();"
      },
      "name": "Sanitize JSON",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        800,
        300
      ]
    },
    {
      "parameters": {
        "operation": "fromJson",
        "jsonString": "={{$json.sanitized}}"
      },
      "name": "Parse JSON",
      "type": "n8n-nodes-base.jsonParse",
      "typeVersion": 1,
      "position": [
        950,
        300
      ]
    },
    {
      "parameters": {
        "operation": "insert",
        "schema": "public",
        "table": "blogs",
        "columns": "title,slug,content,excerpt,published_at,image_url",
        "values": "={\n  \"title\": \"{{$json.title}}\",\n  \"slug\": \"{{$json.slug}}\",\n  \"content\": \"{{$json.content}}\",\n  \"excerpt\": \"{{$json.excerpt}}\",\n  \"published_at\": \"{{$now}}\",\n  \"image_url\": \"{{ $('Supabase - Fiyat\u0131 D\u00fc\u015fenleri \u00c7ek').first().json.image_url || 'https://images.unsplash.com/photo-1598327105666-5b89351cb315?ixlib=rb-4.0.3&auto=format&fit=crop&w=1000&q=80' }}\"\n}"
      },
      "name": "Supabase - Blogu Kaydet",
      "type": "n8n-nodes-base.postgres",
      "typeVersion": 2.1,
      "position": [
        1150,
        300
      ]
    }
  ],
  "connections": {
    "Herg\u00fcn 02:00": {
      "main": [
        [
          {
            "node": "Supabase - Fiyat\u0131 D\u00fc\u015fenleri \u00c7ek",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Supabase - Fiyat\u0131 D\u00fc\u015fenleri \u00c7ek": {
      "main": [
        [
          {
            "node": "Groq - Blog Yaz\u0131s\u0131 \u00dcret",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq - Blog Yaz\u0131s\u0131 \u00dcret": {
      "main": [
        [
          {
            "node": "Sanitize JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sanitize JSON": {
      "main": [
        [
          {
            "node": "Parse JSON",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse JSON": {
      "main": [
        [
          {
            "node": "Supabase - Blogu Kaydet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {}
}