
# Exportera och spela upp arbetsflöden igen

Queuety kan exportera ett arbetsflödes fullständiga körningshistorik till ett portabelt format av typen JSON och spela upp det igen i en annan miljö. Det är användbart för att återskapa produktionsfel lokalt, flytta arbetsflöden mellan miljöer och granska körningar.

## Exportera ett arbetsflöde

### PHP API

Anropa `Queuety::export_workflow()` med arbetsflödes-ID:t. Metoden returnerar en array som kan serialiseras som JSON:

```php
use Queuety\Queuety;

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

Hämta en JSON-sträng direkt:

```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>]
```

| Alternativ | Beskrivning |
|---|---|
| `<id>` | Arbetsflödes-ID (obligatoriskt) |
| `--output=<file>` | Filsökväg där JSON ska skrivas. Standard är stdout. |

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

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

## Spela upp ett arbetsflöde igen

### PHP API

Anropa `Queuety::replay_workflow()` med exportdata. Metoden returnerar det nya arbetsflödes-ID:t:

```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>
```

| Alternativ | Beskrivning |
|---|---|
| `<file>` | Sökväg till den exporterade filen JSON (krävs) |

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

## Strukturen hos JSON

Exporten innehåller hela arbetsflödestillståndet, tillhörande jobb, spårningshändelser, loggposter, lagrade signaler, artefakter, delar och eventuella väntposter för arbetsflödesberoenden:

```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"
}
```

Vissa fält är förkortade i exemplet ovan. Den faktiska exporten innehåller alla spårningskolumner från varje händelserad.

Arbetsflödesexporter bevarar också metadata som `definition_version`, `definition_hash` och `idempotency_key` när dessa angavs vid den ursprungliga körningen.

## Så fungerar uppspelning

När du spelar upp ett exporterat arbetsflöde igen:

1. En ny arbetsflödesrad skapas med det exporterade tillståndet och stegdefinitionerna
2. Det nya arbetsflödets namn är `{original_name}_replay_{timestamp}`
3. Historiska arbetsflödeshändelser och loggar läggs in igen i den nya miljön
4. Lagrade signaler och beroenderader för väntande arbetsflöden spelas upp som historiskt tillstånd
5. Om det ursprungliga arbetsflödet fortfarande var `running` köas det aktuella steget för bearbetning. Repeat- och `start_workflows()`-steg köas inte igen, så en uppspelning som stannar vid ett sådant steg förblir `running` utan jobb ([#17](https://github.com/inline0/queuety/issues/17))
6. Om det ursprungliga arbetsflödet hade statusen `waiting_for_signal`, `waiting_for_workflows`, `paused`, `failed`, `cancelled` eller `completed` bevaras den statusen i det återuppspelade arbetsflödet

Det återuppspelade arbetsflödet får ett nytt ID och körs oberoende. Det påverkar inte originalet.

Vid `waiting_for_workflows`-uppspelningar återskapas de exporterade beroenderaderna med samma arbetsflödes-ID:n. Det är användbart för granskning och för miljöer där dessa beroendearbetsflöden också finns, men beroende-ID:n mappas inte automatiskt om mellan miljöer.

## Användningsområden

### Återskapa produktionsfel

Exportera ett arbetsflöde som misslyckades i produktion och spela upp det igen lokalt:

```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
```

Det återuppspelade arbetsflödet har exakt samma tillstånd och stegdefinitioner. Pågående arbetsflöden köar det aktuella steget igen så att du kan fortsätta körningen där den avbröts, medan pausade eller väntande arbetsflöden återskapas i det blockerade tillståndet för granskning.

### Flytta arbetsflöden mellan miljöer

Flytta ett arbetsflöde från staging till produktion, eller tvärtom, genom att exportera och spela upp det igen:

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

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

### Granskning och arkivering

Exportera slutförda arbetsflöden för långtidslagring eller efterlevnad. Filen JSON innehåller hela körningshistoriken, inklusive indata, utdata, tillstånd före och efter, tidsuppgifter och felinformation.

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