Initial MobilityOps build pack (docs, contracts, scaffold)
This commit is contained in:
@@ -0,0 +1,13 @@
|
||||
# n8n workflows
|
||||
|
||||
`mobilityops-return-processing.json` is a starter import for the required live workflow.
|
||||
|
||||
Before final validation Claude must:
|
||||
|
||||
1. import or provision the workflow;
|
||||
2. configure a service credential for the MobilityOps callback;
|
||||
3. activate the webhook;
|
||||
4. ensure event ID is used as the idempotency key;
|
||||
5. validate online success and offline retry behaviour.
|
||||
|
||||
The callback URL in the starter file is intentionally environment-driven and may require an n8n expression or credential adjustment.
|
||||
@@ -0,0 +1,122 @@
|
||||
{
|
||||
"name": "MobilityOps - Vehicle Return Processing",
|
||||
"nodes": [
|
||||
{
|
||||
"parameters": {
|
||||
"httpMethod": "POST",
|
||||
"path": "mobilityops-return",
|
||||
"responseMode": "responseNode",
|
||||
"options": {}
|
||||
},
|
||||
"id": "webhook-node",
|
||||
"name": "Return webhook",
|
||||
"type": "n8n-nodes-base.webhook",
|
||||
"typeVersion": 2,
|
||||
"position": [
|
||||
240,
|
||||
300
|
||||
],
|
||||
"webhookId": "mobilityops-return"
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"jsCode": "const e = $json.body ?? $json;\nif (e.event_type !== 'vehicle.returned.v1') throw new Error('Unsupported event type');\nconst reasons = e.data?.attention_reasons ?? [];\nreturn [{json: {event_id: e.event_id, event_type: e.event_type, aggregate_ref: e.aggregate.public_ref, follow_up: reasons.length ? 'attention_required' : 'cleaning', summary: reasons.join('; ') || 'Create cleaning follow-up'}}];"
|
||||
},
|
||||
"id": "validate-node",
|
||||
"name": "Validate and derive follow-up",
|
||||
"type": "n8n-nodes-base.code",
|
||||
"typeVersion": 2,
|
||||
"position": [
|
||||
500,
|
||||
300
|
||||
]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"method": "POST",
|
||||
"url": "={{$env.MOBILITYOPS_CALLBACK_URL || 'http://api:8000/api/v1/integrations/n8n/return-callback'}}",
|
||||
"sendHeaders": true,
|
||||
"headerParameters": {
|
||||
"parameters": [
|
||||
{
|
||||
"name": "Idempotency-Key",
|
||||
"value": "={{$json.event_id}}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sendBody": true,
|
||||
"contentType": "raw",
|
||||
"rawContentType": "application/json",
|
||||
"body": "={{JSON.stringify($json)}}",
|
||||
"options": {}
|
||||
},
|
||||
"id": "callback-node",
|
||||
"name": "Record follow-up",
|
||||
"type": "n8n-nodes-base.httpRequest",
|
||||
"typeVersion": 4.2,
|
||||
"position": [
|
||||
760,
|
||||
300
|
||||
]
|
||||
},
|
||||
{
|
||||
"parameters": {
|
||||
"respondWith": "json",
|
||||
"responseBody": "={{ { ok: true, event_id: $('Validate and derive follow-up').item.json.event_id, result: $json } }}",
|
||||
"options": {}
|
||||
},
|
||||
"id": "response-node",
|
||||
"name": "Return result",
|
||||
"type": "n8n-nodes-base.respondToWebhook",
|
||||
"typeVersion": 1.4,
|
||||
"position": [
|
||||
1020,
|
||||
300
|
||||
]
|
||||
}
|
||||
],
|
||||
"connections": {
|
||||
"Return webhook": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Validate and derive follow-up",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Validate and derive follow-up": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Record follow-up",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
},
|
||||
"Record follow-up": {
|
||||
"main": [
|
||||
[
|
||||
{
|
||||
"node": "Return result",
|
||||
"type": "main",
|
||||
"index": 0
|
||||
}
|
||||
]
|
||||
]
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
"executionOrder": "v1"
|
||||
},
|
||||
"active": false,
|
||||
"versionId": "11111111-1111-4111-8111-111111111111",
|
||||
"meta": {
|
||||
"templateCredsSetupCompleted": false
|
||||
},
|
||||
"tags": []
|
||||
}
|
||||
Reference in New Issue
Block a user