Skip to main content

UpdateFlowTaskRequest

Form request class for validating FlowTask update data. This request handles partial updates with dynamic validation based on the task's driver, including driver-specific configuration validation.

Namespace

JobMetric\Flow\Http\Requests\FlowTask\UpdateFlowTaskRequest

Overview

The UpdateFlowTaskRequest validates incoming data when updating an existing FlowTask entity. Unlike StoreFlowTaskRequest, all fields are optional (sometimes), allowing partial updates while maintaining data integrity.

Key Features

  • Partial Updates: All fields are optional, allowing selective updates
  • Dynamic Validation: Rules generated based on current or new driver
  • Driver Detection: Automatically detects driver from existing task if not provided
  • Context Support: Supports external context injection
  • Form Builder Integration: Uses driver's form definition for config validation

Validation Rules

Optional Fields

All fields use sometimes rule:

FieldRuleDescription
driversometimes|stringFully qualified driver class name
driver (custom)Class exists, extends AbstractTaskDriver, registeredDriver validation checks
configsometimes|arrayDriver-specific configuration
config.*Dynamic rules from driver's formValidated based on driver's form definition
orderingsometimes|nullable|integer|min:0Task execution order
statussometimes|booleanActive/inactive status

Driver Detection

If driver is not provided in the update, the request automatically detects it from the existing task:

// If updating task ID 5
// And task 5 has driver 'App\FlowTasks\SendEmailTask'
// Then config validation uses SendEmailTask's form definition

Dynamic Config Validation

The config field is validated based on the driver's form definition (from input or existing task):

// If driver (current or new) defines form:
public function form(): array
{
return [
'recipient' => ['required', 'email'],
'subject' => ['required', 'string'],
];
}

// Then config is validated as:
'config.recipient' => 'required|email',
'config.subject' => 'required|string',

Context Management

The request supports external context injection:

$request = new UpdateFlowTaskRequest();
$request->setContext(['flow_task_id' => 123]);

Static Rules Method

rulesFor()

Provides programmatic validation:

$input = [
'driver' => 'App\FlowTasks\SendEmailTask',
'config' => [
'recipient' => 'user@example.com',
],
];

$context = ['flow_task_id' => 5];

$rules = UpdateFlowTaskRequest::rulesFor($input, $context);

Usage Examples

Basic Update

use JobMetric\Flow\Http\Requests\FlowTask\UpdateFlowTaskRequest;
use JobMetric\Flow\Facades\FlowTask;

public function update(UpdateFlowTaskRequest $request, $id)
{
$validated = $request->validated();

$task = FlowTask::update($id, $validated);

return response()->json($task);
}

Partial Update - Status Only

$requestData = [
'status' => false, // Deactivate task
];

Partial Update - Config Only

$requestData = [
'config' => [
'recipient' => 'new-email@example.com',
],
];

Update Driver and Config

$requestData = [
'driver' => 'App\FlowTasks\SendSmsTask',
'config' => [
'phone' => '+1234567890',
'message' => 'Order confirmed',
],
];

Update Ordering

$requestData = [
'ordering' => 5, // Change execution order
];

Complete Update

$requestData = [
'driver' => 'App\FlowTasks\SendEmailTask',
'config' => [
'recipient' => 'user@example.com',
'subject' => 'Updated Subject',
'template' => 'updated-template',
],
'ordering' => 2,
'status' => true,
];

Driver Change Handling

When changing the driver, the config validation switches to the new driver's form:

// Original task uses SendEmailTask
// Update to SendSmsTask
$requestData = [
'driver' => 'App\FlowTasks\SendSmsTask',
'config' => [
'phone' => '+1234567890', // New driver's config
],
];

Error Handling

Validation Errors

{
"message": "The given data was invalid.",
"errors": {
"driver": [
"The driver is not registered in FlowTaskRegistry."
],
"config.recipient": [
"The config.recipient field is required."
]
}
}

Differences from StoreFlowTaskRequest

FeatureStoreFlowTaskRequestUpdateFlowTaskRequest
Field Rulesrequired for driver and transitionsometimes for all fields
Transition IDRequiredNot needed (task already has it)
Driver DetectionMust be providedCan be detected from existing task
Context Supportflow_idflow_task_id
Use CaseCreating new tasksUpdating existing tasks

Best Practices

  1. Update Only Changed Fields: Only send fields that need updating

    // ✅ Good
    ['status' => false]

    // ❌ Bad
    ['driver' => '...', 'config' => [...], 'ordering' => 0, 'status' => false]
  2. Handle Driver Changes: When changing driver, provide new driver's config

    // ✅ Good
    [
    'driver' => 'App\FlowTasks\SendSmsTask',
    'config' => ['phone' => '...'], // New driver's config
    ]
  3. Validate Config Structure: Match config to driver's form definition

    // ✅ Good - Matches form
    'config' => [
    'recipient' => 'user@example.com',
    ]
  4. Use Context for Driver Detection: Provide flow_task_id in context

    $request->setContext(['flow_task_id' => $id]);