WorkflowX Kullanım Kılavuzu

WorkflowXKullanım Kılavuzu

WorkflowX ile iş akışlarını otomatikleştirin. Gerçek kod örnekleri ve kullanım senaryoları ile sistemi hızla öğrenin.

Kurulum

1. NPM ile Kurulum

# WorkflowX SDK'sını yükleyin
npm install @workflowx/sdk

2. Başlangıç Konfigürasyonu

import WorkflowX from '@workflowx/sdk';

const workflowx = new WorkflowX({
  apiKey: 'your-api-key',
  baseUrl: 'https://api.workflowx.com',
  organization: 'your-org-id'
});

// Bağlantıyı test et
await workflowx.auth.verify();
console.log('WorkflowX bağlantısı başarılı!');

3. Ortam Değişkenleri

# .env dosyası
WORKFLOWX_API_KEY=your-api-key
WORKFLOWX_ORG_ID=your-org-id
WORKFLOWX_WEBHOOK_SECRET=your-webhook-secret

4. TypeScript Desteği

// TypeScript ile
import WorkflowX, { 
  Workflow, 
  Form, 
  User 
} from '@workflowx/sdk';

const workflowx = new WorkflowX({
  apiKey: process.env.WORKFLOWX_API_KEY!
});

Kullanım Örnekleri

Gerçek senaryolarla WorkflowX'i nasıl kullanacağınızı öğrenin

1

İş Akışı Oluşturma

Yeni bir iş akışı oluşturun ve adımları tanımlayın

// Yeni iş akışı oluştur
const workflow = await workflowx.workflows.create({
  name: "Belge Onay Süreci",
  description: "Belgelerin onaylanması için gerekli adımlar",
  steps: [
    {
      name: "Başvuru Kontrolü",
      assignee: "kontrol@firma.com",
      type: "review",
      deadline: 2 // 2 gün
    },
    {
      name: "Müdür Onayı", 
      assignee: "mudur@firma.com",
      type: "approval",
      deadline: 1
    },
    {
      name: "Arşivleme",
      assignee: "arsiv@firma.com", 
      type: "archive",
      deadline: 1
    }
  ]
});

console.log("İş akışı oluşturuldu:", workflow.id);
2

Form Oluşturma ve Bağlama

Dinamik form oluşturun ve iş akışına bağlayın

// Form oluştur
const form = await workflowx.forms.create({
  title: "Belge Onay Formu",
  fields: [
    {
      name: "belge_tipi",
      type: "select",
      label: "Belge Tipi",
      required: true,
      options: ["Fatura", "Sözleşme", "Rapor"]
    },
    {
      name: "aciklama",
      type: "textarea", 
      label: "Açıklama",
      required: true
    },
    {
      name: "dosya",
      type: "file",
      label: "Belge Dosyası",
      required: true,
      accept: ".pdf,.doc,.docx"
    }
  ],
  workflow_id: workflow.id
});

// Form gönderimi dinle
form.onSubmit(async (submission) => {
  console.log("Yeni form gönderimi:", submission);
  
  // İş akışını başlat
  await workflowx.workflows.start(workflow.id, {
    form_data: submission.data,
    initiator: submission.user
  });
});
3

Kullanıcı Yönetimi

Takım üyelerini ekleyin ve roller atayın

// Toplu kullanıcı ekleme
const users = await workflowx.users.bulkCreate([
  {
    email: "ahmet@firma.com",
    name: "Ahmet Yılmaz",
    role: "manager",
    department: "İnsan Kaynakları"
  },
  {
    email: "fatma@firma.com", 
    name: "Fatma Demir",
    role: "employee",
    department: "Muhasebe"
  }
]);

// Kullanıcıya rol atama
await workflowx.users.assignRole("ahmet@firma.com", {
  role: "workflow_admin",
  permissions: ["create_workflow", "approve_all", "view_analytics"]
});

// Departman bazlı kullanıcıları listeleme
const hrTeam = await workflowx.users.list({
  department: "İnsan Kaynakları",
  status: "active"
});
4

Gerçek Zamanlı Bildirimler

Webhook'lar ile sistem entegrasyonu sağlayın

// Webhook dinleyicisi oluştur
workflowx.webhooks.create({
  url: "https://yourapp.com/workflowx-webhook",
  events: [
    "workflow.started",
    "workflow.completed", 
    "workflow.failed",
    "task.assigned",
    "task.completed"
  ]
});

// Express.js webhook handler
app.post('/workflowx-webhook', (req, res) => {
  const { event, data } = req.body;
  
  switch(event) {
    case 'workflow.completed':
      // E-posta gönder
      sendEmail(data.initiator.email, {
        subject: "İş Akışı Tamamlandı",
        body: `${data.workflow.name} başarıyla tamamlandı.`
      });
      break;
      
    case 'task.assigned':
      // Slack bildirimi
      slackNotify(data.assignee.slack_id, {
        message: `Yeni görev: ${data.task.name}`,
        deadline: data.task.deadline
      });
      break;
  }
  
  res.status(200).send('OK');
});
5

