Skip to main content

UpdateFlowStateRequest

Form request class for validating FlowState update data. This request handles partial updates with context-aware validation, ensuring translation uniqueness while allowing selective field updates.

Namespace

JobMetric\Flow\Http\Requests\FlowState\UpdateFlowStateRequest

Overview

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

Key Features

  • Partial Updates: All fields are optional, allowing selective updates
  • Context-Aware Validation: Uses flow_id and state_id from context
  • Static Rules Method: Provides rulesFor() for programmatic validation
  • Status Validation: Validates status against flow's driver
  • Translation Uniqueness: Validates translation names excluding current state

Validation Rules

Optional Fields

All fields use sometimes rule:

FieldRuleDescription
translationsometimes|arrayMulti-language translation data
translation.{locale}sometimes|arrayTranslation data for specific locale
translation.{locale}.namerequired|stringState name (validated if locale provided)
statussometimes|nullable|CheckStatusInDriverRuleStatus value (validated against flow's driver)
configsometimes|arrayCustom configuration array
colorsometimes|nullable|hex_colorHex color code
iconsometimes|nullable|stringIcon identifier
positionsometimes|array|required_array_keys:x,yPosition coordinates
position.xnumericX coordinate
position.ynumericY coordinate
is_terminalsometimes|booleanTerminal state flag
translation.{locale}.descriptionnullable|stringOptional description

Context Management

The request supports external context injection:

$request = new UpdateFlowStateRequest();
$request->setContext([
'flow_id' => 123,
'state_id' => 456,
]);

Static Rules Method

rulesFor()

Provides programmatic validation:

$input = [
'translation' => [
'en' => ['name' => 'Updated Name'],
],
'status' => 'completed',
];

$context = [
'flow_id' => 1,
'state_id' => 5,
];

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

Status Validation

The status field uses CheckStatusInDriverRule to validate against the flow's driver:

// If flow uses OrderStatus enum
'status' => 'completed', // ✅ Valid if in enum
'status' => 'invalid', // ❌ Invalid if not in enum

Usage Examples

Basic Update

use JobMetric\Flow\Http\Requests\FlowState\UpdateFlowStateRequest;
use JobMetric\Flow\Facades\FlowState;

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

$state = FlowState::update($id, $validated);

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

Partial Update - Status Only

$requestData = [
'status' => 'completed',
];

Partial Update - Translation Only

$requestData = [
'translation' => [
'en' => [
'name' => 'Updated State Name',
'description' => 'New description',
],
],
];

Update Visual Configuration

$requestData = [
'color' => '#10B981',
'icon' => 'fas fa-check-circle',
'position' => [
'x' => 300,
'y' => 400,
],
];

Update Multiple Fields

$requestData = [
'translation' => [
'en' => ['name' => 'Updated Name'],
],
'status' => 'completed',
'is_terminal' => true,
'color' => '#10B981',
];

Error Handling

Validation Errors

{
"message": "The given data was invalid.",
"errors": {
"translation.en.name": [
"A state with this name already exists in this flow."
],
"status": [
"The status value is not valid for this flow's driver."
]
}
}

Differences from StoreFlowStateRequest

FeatureStoreFlowStateRequestUpdateFlowStateRequest
Field Rulesrequired for translationssometimes for all fields
Context Supportflow_id onlyflow_id and state_id
Static Methodnormalize() and rulesFor()rulesFor() only
Uniqueness CheckChecks all states in flowExcludes current state
Flow IDRequired fieldOptional (from context)

Best Practices

  1. Use Context for Uniqueness: Always provide flow_id and state_id in context

    $request->setContext([
    'flow_id' => $flowId,
    'state_id' => $stateId,
    ]);
  2. Validate Only Changed Fields: Only send fields that need updating

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

    // ❌ Bad
    ['translation' => [...], 'status' => 'completed', 'color' => '#...', ...]
  3. Handle Status Changes Carefully: Ensure status is valid for flow's driver

    // ✅ Good - Validate first
    $validStatuses = OrderStatus::values();
    if (in_array($newStatus, $validStatuses)) {
    'status' => $newStatus,
    }