
# Eksport og afspilning af workflows

Queuety kan eksportere et workflows komplette kørselshistorik til et portabelt format JSON og afspille den i et andet miljø. Det er nyttigt til at genskabe produktionsfejl lokalt, flytte workflows mellem miljøer og udføre revision.

## Eksport af et workflow

### PHP API

Kald `Queuety::export_workflow()` med workflow-ID'et. Den returnerer et JSON-serialiserbart array:

```php
use Queuety\Queuety;

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

Sådan får du direkte en JSON-streng:

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

| Valgmulighed | Beskrivelse |
|---|---|
| `<id>` | Workflow-id (påkrævet) |
| `--output=<file>` | Filsti, hvor JSON skal skrives. Standard er stdout. |

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

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

## Afspilning af et workflow

### PHP API

Kald `Queuety::replay_workflow()` med eksportdataene. Den returnerer det nye workflow-ID:

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

| Valgmulighed | Beskrivelse |
|---|---|
| `<file>` | Sti til den eksporterede JSON-fil (påkrævet) |

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

## Struktur for JSON

Eksporten indeholder hele workflowtilstanden, tilhørende jobs, sporhændelser, logposter, gemte signaler, artefakter, bidder og eventuelle rækker for ventende workflowafhængigheder:

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

Nogle felter er forkortet i eksemplet ovenfor. Den faktiske eksport indeholder alle sporkolonner fra hver hændelsesrække.

Workfloweksporter bevarer også workflowmetadata såsom `definition_version`, `definition_hash` og `idempotency_key`, hvis de blev angivet i den oprindelige kørsel.

## Sådan fungerer afspilning

Når du afspiller et eksporteret workflow:

1. Der oprettes en ny workflowrække med den eksporterede tilstand og trindefinitioner
2. Det nye workflows navn er `{original_name}_replay_{timestamp}`
3. Historiske workflowhændelser og logge indsættes igen i det nye miljø
4. Gemte signaler og rækker med ventende workflowafhængigheder afspilles som historisk tilstand
5. Hvis det oprindelige workflow stadig var `running`, sættes det aktuelle trin i kø til behandling. Repeat- og `start_workflows()`-trin sættes ikke i kø igen, så en afspilning, der stopper ved et af dem, forbliver `running` uden et job ([#17](https://github.com/inline0/queuety/issues/17))
6. Hvis det oprindelige workflow var `waiting_for_signal`, `waiting_for_workflows`, `paused`, `failed`, `cancelled` eller `completed`, bevares den status i det afspillede workflow

Det afspillede workflow får et nyt ID og kører uafhængigt. Det påvirker ikke originalen.

Ved afspilning af `waiting_for_workflows` genskabes de eksporterede afhængighedsrækker med de samme workflow-ID'er. Det er nyttigt til revision og i miljøer, hvor afhængighedsworkflowsene også findes, men afhængigheds-ID'er tilpasses ikke automatisk på tværs af miljøer.

## Anvendelsesområder

### Genskab produktionsfejl

Eksportér et fejlet workflow fra produktion, og afspil det 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 afspillede workflow har præcis samme tilstand og trindefinitioner. Kørende workflows sætter det aktuelle trin i kø igen, så du kan fortsætte kørslen fra det sted, hvor de slap. Workflows, der er sat på pause eller venter, genskabes i den blokerede tilstand, så du kan undersøge dem.

### Flyt workflows mellem miljøer

Flyt et workflow fra staging til produktion eller omvendt ved at eksportere og afspille det:

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

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

### Revision og arkivering

Eksportér fuldførte workflows til langtidsopbevaring eller overholdelse af regler. Filen JSON indeholder hele kørselshistorikken, herunder input, output, tilstand før og efter, tidsdata og fejloplysninger.

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