
# İş Akışını Dışa Aktarma ve Yeniden Oynatma

Queuety, bir iş akışının eksiksiz yürütme geçmişini taşınabilir bir JSON biçiminde dışa aktarabilir ve bunu farklı bir ortamda yeniden oynatabilir. Bu özellik, üretimdeki hataları yerel olarak yeniden oluşturmak, iş akışlarını ortamlar arasında taşımak ve denetim yapmak için kullanışlıdır.

## İş akışını dışa aktarma

### PHP API

İş akışı kimliğiyle `Queuety::export_workflow()` çağrısı yapın. JSON ile serileştirilebilen bir dizi döndürür:

```php
use Queuety\Queuety;

$data = Queuety::export_workflow( $workflow_id );
```

Doğrudan bir JSON dizgesi almak için:

```php
$json = json_encode( $data, JSON_PRETTY_PRINT );
file_put_contents( '/tmp/workflow-42.json', $json );
```

### CLI

```bash
wp queuety workflow export <id> [--output=<file>]
```

| Seçenek | Açıklama |
|---|---|
| `<id>` | İş akışı kimliği (gerekli) |
| `--output=<file>` | JSON yazılacak dosya yolu. Varsayılan olarak stdout kullanılır. |

```bash
# Print to stdout
wp queuety workflow export 42

# Write to a file
wp queuety workflow export 42 --output=/tmp/workflow-42.json
```

## İş akışını yeniden oynatma

### PHP API

Dışa aktarılan verilerle `Queuety::replay_workflow()` çağrısı yapın. Yeni iş akışı kimliğini döndürür:

```php
use Queuety\Queuety;

$json = file_get_contents( '/tmp/workflow-42.json' );
$data = json_decode( $json, true );

$new_id = Queuety::replay_workflow( $data );
```

### CLI

```bash
wp queuety workflow replay <file>
```

| Seçenek | Açıklama |
|---|---|
| `<file>` | Dışa aktarılmış JSON dosyasının yolu (gerekli) |

```bash
wp queuety workflow replay /tmp/workflow-42.json
# Success: Workflow replayed. New workflow ID: 85.
```

## JSON yapısı

Dışa aktarım; tüm iş akışı durumunu, ilişkili işleri, iz olaylarını, günlük girdilerini, saklanan sinyalleri, yapıtları, parçaları ve tüm iş akışı bağımlılığı bekleme satırlarını içerir:

```json
{
    "workflow": {
        "id": 42,
        "name": "generate_report",
        "status": "failed",
        "state": { "user_id": 1, "_steps": [...], "_queue": "default" },
        "current_step": 2,
        "total_steps": 4,
        "parent_workflow_id": null,
        "parent_step_index": null,
        "started_at": "2026-03-28 10:00:00",
        "completed_at": null,
        "failed_at": "2026-03-28 10:05:00",
        "error_message": "API timeout",
        "deadline_at": null
    },
    "jobs": [
        {
            "id": 100,
            "queue": "default",
            "handler": "App\\Handlers\\FetchDataHandler",
            "payload": {},
            "status": "completed",
            "attempts": 1,
            "max_attempts": 3,
            "step_index": 0
        }
    ],
    "events": [
        {
            "id": 1,
            "job_id": 100,
            "step_index": 0,
            "step_name": "fetchData",
            "step_type": "single",
            "handler": "App\\Handlers\\FetchDataHandler",
            "event": "step_completed",
            "input": { "user_id": 1 },
            "output": { "records": 150 },
            "state_before": { "user_id": 1 },
            "state_after": { "user_id": 1, "records": 150 },
            "context": { "source": "api" },
            "error": null,
            "duration_ms": 230,
            "created_at": "2026-03-28 10:00:01"
        }
    ],
    "logs": [
        {
            "id": 1,
            "event": "workflow_started",
            "handler": "generate_report",
            "created_at": "2026-03-28 10:00:00"
        }
    ],
    "signals": [],
    "artifacts": [],
    "chunks": [],
    "wait_dependencies": [],
    "exported_at": "2026-03-28T12:00:00+00:00",
    "queuety_version": "0.22.0"
}
```

Yukarıdaki örnekte bazı alanlar kısaltılmıştır. Gerçek dışa aktarım, her olay satırındaki tüm iz sütunlarını içerir.

İş akışı dışa aktarımları, özgün çalıştırmada ayarlanmışlarsa `definition_version`, `definition_hash` ve `idempotency_key` gibi iş akışı meta verilerini de korur.

## Yeniden oynatma nasıl çalışır

Dışa aktarılmış bir iş akışını yeniden oynattığınızda:

1. Dışa aktarılan durum ve adım tanımlarıyla yeni bir iş akışı satırı oluşturulur.
2. Yeni iş akışının adı `{original_name}_replay_{timestamp}` olur.
3. Geçmiş iş akışı olayları ve günlükleri yeni ortama yeniden eklenir.
4. Saklanan sinyaller ve iş akışı bekleme bağımlılığı satırları geçmiş durum olarak yeniden oynatılır.
5. Özgün iş akışı hâlâ `running` durumundaysa geçerli adım işlenmek üzere kuyruğa alınır. Repeat ve `start_workflows()` adımları yeniden kuyruğa alınmaz; bu nedenle bunlardan birinde duran yeniden oynatma, iş olmadan `running` durumunda kalır ([#17](https://github.com/inline0/queuety/issues/17)).
6. Özgün iş akışı `waiting_for_signal`, `waiting_for_workflows`, `paused`, `failed`, `cancelled` veya `completed` durumundaysa, yeniden oynatılan iş akışında da bu durum korunur.

Yeniden oynatılan iş akışı yeni bir kimlik alır ve özgününden bağımsız çalışır. Özgün iş akışını etkilemez.

`waiting_for_workflows` yeniden oynatmalarında dışa aktarılan bağımlılık satırları aynı iş akışı kimlikleriyle yeniden oluşturulur. Bu, denetim ve söz konusu bağımlı iş akışlarının da bulunduğu ortamlar için kullanışlıdır; ancak bağımlılık kimliklerini ortamlar arasında otomatik olarak eşlemez.

## Kullanım alanları

### Üretim hatalarını yeniden oluşturma

Üretimdeki başarısız bir iş akışını dışa aktarın ve yerel ortamda yeniden oynatın:

```bash
# On production
wp queuety workflow export 42 --output=/tmp/workflow-42.json

# Copy the file to your local environment

# On local
wp queuety workflow replay /tmp/workflow-42.json
```

Yeniden oynatılan iş akışı aynı duruma ve adım tanımlarına sahip olur. Çalışan iş akışlarında geçerli adım yeniden kuyruğa alınır; böylece kaldıkları noktadan yürütmeye devam edebilirsiniz. Duraklatılmış veya bekleyen iş akışları ise incelenmek üzere bu engellenmiş durumda yeniden oluşturulur.

### İş akışlarını ortamlar arasında taşıma

Bir iş akışını dışa aktarıp yeniden oynatarak hazırlık ortamından üretime (veya tersine) taşıyın:

```bash
# On staging
wp queuety workflow export 15 --output=workflow.json

# On production
wp queuety workflow replay workflow.json
```

### Denetim ve arşivleme

Tamamlanmış iş akışlarını uzun süreli depolama veya mevzuata uygunluk için dışa aktarın. JSON dosyası; girdiler, çıktılar, önceki ve sonraki durumlar, zamanlama verileri ve hata ayrıntıları dâhil tüm yürütme geçmişini içerir.

```php
$data = Queuety::export_workflow( $workflow_id );
// Store $data in your archive system, S3, etc.
```
