{"updatedAt":"2026-04-24T17:43:30.300Z","createdAt":"2026-04-24T17:43:30.300Z","id":"sICXeSTizkSr8Pnu","name":"Approvals — Telegram Callback Handler (GAL-109)","description":null,"active":true,"isArchived":false,"nodes":[{"id":"tg-webhook","name":"Telegram Webhook","type":"n8n-nodes-base.webhook","typeVersion":2,"position":[240,300],"parameters":{"httpMethod":"POST","path":"telegram-approvals-callback","responseMode":"onReceived","responseCode":200,"responseData":"noData","options":{}},"webhookId":"f6c65289-495e-449f-aba7-216dff939113"},{"id":"is-callback","name":"Is Callback Query?","type":"n8n-nodes-base.if","typeVersion":2.2,"position":[440,300],"parameters":{"conditions":{"options":{"caseSensitive":true,"typeValidation":"loose"},"conditions":[{"id":"e4b9c581-7d11-4188-9206-978baf185a29","leftValue":"={{ !!($json.body && $json.body.callback_query && $json.body.callback_query.data) }}","rightValue":true,"operator":{"type":"boolean","operation":"true"}}],"combinator":"and"}}},{"id":"parse","name":"Parse Callback","type":"n8n-nodes-base.set","typeVersion":3.4,"position":[640,300],"parameters":{"mode":"manual","assignments":{"assignments":[{"id":"f7f9c4c1-24cd-433a-a78a-2a857b64ac0a","name":"action","value":"={{ ($json.body.callback_query.data || '').split(':')[0] }}","type":"string"},{"id":"b9e206da-90ac-468c-b3bf-e12f7ec71477","name":"row_id","value":"={{ ($json.body.callback_query.data || '').split(':').slice(1).join(':') }}","type":"string"},{"id":"979d8e16-9e22-450a-bef2-4cb48fdb5bcd","name":"callback_query_id","value":"={{ $json.body.callback_query.id }}","type":"string"},{"id":"7db59e21-105e-4b38-a120-e8c956840289","name":"chat_id","value":"={{ $json.body.callback_query.message.chat.id }}","type":"string"},{"id":"76986127-8b1c-4654-b198-4403a89d729f","name":"message_id","value":"={{ $json.body.callback_query.message.message_id }}","type":"number"},{"id":"45cc1f29-7b82-4da4-9379-91a11216afbc","name":"approver","value":"={{ $json.body.callback_query.from.username || $json.body.callback_query.from.first_name }}","type":"string"},{"id":"bbcf2b9b-91b6-4360-a340-9ddf4fc71a1f","name":"new_status","value":"={{ $json.body.callback_query.data.startsWith('approve:') ? 'approved' : 'rejected' }}","type":"string"}]}}},{"id":"update-row","name":"Update Row Status","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[840,300],"parameters":{"method":"PATCH","url":"=https://jiidzeympaalzljyqvjq.supabase.co/rest/v1/approval_requests?id=eq.{{ $json.row_id }}&status=eq.pending","authentication":"none","sendHeaders":true,"headerParameters":{"parameters":[{"name":"apikey","value":"={{ $env.SB_LSA_PRO_SR }}"},{"name":"Authorization","value":"=Bearer {{ $env.SB_LSA_PRO_SR }}"},{"name":"Content-Profile","value":"ops"},{"name":"Content-Type","value":"application/json"},{"name":"Prefer","value":"return=representation"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"status","value":"={{ $json.new_status }}"},{"name":"approver","value":"={{ $json.approver }}"},{"name":"resolved_at","value":"={{ new Date().toISOString() }}"}]},"options":{"response":{"response":{"neverError":true,"responseFormat":"json"}}}}},{"id":"answer-cbq","name":"Answer Callback Query","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1040,200],"parameters":{"method":"POST","url":"=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN_OPS }}/answerCallbackQuery","authentication":"none","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"sendBody":true,"specifyBody":"json","jsonBody":"={{ JSON.stringify({callback_query_id: $('Parse Callback').item.json.callback_query_id, text: `Marked as ${$('Parse Callback').item.json.new_status}`, show_alert: false}) }}","options":{}}},{"id":"edit-msg","name":"Edit Message","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1040,400],"parameters":{"method":"POST","url":"=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN_OPS }}/editMessageText","authentication":"none","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"sendBody":true,"specifyBody":"json","jsonBody":"={{ JSON.stringify({chat_id: $('Parse Callback').item.json.chat_id, message_id: $('Parse Callback').item.json.message_id, text: $('Telegram Webhook').item.json.body.callback_query.message.text + `\\n\\n${$('Parse Callback').item.json.new_status === 'approved' ? '\\u2705 APPROVED' : '\\u274c REJECTED'} by ${$('Parse Callback').item.json.approver} at ${new Date().toISOString()}`}) }}","options":{}}}],"connections":{"Telegram Webhook":{"main":[[{"node":"Is Callback Query?","type":"main","index":0}]]},"Is Callback Query?":{"main":[[{"node":"Parse Callback","type":"main","index":0}],[]]},"Parse Callback":{"main":[[{"node":"Update Row Status","type":"main","index":0}]]},"Update Row Status":{"main":[[{"node":"Answer Callback Query","type":"main","index":0},{"node":"Edit Message","type":"main","index":0}]]}},"settings":{"executionOrder":"v1","saveExecutionProgress":true,"callerPolicy":"workflowsFromSameOwner","availableInMCP":false},"staticData":null,"meta":null,"pinData":null,"versionId":"3c1bfcb1-af5d-4925-b56f-bd4057bb958e","activeVersionId":"3c1bfcb1-af5d-4925-b56f-bd4057bb958e","versionCounter":3,"triggerCount":1,"shared":[{"updatedAt":"2026-04-24T17:43:30.304Z","createdAt":"2026-04-24T17:43:30.304Z","role":"workflow:owner","workflowId":"sICXeSTizkSr8Pnu","projectId":"WMTxW1hBsgAEIsg6","project":{"updatedAt":"2026-02-16T08:56:00.695Z","createdAt":"2026-02-16T07:50:49.259Z","id":"WMTxW1hBsgAEIsg6","name":"Joao Galhardo <jgalhardo.pt@gmail.com>","type":"personal","icon":null,"description":null,"creatorId":"0487392a-ff85-4881-beb2-1ef86afbe010"}}],"tags":[],"activeVersion":{"updatedAt":"2026-04-24T17:43:30.310Z","createdAt":"2026-04-24T17:43:30.310Z","versionId":"3c1bfcb1-af5d-4925-b56f-bd4057bb958e","workflowId":"sICXeSTizkSr8Pnu","nodes":[{"id":"tg-webhook","name":"Telegram Webhook","type":"n8n-nodes-base.webhook","typeVersion":2,"position":[240,300],"parameters":{"httpMethod":"POST","path":"telegram-approvals-callback","responseMode":"onReceived","responseCode":200,"responseData":"noData","options":{}},"webhookId":"f6c65289-495e-449f-aba7-216dff939113"},{"id":"is-callback","name":"Is Callback Query?","type":"n8n-nodes-base.if","typeVersion":2.2,"position":[440,300],"parameters":{"conditions":{"options":{"caseSensitive":true,"typeValidation":"loose"},"conditions":[{"id":"e4b9c581-7d11-4188-9206-978baf185a29","leftValue":"={{ !!($json.body && $json.body.callback_query && $json.body.callback_query.data) }}","rightValue":true,"operator":{"type":"boolean","operation":"true"}}],"combinator":"and"}}},{"id":"parse","name":"Parse Callback","type":"n8n-nodes-base.set","typeVersion":3.4,"position":[640,300],"parameters":{"mode":"manual","assignments":{"assignments":[{"id":"f7f9c4c1-24cd-433a-a78a-2a857b64ac0a","name":"action","value":"={{ ($json.body.callback_query.data || '').split(':')[0] }}","type":"string"},{"id":"b9e206da-90ac-468c-b3bf-e12f7ec71477","name":"row_id","value":"={{ ($json.body.callback_query.data || '').split(':').slice(1).join(':') }}","type":"string"},{"id":"979d8e16-9e22-450a-bef2-4cb48fdb5bcd","name":"callback_query_id","value":"={{ $json.body.callback_query.id }}","type":"string"},{"id":"7db59e21-105e-4b38-a120-e8c956840289","name":"chat_id","value":"={{ $json.body.callback_query.message.chat.id }}","type":"string"},{"id":"76986127-8b1c-4654-b198-4403a89d729f","name":"message_id","value":"={{ $json.body.callback_query.message.message_id }}","type":"number"},{"id":"45cc1f29-7b82-4da4-9379-91a11216afbc","name":"approver","value":"={{ $json.body.callback_query.from.username || $json.body.callback_query.from.first_name }}","type":"string"},{"id":"bbcf2b9b-91b6-4360-a340-9ddf4fc71a1f","name":"new_status","value":"={{ $json.body.callback_query.data.startsWith('approve:') ? 'approved' : 'rejected' }}","type":"string"}]}}},{"id":"update-row","name":"Update Row Status","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[840,300],"parameters":{"method":"PATCH","url":"=https://jiidzeympaalzljyqvjq.supabase.co/rest/v1/approval_requests?id=eq.{{ $json.row_id }}&status=eq.pending","authentication":"none","sendHeaders":true,"headerParameters":{"parameters":[{"name":"apikey","value":"={{ $env.SB_LSA_PRO_SR }}"},{"name":"Authorization","value":"=Bearer {{ $env.SB_LSA_PRO_SR }}"},{"name":"Content-Profile","value":"ops"},{"name":"Content-Type","value":"application/json"},{"name":"Prefer","value":"return=representation"}]},"sendBody":true,"bodyParameters":{"parameters":[{"name":"status","value":"={{ $json.new_status }}"},{"name":"approver","value":"={{ $json.approver }}"},{"name":"resolved_at","value":"={{ new Date().toISOString() }}"}]},"options":{"response":{"response":{"neverError":true,"responseFormat":"json"}}}}},{"id":"answer-cbq","name":"Answer Callback Query","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1040,200],"parameters":{"method":"POST","url":"=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN_OPS }}/answerCallbackQuery","authentication":"none","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"sendBody":true,"specifyBody":"json","jsonBody":"={{ JSON.stringify({callback_query_id: $('Parse Callback').item.json.callback_query_id, text: `Marked as ${$('Parse Callback').item.json.new_status}`, show_alert: false}) }}","options":{}}},{"id":"edit-msg","name":"Edit Message","type":"n8n-nodes-base.httpRequest","typeVersion":4.2,"position":[1040,400],"parameters":{"method":"POST","url":"=https://api.telegram.org/bot{{ $env.TELEGRAM_BOT_TOKEN_OPS }}/editMessageText","authentication":"none","sendHeaders":true,"headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"sendBody":true,"specifyBody":"json","jsonBody":"={{ JSON.stringify({chat_id: $('Parse Callback').item.json.chat_id, message_id: $('Parse Callback').item.json.message_id, text: $('Telegram Webhook').item.json.body.callback_query.message.text + `\\n\\n${$('Parse Callback').item.json.new_status === 'approved' ? '\\u2705 APPROVED' : '\\u274c REJECTED'} by ${$('Parse Callback').item.json.approver} at ${new Date().toISOString()}`}) }}","options":{}}}],"connections":{"Telegram Webhook":{"main":[[{"node":"Is Callback Query?","type":"main","index":0}]]},"Is Callback Query?":{"main":[[{"node":"Parse Callback","type":"main","index":0}],[]]},"Parse Callback":{"main":[[{"node":"Update Row Status","type":"main","index":0}]]},"Update Row Status":{"main":[[{"node":"Answer Callback Query","type":"main","index":0},{"node":"Edit Message","type":"main","index":0}]]}},"authors":"Joao Galhardo","name":null,"description":null,"autosaved":false,"workflowPublishHistory":[{"createdAt":"2026-04-24T17:43:30.399Z","id":105,"workflowId":"sICXeSTizkSr8Pnu","versionId":"3c1bfcb1-af5d-4925-b56f-bd4057bb958e","event":"activated","userId":"0487392a-ff85-4881-beb2-1ef86afbe010"}]}}