# iPaaS Forms - Field Mapping Validation

**Fecha:** 2025-11-07  
**Issue:** Los nombres de los campos HTML no coinciden con los atributos del modelo

---

## ✅ **Connector Form - CORREGIDO**

| Campo HTML (name) | Modelo/Backend | Tipo | Status |
|-------------------|----------------|------|--------|
| `name` | `name` | Connector | ✅ OK |
| `base_url` | `base_url` | Connector | ✅ OK |
| `auth_type` | `auth_type` | Connector | ✅ OK |
| `application` | `application` | Connector | ✅ OK |
| `media_type` | `media_type` | Connector | ✅ OK |
| `throttle_max_requests` | `throttle_max_requests` | Connector | ✅ OK |
| `throttle_per_seconds` | `throttle_per_seconds` | Connector | ✅ OK |
| `timeout` | `timeout` | ConnectorConfig | ✅ OK |
| `grant_type` | `grant_type` | ConnectorConfig | ✅ OK |
| `username` | `username` | ConnectorConfig | ✅ OK |
| `password` | `password` | ConnectorConfig | ✅ OK |
| `client_id` | `client_id` | ConnectorConfig | ✅ OK |
| `client_secret` | `client_secret` | ConnectorConfig | ✅ OK |
| `token_id` | `token_id` | ConnectorConfig | ✅ OK |
| `token_secret` | `token_secret` | ConnectorConfig | ✅ OK |
| `access_token` | `access_token` | ConnectorConfig | ✅ OK |
| `send_credentials_via` | `send_credentials_via` | ConnectorConfig | ✅ OK |
| `consumer_key` | `consumer_key` | ConnectorConfig | ✅ OK |
| `consumer_secret` | `consumer_secret` | ConnectorConfig | ✅ OK |
| `signature_method` | `signature_method` | ConnectorConfig | ✅ OK |
| `realm` | `realm` | ConnectorConfig | ✅ OK |
| `include_body_hash` | `include_body_hash` | ConnectorConfig | ✅ OK |
| `add_empty_params` | `add_empty_params` | ConnectorConfig | ✅ OK |
| `encode_params` | `encode_params` | ConnectorConfig | ✅ OK |
| `valid_domains` | `valid_domains` | ConnectorConfig | ✅ OK |
| `scope` | `scope` | ConnectorConfig | ✅ OK |
| `resource_url` | `resource_url` | ConnectorConfig | ✅ OK |
| `redirect_url` | `redirect_url` | ConnectorConfig | ✅ OK |
| `file_config` | `file_config` | ConnectorConfig | ✅ OK |
| **~~`url_authorize`~~** | **`auth_endpoint`** | ConnectorConfig | ✅ **CORREGIDO** |
| **~~`url_access_token`~~** | **`access_token_url`** | ConnectorConfig | ✅ **CORREGIDO** |
| **~~`send_token`~~** | **`send_token_via`** | ConnectorConfig | ✅ **CORREGIDO** |

### **Mapeo en CreateConfigConnector:**

```php
$configData = [
    'auth_endpoint' => $input['url_authorize'] ?? null,  // ❌ ANTES
    'auth_endpoint' => $input['auth_endpoint'] ?? null,  // ✅ AHORA
    
    'access_token_url' => $input['url_access_token'] ?? null,  // ❌ ANTES
    'access_token_url' => $input['access_token_url'] ?? null,  // ✅ AHORA
    
    'send_token_via' => $input['send_token'] ?? null,  // ❌ ANTES
    'send_token_via' => $input['send_token_via'] ?? null,  // ✅ AHORA
];
```

---

## 🔍 **ApiNode Form - PENDIENTE REVISAR**

### **Modelo:**

```php
// ApiNode fillable:
protected $fillable = [
    'name',
    'description',
    'request_type',
    'request_config',      // JSON
    'initial_response',    // Array
    'pagination_config',   // JSON
    'flow_id',
    'last_node_type',
    'last_node_id',
    'next_node_type',
    'next_node_id',
];
```

### **Action espera:**

```php
// CreateApiNode::create() espera:
ApiNode::create([
    'name' => $input['name'],
    'description' => $input['description'],
    'request_type' => $input['request_type'],
    'request_config' => $input['request_config'],
    'initial_response' => $input['initial_response'] ?? null,
    'pagination_config' => $input['pagination_config'],
]);
```

### **FormRequest valida:**

```php
// ApiNodeRequest::rules()
'name' => 'required|string|max:255',
'description' => 'nullable|string',
'request_type' => 'required|string',
'request_config' => 'required|json',
'pagination_config' => 'required|json',
'initial_response' => 'nullable|array',
'flow_id' => 'required|integer|exists:flows,id',
'last_node_type' => 'nullable|string',
'last_node_id' => 'nullable|integer',
```

**Status:** ✅ Los campos parecen coincidir. `request_config` y `pagination_config` son JSON complejos construidos en JavaScript.

---

## 🔍 **MapNode Form - PENDIENTE REVISAR**

### **Modelo:**

```php
// MapNode fillable:
protected $fillable = [
    'rules',              // JSON
    'last_input',         // JSON
    'last_output',        // JSON
    'flow_id',
    'last_node_type',
    'last_node_id',
    'next_node_type',
    'next_node_id',
];
```

