Files
MobilityOps/n8n/mobilityops-scheduled-quality-scan.json
T
NuklearRabbit e115031a57 feat(n8n): add scheduled quality-scan workflow
The original docs described two n8n workflows but the repository only ever
shipped one (return-processing); the sketched second workflow (knowledge
sync) depends on RAGcore, which isn't connected here, so it stays deferred.

Add POST /api/v1/integrations/n8n/scheduled-scan (X-Service-Token
protected, same pattern as the return callback), calling the same
run_scan() the manual "Run quality scan" UI action uses and recording a
service-actor data_quality_scan_run audit event. run_scan() already only
creates an issue for a condition without one open, so overlapping triggers
do no duplicate domain work.

n8n/mobilityops-scheduled-quality-scan.json (hourly schedule + manual test
trigger, both feeding the same HTTP call) ships "active": false so it can't
fire anywhere until deliberately published. Verified live against the
local n8n instance via the Manual test trigger: full green execution, and
the resulting data_quality_scan_run audit event (actor_type=service,
actor_label="n8n scheduled scan") confirms the real round trip, not just a
contract test. deploy/unraid/setup-scheduled-scan.sh mirrors the existing
return-workflow publish script for the shared Unraid n8n.
2026-08-02 06:59:17 +02:00

121 lines
2.5 KiB
JSON

{
"id": "mobilityops-scheduled-quality-scan",
"name": "MobilityOps - Scheduled Quality Scan",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
},
"id": "schedule-node",
"name": "Hourly schedule",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
240,
220
]
},
{
"parameters": {},
"id": "manual-node",
"name": "Manual test trigger",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
240,
400
]
},
{
"parameters": {
"method": "POST",
"url": "={{$env.MOBILITYOPS_API_URL || 'http://api:8000'}}/api/v1/integrations/n8n/scheduled-scan",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "X-Service-Token",
"value": "={{$env.MOBILITYOPS_CALLBACK_TOKEN}}"
}
]
},
"options": {
"timeout": 15000
}
},
"id": "scan-node",
"name": "Run quality scan",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
520,
300
]
},
{
"parameters": {
"jsCode": "const created = $json.created ?? {};\nconst total = Object.values(created).reduce((a, b) => a + b, 0);\nreturn [{json: {total_created: total, created_by_rule: created}}];"
},
"id": "summarize-node",
"name": "Summarize result",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
780,
300
]
}
],
"connections": {
"Hourly schedule": {
"main": [
[
{
"node": "Run quality scan",
"type": "main",
"index": 0
}
]
]
},
"Manual test trigger": {
"main": [
[
{
"node": "Run quality scan",
"type": "main",
"index": 0
}
]
]
},
"Run quality scan": {
"main": [
[
{
"node": "Summarize result",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"active": false,
"versionId": "22222222-2222-4222-8222-222222222222",
"meta": {
"templateCredsSetupCompleted": false
},
"tags": []
}