
# Darbo eigos eksportavimas ir atkūrimas

Queuety gali eksportuoti visą darbo eigos vykdymo istoriją į perkeliamą JSON formatą ir atkurti ją kitoje aplinkoje. Tai naudinga norint vietoje atkurti gamybinėje aplinkoje aptiktas klaidas, perkelti darbo eigas iš vienos aplinkos į kitą ir atlikti auditą.

## Darbo eigos eksportavimas

### PHP API

Iškvieskite `Queuety::export_workflow()` nurodydami darbo eigos ID. Grąžinamas į JSON serializuojamas masyvas:

```php
use Queuety\Queuety;

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

Jei norite tiesiogiai gauti JSON eilutę:

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

| Parinktis | Aprašymas |
|---|---|
| `<id>` | Darbo eigos ID (privalomas) |
| `--output=<file>` | Failo, į kurį įrašomas JSON, kelias. Pagal numatytuosius nustatymus – stdout. |

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

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

## Darbo eigos atkūrimas

### PHP API

Iškvieskite `Queuety::replay_workflow()` su eksporto duomenimis. Grąžinamas naujos darbo eigos 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>
```

| Parinktis | Aprašymas |
|---|---|
| `<file>` | Eksportuoto JSON failo kelias (privalomas) |

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

## Struktūra JSON

Eksporte yra visa darbo eigos būsena, susietos užduotys, pėdsakų įvykiai, žurnalo įrašai, išsaugoti signalai, artefaktai, dalys ir visos laukimo įrašų eilutės pagal darbo eigos priklausomybes:

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

Kai kurie laukai pateiktame pavyzdyje sutrumpinti. Tikrajame eksporte yra visi kiekvienos įvykio eilutės pėdsako stulpeliai.

Darbo eigos eksportuose taip pat išsaugomi metaduomenys, pavyzdžiui, `definition_version`, `definition_hash` ir `idempotency_key`, jei jie buvo nustatyti pradiniame vykdyme.

## Kaip veikia atkūrimas

Atkuriant eksportuotą darbo eigą:

1. Sukuriama nauja darbo eigos eilutė su eksportuota būsena ir žingsnių aprašais
2. Naujos darbo eigos pavadinimas yra `{original_name}_replay_{timestamp}`
3. Istoriniai darbo eigos įvykiai ir žurnalai iš naujo įterpiami į naują aplinką
4. Išsaugoti signalai ir darbo eigos laukimo priklausomybių eilutės atkuriami kaip istorinė būsena
5. Jei pradinė darbo eiga vis dar buvo `running`, dabartinis žingsnis įtraukiamas į apdorojimo eilę. Kartojimo ir `start_workflows()` žingsniai į eilę iš naujo neįtraukiami, todėl atkūrimas, sustojęs ties vienu iš jų, lieka `running` be užduoties ([#17](https://github.com/inline0/queuety/issues/17))
6. Jei pradinė darbo eiga buvo `waiting_for_signal`, `waiting_for_workflows`, `paused`, `failed`, `cancelled` arba `completed` būsenos, ši būsena išsaugoma atkurtoje darbo eigoje

Atkurta darbo eiga gauna naują ID ir veikia nepriklausomai. Ji neturi įtakos pradinei darbo eigai.

Atkuriant `waiting_for_workflows`, eksportuotos priklausomybių eilutės sukuriamos iš naujo su tais pačiais darbo eigų ID. Tai naudinga atliekant auditą ir aplinkose, kuriose tos priklausomos darbo eigos taip pat egzistuoja, tačiau jų ID automatiškai nesusiejami su ID kitose aplinkose.

## Naudojimo atvejai

### Gamybinių klaidų atkūrimas

Eksportuokite nepavykusią darbo eigą iš gamybinės aplinkos ir pakartokite ją vietoje:

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

Pakartotos darbo eigos būsena ir žingsnių apibrėžtys yra visiškai tokios pačios. Vykdomose darbo eigose dabartinis žingsnis įtraukiamas į eilę iš naujo, kad galėtumėte tęsti vykdymą nuo vietos, kurioje jis buvo sustojęs, o pristabdytos arba laukiančios darbo eigos atkuriamos tokios užblokuotos būsenos, kad galėtumėte jas patikrinti.

### Darbo eigų perkėlimas tarp aplinkų

Perkelkite darbo eigą iš paruošimo aplinkos į gamybinę (arba atvirkščiai) ją eksportuodami ir pakartodami:

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

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

### Auditas ir archyvavimas

Eksportuokite užbaigtas darbo eigas ilgalaikiam saugojimui arba atitikties reikalavimams. Faile JSON pateikiama visa vykdymo istorija, įskaitant įvestis, išvestis, būseną prieš ir po, laiko duomenis ir išsamią informaciją apie klaidas.

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