Performans Analizi

Detaylı raporlar ve metrikler alın

// Dashboard verileri
const dashboard = await workflowx.analytics.getDashboard({
  date_range: "last_30_days",
  department: "all"
});

console.log("Aktif iş akışları:", dashboard.active_workflows);
console.log("Tamamlanan görevler:", dashboard.completed_tasks);
console.log("Ortalama tamamlanma süresi:", dashboard.avg_completion_time);

// Departman performansı
const departmentStats = await workflowx.analytics.getDepartmentPerformance({
  departments: ["İK", "Muhasebe", "Satış"],
  metrics: ["completion_rate", "avg_time", "task_count"]
});

// Özel rapor oluştur
const customReport = await workflowx.reports.generate({
  type: "workflow_efficiency",
  filters: {
    date_from: "2024-01-01",
    date_to: "2024-01-31",
    workflow_ids: [workflow.id]
  },
  format: "pdf",
  email_to: ["mudur@firma.com"]
});
6

Web Scraping ve Veri Çekme

Siteleri analiz edin ve veri çekin, CSS selector sorunlarını çözün

// 1. Site analizi yap
const siteAnalysis = await workflowx.scraper.analyzePage({
  url: "https://kasarcim.com/urunler",
  debug: true
});

console.log("Sayfa yapısı:", siteAnalysis.structure);
console.log("Link'ler:", siteAnalysis.links);

// 2. Alternatif selector'ları test et
const testSelectors = [
  "a[href*='urun']",
  "a[href*='product']", 
  ".product-link",
  "[data-product]",
  "a.item-link"
];

for (const selector of testSelectors) {
  const test = await workflowx.scraper.testSelector({
    url: "https://kasarcim.com/urunler",
    selector: selector
  });
  console.log(`${selector}: ${test.count} element bulundu`);
}

// 3. Dinamik yükleme ile scrape
const scrapeResult = await workflowx.scraper.create({
  url: "https://kasarcim.com/urunler",
  wait_strategy: "dynamic", // Sayfa tamamen yüklenene kadar bekle
  scroll_to_bottom: true,   // Lazy loading için scroll
  wait_time: 5000,         // 5 saniye bekle
  selectors: {
    product_links: {
      selector: "a", // Önce tüm link'leri al
      multiple: true,
      filter: link => link.href && link.href.includes('urun'), // Filtrele
      extract: {
        text: "textContent",
        url: "@href"
      }
    }
  },
  fallback_selectors: {
    // Birincil selector çalışmazsa alternatifleri dene
    product_names: [
      ".product-title",
      ".item-name", 
      "h3 a",
      "[data-product-name]"
    ]
  }
});

console.log("Başarılı scraping:", scrapeResult.extracted_data);
7

Koşullu İş Akışları

Akıllı dallanma ve koşullu adımlar oluşturun

// Koşullu iş akışı
const conditionalWorkflow = await workflowx.workflows.create({
  name: "Harcama Onay Süreci",
  steps: [
    {
      name: "Harcama Kontrolü",
      type: "condition",
      condition: {
        field: "amount",
        operator: "greater_than",
        value: 1000
      },
      true_path: [
        {
          name: "Müdür Onayı",
          assignee: "mudur@firma.com",
          type: "approval"
        },
        {
          name: "Genel Müdür Onayı", 
          assignee: "gm@firma.com",
          type: "approval",
          condition: {
            field: "amount",
            operator: "greater_than", 
            value: 5000
          }
        }
      ],
      false_path: [
        {
          name: "Otomatik Onay",
          type: "auto_approve"
        }
      ]
    }
  ]
});

// İş akışını başlat
await workflowx.workflows.start(conditionalWorkflow.id, {
  data: {
    amount: 2500,
    description: "Bilgisayar satın alma",
    requestor: "ahmet@firma.com"
  }
});

SDK Referansı

Tüm SDK methodları ve parametreleri

Workflows

workflowx.workflows.create(config)

Yeni iş akışı oluşturur

config: {name, description, steps[], assignees[]}
workflowx.workflows.start(id, data)

İş akışını başlatır

id: string, data: object
workflowx.workflows.list(filters)

İş akışlarını listeler

filters: {status, department, date_range}
workflowx.workflows.get(id)

İş akışı detaylarını getirir

id: string

Forms

workflowx.forms.create(config)

Yeni form oluşturur

config: {title, fields[], workflow_id}
workflowx.forms.submit(id, data)