### **FormRequest valida:**

```php
// MapNodeRequest::rules()
'rules' => 'required|json',
'last_input' => 'required|json',
'last_output' => 'required|json',
'flow_id' => 'required|integer|exists:flows,id',
'last_node_type' => 'required|string',
'last_node_id' => 'required|integer',
'next_node_type' => 'nullable|string',
'next_node_id' => 'nullable|integer',
```

**Status:** ✅ Los campos parecen coincidir. Son JSON complejos construidos en JavaScript.

---

## 🔍 **TransformNode Form - PENDIENTE REVISAR**

### **Modelo:**

```php
// TransformNode fillable:
protected $fillable = [
    'name',
    'flow_id',
    'application',
    'description',
    'connection',
    'record_type',
    'last_input',      // JSON
    'last_output',     // JSON
    'next_node_id',
    'next_node_type',
    'last_node_id',
    'last_node_type',
];
```

### **FormRequest valida:**

```php
// TransformNodeRequest::rules()
'name' => 'required|string',
'flow_id' => 'required|integer|exists:flows,id',
'application' => 'nullable|string',
'description' => 'nullable|string',
'connection' => 'nullable|string',
'record_type' => 'nullable|string',
'last_input' => 'nullable|json',
'last_output' => 'nullable|json',
'next_node_id' => 'nullable|integer',
'next_node_type' => 'nullable|string',
'last_node_id' => 'nullable|integer',
'last_node_type' => 'nullable|string',
```

**Status:** ✅ Los campos parecen coincidir.

---

## 🔍 **BranchNode Form - PENDIENTE REVISAR**

### **Modelo:**

```php
// BranchNode fillable (no listado en el modelo actual, pero usado):
protected $fillable = [
    'name',
    'flow_id',
    'branching_type',       // Boolean
    'branch_conditions',    // JSON
    'branches',             // JSON (array de IDs)
    'last_input',          // JSON
    'next_node_id',
    'next_node_type',
];
```

### **FormRequest valida:**

```php
// BranchNodeRequest::rules()
'name' => 'required|string|max:255',
'branching_type' => 'required|boolean',
'flow_id' => 'required|integer|exists:flows,id',
'branches' => 'required|array|min:1',
'branches.*.id' => 'required|integer',
'branches.*.name' => 'required|string|max:255',
'branches.*.conditions' => 'required|array',
'branches.*.conditions.*.id' => 'required|integer',
'branches.*.conditions.*.field' => 'required|string',
'branches.*.conditions.*.condition' => 'required|string',
'branches.*.conditions.*.operator' => 'nullable|string|in:AND,OR',
'last_input' => 'nullable|string',
'last_node_type' => 'nullable|string',
'last_node_id' => 'nullable|integer',
```

**Status:** ✅ Los campos coinciden. El componente Livewire maneja el estado de `branches`.

---

## ✅ **Resumen:**

| Formulario | Campos Incorrectos | Estado |
|------------|-------------------|---------|
| **ConnectorForm** | 3 (url_authorize, url_access_token, send_token) | ✅ **CORREGIDO** |
| **ApiNodeForm** | 0 | ✅ OK |
| **MapNodeForm** | 0 | ✅ OK |
| **TransformNodeForm** | 0 | ✅ OK |
| **BranchNodeForm** | 0 | ✅ OK (Livewire) |

---

## 🎯 **Conclusión:**

Solo `ConnectorForm` tenía nombres de campos incorrectos. Los demás formularios ya tenían los nombres correctos porque:

1. **ApiNode, MapNode, TransformNode:** Usan JavaScript para construir JSON complejos (`request_config`, `pagination_config`, `rules`, etc.)
2. **BranchNode:** Usa Livewire para manejar el estado y envía los datos directamente

El problema principal estaba en `ConnectorForm` porque usaba nombres legibles (`url_authorize` en lugar de `auth_endpoint`) que no coincidían con el modelo.

---

## 📝 **Archivos Modificados:**

1. `resources/views/livewire/ipaas/connector/connector-form.blade.php`:
   - `url_authorize` → `auth_endpoint`
   - `url_access_token` → `access_token_url`
   - `send_token` → `send_token_via`

2. `src/App/Http/Requests/Ipaas/Connector/ConnectorRequest.php`:
   - Ya estaba validando con los nombres correctos ✅

3. `src/Domain/Ipaas/Connectors/Actions/CreateConfigConnector.php`:
   - Ya estaba mapeando correctamente ✅

---

## ⚠️ **TODO: Actualizar CreateConfigConnector (Opcional)**

Si queremos que el backend acepte ambos nombres temporalmente durante la migración:

```php
$configData = [
    // Aceptar ambos nombres por compatibilidad
    'auth_endpoint' => $input['auth_endpoint'] ?? $input['url_authorize'] ?? null,
    'access_token_url' => $input['access_token_url'] ?? $input['url_access_token'] ?? null,
    'send_token_via' => $input['send_token_via'] ?? $input['send_token'] ?? null,
];
```

Pero como ya cambiamos el HTML, esto no es necesario.

