Task: Wekan notifications to Zulip

n8n workflow JSON:
{"id":36,"nodes":[{"name":"Set","type":"n8n-nodes-base.set","position":[500,100],"parameters":{"values":{"string":[{"name":"user","value":"={{$json[\"body\"][\"user\"]}}"},{"name":"card","value":"={{$json[\"body\"][\"card\"]}}"},{"name":"text","value":"={{$json[\"body\"][\"text\"]}}"},{"name":"boardId","value":"={{$json[\"body\"][\"boardId\"]}}"},{"name":"comment","value":"={{$json[\"body\"][\"comment\"]}}"},{"name":"cardId","value":"={{$json[\"body\"][\"cardId\"]}}"},{"name":"toList","value":"={{$json[\"body\"][\"listId\"]}}"}]},"options":{}},"typeVersion":1},{"name":"Webhook Wekan","type":"n8n-nodes-base.webhook","position":[300,100],"webhookId":"75ae4fad-9909-447f-a794-6088e526eb3f","parameters":{"path":"wekan-zulip-daily","options":{},"httpMethod":"POST"},"typeVersion":1},{"name":"Zulip","type":"n8n-nodes-base.zulip","position":[2400,80],"parameters":{"topic":"board","stream":"={{$node[\"Get board/lists names\"].json[\"board_name\"]}}","content":"=@{{$node[\"Set\"].json[\"user\"]}} moved [{{$node[\"Set\"].json[\"card\"]}}]({{$node[\"Get board/lists names\"].json[\"url\"]}}) from {{$node[\"Get board/lists names\"].json[\"from_list\"]}} to {{$node[\"Get board/lists names\"].json[\"to_list\"]}}\n@**{{$node[\"GraphQL\"].json[\"data\"][\"external_ids\"][0][\"user\"][\"username\"]}}** please review!","operation":"sendStream"},"credentials":{"zulipApi":{"id":"5","name":"W_Zulip account"}},"typeVersion":1},{"name":"Get board/lists names","type":"n8n-nodes-base.function","position":[1120,180],"parameters":{"functionCode":"// Check if doesn't start with + and then add it\n// var text = 'kaspar moved card \"Task2\" at board \"test\" from list \"Todo\" at swimlane \"Default\" to list \"Backlog\" at swimlane \"Default\" https://boards.crewnew.com/b/k4JYtSBpG2WZyzEw7/test/R9Zf2LGKZjcwxMo5m';\nconst text = items[0].json.text;\nconst textBrace = text.split('\"');\nvar board = textBrace[3];\nvar fromList = textBrace[5];\nvar toList = textBrace[9];\nvar url = textBrace[12].substring(1);\n\n//Deliver result\n//return text;\nreturn [{\n  json: { \n    \"board_name\" : board, \n    \"from_list\" : fromList,\n    \"to_list\" : toList,\n    \"url\" : url\n  }\n}]"},"typeVersion":1},{"name":"moveCard","type":"n8n-nodes-base.if","position":[920,180],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"body\"][\"description\"]}}","value2":"act-moveCard"}]}},"typeVersion":1},{"name":"createCard","type":"n8n-nodes-base.if","position":[920,380],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"body\"][\"description\"]}}","value2":"act-createCard"}]}},"typeVersion":1},{"name":"Get board/lists names1","type":"n8n-nodes-base.function","position":[1120,380],"parameters":{"functionCode":"// Check if doesn't start with + and then add it\n//var text = 'kaspar created card \"Task3\" to list \"Todo\" at swimlane \"Default\" at board \"test\" https://boards.crewnew.com/b/k4JYtSBpG2WZyzEw7/test/9DkfQAihe25wHa9Ym';\nconst text = items[0].json.text;\nconst textBrace = text.split('\"');\nvar list = textBrace[3];\nvar board = textBrace[7];\nvar url = textBrace[8].substring(1);\n\n//Deliver result\nreturn [{\n  json: { \n    \"board_name\" : board, \n    \"list\" : list,\n    \"url\" : url \n  }\n}]"},"typeVersion":1},{"name":"Zulip1","type":"n8n-nodes-base.zulip","position":[1300,380],"parameters":{"topic":"board","stream":"={{$json[\"board_name\"]}}","content":"=@{{$node[\"Set\"].json[\"user\"]}} created [{{$node[\"Set\"].json[\"card\"]}}]({{$node[\"Get board/lists names1\"].json[\"url\"]}}) to {{$node[\"Get board/lists names1\"].json[\"list\"]}}","operation":"sendStream"},"credentials":{"zulipApi":{"id":"5","name":"W_Zulip account"}},"typeVersion":1},{"name":"addComment","type":"n8n-nodes-base.if","position":[920,560],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"body\"][\"description\"]}}","value2":"act-addComment"}]}},"typeVersion":1},{"name":"Get board/lists names2","type":"n8n-nodes-base.function","position":[1120,560],"parameters":{"functionCode":"// Check if doesn't start with + and then add it\n//var text = 'kaspar commented on card \"Task4\": \"comm1\" at list \"Todo\" at swimlane \"Default\" at board \"test\" https://boards.crewnew.com/b/k4JYtSBpG2WZyzEw7/test/EqwrdC67LPFGYi526';\nconst text = items[0].json.text;\nconst textBrace = text.split('\"');\nvar board = textBrace[9];\nvar url = textBrace[10].substring(1);\n\n//Deliver result\nreturn [{\n  json: { \n    \"board_name\" : board, \n    \"url\" : url,\n    \"text\" : text \n  }\n}]"},"typeVersion":1},{"name":"Zulip2","type":"n8n-nodes-base.zulip","position":[1300,560],"parameters":{"topic":"board","stream":"={{$json[\"board_name\"]}}","content":"=@{{$node[\"Set\"].json[\"user\"]}} commented on [{{$node[\"Set\"].json[\"card\"]}}]({{$node[\"Get board/lists names2\"].json[\"url\"]}}): \n{{$node[\"Set\"].json[\"body\"][\"comment\"]}}","operation":"sendStream"},"credentials":{"zulipApi":{"id":"5","name":"W_Zulip account"}},"typeVersion":1},{"name":"checkedItem","type":"n8n-nodes-base.if","position":[920,20],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"body\"][\"description\"]}}","value2":"act-checkedItem"}]}},"typeVersion":1},{"name":"Get board/lists names3","type":"n8n-nodes-base.function","position":[1120,20],"parameters":{"functionCode":"// Check if doesn't start with + and then add it\n//var text = 'kaspar checked testitem2 of checklist \"Checklist\" at card \"Task4\" at list \"Todo\" at swimlane \"Default\" at board \"test\" https://boards.crewnew.com/b/k4JYtSBpG2WZyzEw7/test/EqwrdC67LPFGYi526';\nconst text = items[0].json.text;\nconst textArray = text.split(' ');\nvar item = textArray[2];\nconst textBrace = text.split('\"');\nvar board = textBrace[9];\nvar url = textBrace[10].substring(1);\n\n//Deliver result\nreturn [{\n  json: { \n    \"board_name\" : board, \n    \"item\" : item,\n    \"url\" : url \n  }\n}]"},"typeVersion":1},{"name":"Zulip3","type":"n8n-nodes-base.zulip","position":[1300,20],"parameters":{"topic":"board","stream":"={{$json[\"board_name\"]}}","content":"=@{{$node[\"Set\"].json[\"user\"]}} checked in checklist \"{{$json[\"item\"]}}\" on [{{$node[\"Set\"].json[\"card\"]}}]({{$node[\"Get board/lists names3\"].json[\"url\"]}})","operation":"sendStream"},"credentials":{"zulipApi":{"id":"5","name":"W_Zulip account"}},"typeVersion":1},{"name":"addChecklistItem","type":"n8n-nodes-base.if","position":[920,-140],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"body\"][\"description\"]}}","value2":"act-addChecklistItem"}]}},"typeVersion":1},{"name":"Get board/lists names4","type":"n8n-nodes-base.function","position":[1120,-140],"parameters":{"functionCode":"// Check if doesn't start with + and then add it\n//var text = 'kaspar added checklist item testitem4 to checklist \"Checklist\" at card \"Task4\" at list \"Todo\" at swimlane \"Default\" at board \"test\" https://boards.crewnew.com/b/k4JYtSBpG2WZyzEw7/test/EqwrdC67LPFGYi526';\nconst text = items[0].json.text;\nconst textArray = text.split(' ');\nvar item = textArray[4];\nconst textBrace = text.split('\"');\nvar board = textBrace[9];\nvar url = textBrace[10].substring(1);\n\n//Deliver result\nreturn [{\n  json: { \n    \"board_name\" : board, \n    \"item\" : item,\n    \"url\" : url \n  }\n}]"},"typeVersion":1},{"name":"Zulip4","type":"n8n-nodes-base.zulip","position":[1300,-140],"parameters":{"topic":"board","stream":"={{$json[\"board_name\"]}}","content":"=@{{$node[\"Set\"].json[\"user\"]}} added in checklist: \"{{$json[\"item\"]}}\" on [{{$node[\"Set\"].json[\"card\"]}}]({{$node[\"Get board/lists names4\"].json[\"url\"]}})","operation":"sendStream"},"credentials":{"zulipApi":{"id":"5","name":"W_Zulip account"}},"typeVersion":1},{"name":"uncheckedItem","type":"n8n-nodes-base.if","position":[920,-300],"parameters":{"conditions":{"string":[{"value1":"={{$json[\"body\"][\"description\"]}}","value2":"act-uncheckedItem"}]}},"typeVersion":1},{"name":"Get board/lists names5","type":"n8n-nodes-base.function","position":[1120,-300],"parameters":{"functionCode":"// Check if doesn't start with + and then add it\n//var text = 'kaspar unchecked testitem3 of checklist \"Checklist\" at card \"Task4\" at list \"Todo\" at swimlane \"Default\" at board \"test\" https://boards.crewnew.com/b/k4JYtSBpG2WZyzEw7/test/EqwrdC67LPFGYi526';\nconst text = items[0].json.text;\nconst textArray = text.split(' ');\nvar item = textArray[2];\nconst textBrace = text.split('\"');\nvar board = textBrace[9];\nvar url = textBrace[10].substring(1);\n\n//Deliver result\n\nreturn [{\n  json: { \n    \"board_name\" : board, \n    \"item\" : item,\n    \"url\" : url \n  }\n}]"},"typeVersion":1},{"name":"Zulip5","type":"n8n-nodes-base.zulip","position":[1300,-300],"parameters":{"topic":"board","stream":"={{$json[\"board_name\"]}}","content":"=@{{$node[\"Set\"].json[\"user\"]}} unchecked in checklist: \"{{$json[\"item\"]}}\" on [{{$node[\"Set\"].json[\"card\"]}}]({{$node[\"Get board/lists names5\"].json[\"url\"]}})","operation":"sendStream"},"credentials":{"zulipApi":{"id":"5","name":"W_Zulip account"}},"typeVersion":1},{"name":"Wekan","type":"n8n-nodes-base.wekan","position":[1320,180],"parameters":{"cardId":"={{$node[\"Set\"].json[\"cardId\"]}}","listId":"={{$node[\"Set\"].json[\"body\"][\"listId\"]}}","boardId":"={{$node[\"Set\"].json[\"boardId\"]}}","operation":"get"},"credentials":{"wekanApi":{"id":"30","name":"Wekan account"}},"typeVersion":1},{"name":"GraphQL","type":"n8n-nodes-base.graphql","position":[2200,80],"parameters":{"query":"=query GetZulipId {\n  external_ids(where: {value: {_eq: \"{{$node[\"Wekan\"].json[\"assignees\"][0]}}\"}}) {\n    user {\n      external_ids(where: {name: {_eq: \"zulip_id\"}}) {\n        value\n      }\n      username\n    }\n  }\n}","endpoint":"https://apps.crewnew.com/v1/graphql","requestFormat":"json","authentication":"headerAuth","allowUnauthorizedCerts":true},"credentials":{"httpHeaderAuth":{"id":"34","name":"Header Auth CN-Hasura"}},"typeVersion":1},{"name":"Zulip6","type":"n8n-nodes-base.zulip","position":[2160,280],"parameters":{"topic":"board","stream":"={{$node[\"Get board/lists names\"].json[\"board_name\"]}}","content":"=@{{$node[\"Set\"].json[\"user\"]}} moved [{{$node[\"Set\"].json[\"card\"]}}]({{$node[\"Get board/lists names\"].json[\"url\"]}}) from {{$node[\"Get board/lists names\"].json[\"from_list\"]}} to {{$node[\"Get board/lists names\"].json[\"to_list\"]}}","operation":"sendStream"},"credentials":{"zulipApi":{"id":"5","name":"W_Zulip account"}},"typeVersion":1},{"name":"Assignees amount","type":"n8n-nodes-base.function","position":[1540,180],"parameters":{"functionCode":"// Check if there are assignees\nconst assignees = items[0].json.assignees;\nvar length = assignees.length;\n\n//Deliver result\nreturn [{\n  json: { \n    \"assigneesAmount\" : length\n  }\n}]"},"typeVersion":1},{"name":"IF not 0 assignees","type":"n8n-nodes-base.if","position":[1780,180],"parameters":{"conditions":{"number":[{"value1":"={{$json[\"assigneesAmount\"]}}","operation":"notEqual"}]}},"typeVersion":1},{"name":"IF to the list Review","type":"n8n-nodes-base.if","position":[1980,80],"parameters":{"conditions":{"string":[{"value1":"={{$node[\"Get board/lists names\"].json[\"to_list\"]}}","value2":"YESTERDAY (Review)"},{"value1":"={{$node[\"Get board/lists names\"].json[\"to_list\"]}}","value2":"COMPLETE (Review)"}]},"combineOperation":"any"},"typeVersion":1}],"active":true,"settings":{},"connections":{"Set":{"main":[[{"node":"uncheckedItem","type":"main","index":0},{"node":"addChecklistItem","type":"main","index":0},{"node":"checkedItem","type":"main","index":0},{"node":"moveCard","type":"main","index":0},{"node":"createCard","type":"main","index":0},{"node":"addComment","type":"main","index":0}]]},"Wekan":{"main":[[{"node":"Assignees amount","type":"main","index":0}]]},"GraphQL":{"main":[[{"node":"Zulip","type":"main","index":0}]]},"moveCard":{"main":[[{"node":"Get board/lists names","type":"main","index":0}]]},"addComment":{"main":[[{"node":"Get board/lists names2","type":"main","index":0}]]},"createCard":{"main":[[{"node":"Get board/lists names1","type":"main","index":0}]]},"checkedItem":{"main":[[{"node":"Get board/lists names3","type":"main","index":0}]]},"Webhook Wekan":{"main":[[{"node":"Set","type":"main","index":0}]]},"uncheckedItem":{"main":[[{"node":"Get board/lists names5","type":"main","index":0}]]},"Assignees amount":{"main":[[{"node":"IF not 0 assignees","type":"main","index":0}]]},"addChecklistItem":{"main":[[{"node":"Get board/lists names4","type":"main","index":0}]]},"IF not 0 assignees":{"main":[[{"node":"IF to the list Review","type":"main","index":0}],[{"node":"Zulip6","type":"main","index":0}]]},"Get board/lists names":{"main":[[{"node":"Wekan","type":"main","index":0}]]},"IF to the list Review":{"main":[[{"node":"GraphQL","type":"main","index":0}],[{"node":"Zulip6","type":"main","index":0}]]},"Get board/lists names1":{"main":[[{"node":"Zulip1","type":"main","index":0}]]},"Get board/lists names2":{"main":[[{"node":"Zulip2","type":"main","index":0}]]},"Get board/lists names3":{"main":[[{"node":"Zulip3","type":"main","index":0}]]},"Get board/lists names4":{"main":[[{"node":"Zulip4","type":"main","index":0}]]},"Get board/lists names5":{"main":[[{"node":"Zulip5","type":"main","index":0}]]}}}