Form gönderir

id: string, data: object
workflowx.forms.getSubmissions(id)

Form yanıtlarını getirir

id: string

Users

workflowx.users.create(userData)

Yeni kullanıcı oluşturur

userData: {email, name, role, department}
workflowx.users.assignRole(email, roleData)

Kullanıcıya rol atar

email: string, roleData: {role, permissions[]}
workflowx.users.list(filters)

Kullanıcıları listeler

filters: {department, role, status}

Analytics

workflowx.analytics.getDashboard(filters)

Dashboard verilerini getirir

filters: {date_range, department}
workflowx.analytics.getWorkflowStats(id)

İş akışı istatistiklerini getirir

id: string
workflowx.reports.generate(config)

Özel rapor oluşturur

config: {type, filters, format, email_to[]}

Web Scraping Troubleshooting

CSS Selector Debug

// Sayfa yapısını analiz et
const pageAnalysis = await workflowx.scraper.analyzePage({
  url: "https://example.com",
  debug: true
});

console.log("Element sayıları:", pageAnalysis.elements);
console.log("Önerilen selector'lar:", pageAnalysis.suggestions);

// Manuel selector test
const testResult = await workflowx.scraper.testSelector({
  url: "https://example.com", 
  selector: "a[href*='/product/']",
  type: "css"
});

console.log("Bulunan elementler:", testResult.count);
console.log("İlk 3 element:", testResult.preview);
⚠️ Sık Karşılaşılan Sorunlar
  • • JavaScript ile yüklenen içerik - wait süresi artırın
  • • Yanlış CSS selector - inspect element ile kontrol edin
  • • Dinamik class isimleri - daha spesifik selector kullanın
  • • AJAX sonrası yüklenen içerik - explicit wait ekleyin

Gelişmiş Scraping Teknikleri

// Dinamik içerik bekle
const scrapeResult = await workflowx.scraper.create({
  url: "https://example.com",
  wait_for: {
    type: "element",
    selector: ".product-list",
    timeout: 10000
  },
  selectors: {
    products: {
      selector: ".product-item",
      type: "css",
      multiple: true,
      extract: {
        name: ".product-name",
        price: ".product-price", 
        link: "a@href"
      }
    }
  },
  javascript: `
    // Scroll to bottom to trigger lazy loading
    window.scrollTo(0, document.body.scrollHeight);
    
    // Click load more button if exists
    const loadMore = document.querySelector('.load-more');
    if (loadMore) loadMore.click();
    
    // Wait for content to load
    await new Promise(resolve => setTimeout(resolve, 2000));
  `
});

Selector Alternatifleri

CSS Selectors
a[href*="product"] // href içinde "product" geçen
a[href^="/products/"] // "/products/" ile başlayan
a[href$=".html"] // ".html" ile biten
.product:nth-child(2n+1) // tek sıradakiler
*[data-product-id] // data attribute olan
XPath Selectors
//a[contains(@href, 'product')] // href içinde
//div[@class='product']/h2 // class ile
//span[text()='Price:']/../span[2] // text ile
//a[position()>1] // pozisyon ile
//*[@data-id] // data attribute

En İyi Uygulamalar

✅ Yapın

  • • Hata yönetimi için try-catch kullanın
  • • API rate limitlerini göz önünde bulundurun
  • • Webhook'ları güvenli endpoint'lerde dinleyin
  • • Kullanıcı girdilerini validate edin
  • • Asenkron işlemler için Promise/async-await kullanın
// Hata yönetimi örneği
try {
  const workflow = await workflowx.workflows.create(config);
  console.log('Başarılı:', workflow.id);
} catch (error) {
  if (error.code === 'RATE_LIMIT_EXCEEDED') {
    // Rate limit aşıldı, bekle
    await new Promise(r => setTimeout(r, 1000));
    // Tekrar dene
  }
  console.error('Hata:', error.message);
}

❌ Yapmayın

  • • API anahtarlarını client-side code'da saklamayın
  • • Büyük dosyaları senkron olarak yüklemeyin
  • • Webhook'ları doğrulamadan işleme almayın
  • • Kullanıcı girdilerini sanitize etmeden kullanmayın
  • • Çok fazla paralel istek göndermeyin
// Yanlış kullanım
const apiKey = "sk-123..."; // ❌ Client'da saklamayın

// Doğru kullanım - server'da
const apiKey = process.env.WORKFLOWX_API_KEY; // ✅

// Webhook doğrulama
const signature = req.headers['x-workflowx-signature'];
const isValid = workflowx.webhooks.verify(
  req.body, signature
);
if (!isValid) throw new Error('Invalid webhook');

Yardıma mı İhtiyacınız Var?

Uzman geliştirici ekibimiz size yardımcı olmaya hazır