50 lines
1.2 KiB
Markdown
50 lines
1.2 KiB
Markdown
# Quickstart: Adding a New Operation
|
|
|
|
## 1. Register Run Type
|
|
Add your new type constant to `App\Enums\OperationRunType` (if using Enums) or just use the string convention `resource.action`.
|
|
|
|
## 2. Implement Idempotency Inputs
|
|
Define what makes a run "unique" for your feature.
|
|
- Example: `['scope' => 'full']` vs `['scope' => 'policy', 'policy_id' => 1]`.
|
|
|
|
## 3. Use `OperationRunService`
|
|
In your Start Action (Controller/Livewire):
|
|
|
|
```php
|
|
// 1. Ensure Run
|
|
$run = $service->ensureRun($tenant, 'my_resource.action', $inputs, auth()->user());
|
|
|
|
// 2. Dispatch Job (if new)
|
|
if ($run->wasRecentlyCreated) {
|
|
MyJob::dispatch($run, $inputs);
|
|
}
|
|
|
|
// 3. Return View Link
|
|
return redirect()->route('tenant.monitoring.operations.show', [$tenant, $run]);
|
|
```
|
|
|
|
## 4. Instrument Job
|
|
In your Job:
|
|
|
|
```php
|
|
public function handle()
|
|
{
|
|
// Update to Running
|
|
$this->run->updateStatus(status: 'running');
|
|
|
|
try {
|
|
// ... do work ...
|
|
|
|
// Success
|
|
$this->run->updateStatus(
|
|
status: 'completed',
|
|
outcome: 'succeeded',
|
|
summary: ['processed' => 100]
|
|
);
|
|
} catch (\Throwable $e) {
|
|
// Failure
|
|
$this->run->fail($e);
|
|
}
|
|
}
|
|
```
|