UNPKG

n8n-nodes-canva

Version:

Node customizado do n8n para integração com Canva Connect APIs

255 lines 18.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.CanvaTrigger = void 0; class CanvaTrigger { constructor() { this.description = { displayName: 'Canva Trigger', name: 'canvaTrigger', icon: 'file:logo.svg', group: ['trigger'], version: 1, subtitle: '={{$parameter["event"]}}', description: 'Recebe notificações webhook do Canva em tempo real', defaults: { name: 'Canva Trigger', }, inputs: [], outputs: ['main'], credentials: [ { name: 'canvaApi', required: true, }, ], webhooks: [ { name: 'default', httpMethod: 'POST', responseMode: 'onReceived', path: 'canva-webhook', }, ], properties: [ { displayName: 'Event', name: 'event', type: 'options', options: [ { name: 'Comment Notification', value: 'comment', description: 'Eventos relacionados a comentários em designs', }, { name: 'Design Access Request', value: 'design_access_request', description: 'Solicitações de acesso a designs', }, { name: 'Design Approval', value: 'design_approval', description: 'Aprovações de designs', }, { name: 'Design Sharing Event', value: 'design_sharing', description: 'Eventos de compartilhamento de designs', }, { name: 'Folder Access Request', value: 'folder_access_request', description: 'Solicitações de acesso a pastas', }, { name: 'Folder Sharing Event', value: 'folder_sharing', description: 'Eventos de compartilhamento de pastas', }, { name: 'Team Access Invitation', value: 'team_access_invitation', description: 'Convites de acesso à equipe', }, { name: 'Suggestion Notification (Preview)', value: 'suggestion', description: '⚠️ Preview: Notificações de sugestões em Canva Docs', }, { name: 'Design Mention Notification (Preview)', value: 'design_mention', description: '⚠️ Preview: Menções em designs', }, ], default: 'comment', description: 'Tipo de evento do Canva que acionará o webhook', }, { displayName: 'Design ID Filter', name: 'designIdFilter', type: 'string', displayOptions: { show: { event: [ 'design.publish', 'design.share', 'design.update', 'comment.create', 'comment.resolve', 'export.complete', 'export.failed', ], }, }, default: '', description: 'Filtrar por ID específico do design (opcional)', }, { displayName: 'Folder ID Filter', name: 'folderIdFilter', type: 'string', displayOptions: { show: { event: [ 'folder.access_requested', 'folder.share', ], }, }, default: '', description: 'Filtrar por ID específico da pasta (opcional)', }, { displayName: 'User ID Filter', name: 'userIdFilter', type: 'string', displayOptions: { show: { event: [ 'user.mention', 'comment.create', 'suggestion.create', ], }, }, default: '', description: 'Filtrar por ID específico do usuário (opcional)', }, { displayName: 'Validate Signature', name: 'validateSignature', type: 'boolean', default: true, description: 'Whether validar assinatura HMAC do webhook para segurança', }, { displayName: 'Webhook Secret', name: 'webhookSecret', type: 'string', typeOptions: { password: true }, displayOptions: { show: { validateSignature: [true], }, }, default: '', description: 'Segredo compartilhado para validação HMAC do webhook', }, ], }; } async webhook() { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o; const event = this.getNodeParameter('event'); const designIdFilter = this.getNodeParameter('designIdFilter', ''); const folderIdFilter = this.getNodeParameter('folderIdFilter', ''); const userIdFilter = this.getNodeParameter('userIdFilter', ''); const validateSignature = this.getNodeParameter('validateSignature', true); const webhookSecret = this.getNodeParameter('webhookSecret', ''); const body = this.getBodyData(); const headers = this.getHeaderData(); // Validação da assinatura HMAC se habilitada if (validateSignature && webhookSecret) { const crypto = require('crypto'); const signature = headers['x-canva-signature']; if (!signature) { console.log('Webhook rejeitado: Assinatura ausente'); return { noWebhookResponse: true, }; } const expectedSignature = crypto .createHmac('sha256', webhookSecret) .update(JSON.stringify(body)) .digest('hex'); if (!crypto.timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expectedSignature, 'hex'))) { console.log('Webhook rejeitado: Assinatura inválida'); return { noWebhookResponse: true, }; } } // Verificar se é o evento esperado if (body.event_type !== event) { return { noWebhookResponse: true, }; } // Aplicar filtros específicos baseados no tipo de evento let shouldProcess = true; // Filtros para eventos de design if (designIdFilter && ['design.publish', 'design.share', 'design.update', 'comment.create', 'comment.resolve', 'export.complete', 'export.failed'].includes(event)) { const designId = ((_b = (_a = body.data) === null || _a === void 0 ? void 0 : _a.design) === null || _b === void 0 ? void 0 : _b.id) || ((_c = body.data) === null || _c === void 0 ? void 0 : _c.design_id); shouldProcess = designId === designIdFilter; } // Filtros para eventos de pasta if (folderIdFilter && ['folder.access_requested', 'folder.share'].includes(event)) { const folderId = ((_e = (_d = body.data) === null || _d === void 0 ? void 0 : _d.folder) === null || _e === void 0 ? void 0 : _e.id) || ((_f = body.data) === null || _f === void 0 ? void 0 : _f.folder_id); shouldProcess = folderId === folderIdFilter; } // Filtros para eventos de usuário if (userIdFilter && ['user.mention', 'comment.create', 'suggestion.create'].includes(event)) { const userId = ((_h = (_g = body.data) === null || _g === void 0 ? void 0 : _g.user) === null || _h === void 0 ? void 0 : _h.id) || ((_k = (_j = body.data) === null || _j === void 0 ? void 0 : _j.mentioned_user) === null || _k === void 0 ? void 0 : _k.id) || ((_o = (_m = (_l = body.data) === null || _l === void 0 ? void 0 : _l.comment) === null || _m === void 0 ? void 0 : _m.author) === null || _o === void 0 ? void 0 : _o.id); shouldProcess = userId === userIdFilter; } if (!shouldProcess) { return { noWebhookResponse: true, }; } // Enriquecer dados do webhook com informações úteis const webhookData = { event_type: body.event_type, event_id: body.event_id, timestamp: body.timestamp, created_at: body.created_at, data: body.data, metadata: { webhook_url: this.getNodeWebhookUrl('default'), processed_at: new Date().toISOString(), filters_applied: { event, design_id_filter: designIdFilter || null, folder_id_filter: folderIdFilter || null, user_id_filter: userIdFilter || null, }, }, }; return { webhookResponse: { status: 200, body: { received: true }, }, workflowData: [ [ { json: webhookData, }, ], ], }; } } exports.CanvaTrigger = CanvaTrigger; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FudmFUcmlnZ2VyLm5vZGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9ub2Rlcy9DYW52YS9DYW52YVRyaWdnZXIubm9kZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSxNQUFhLFlBQVk7SUFBekI7UUFDQyxnQkFBVyxHQUF5QjtZQUNuQyxXQUFXLEVBQUUsZUFBZTtZQUM1QixJQUFJLEVBQUUsY0FBYztZQUNwQixJQUFJLEVBQUUsZUFBZTtZQUNyQixLQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDbEIsT0FBTyxFQUFFLENBQUM7WUFDVixRQUFRLEVBQUUsMEJBQTBCO1lBQ3BDLFdBQVcsRUFBRSxvREFBb0Q7WUFDakUsUUFBUSxFQUFFO2dCQUNULElBQUksRUFBRSxlQUFlO2FBQ3JCO1lBQ0QsTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDakIsV0FBVyxFQUFFO2dCQUNaO29CQUNDLElBQUksRUFBRSxVQUFVO29CQUNoQixRQUFRLEVBQUUsSUFBSTtpQkFDZDthQUNEO1lBQ0QsUUFBUSxFQUFFO2dCQUNUO29CQUNDLElBQUksRUFBRSxTQUFTO29CQUNmLFVBQVUsRUFBRSxNQUFNO29CQUNsQixZQUFZLEVBQUUsWUFBWTtvQkFDMUIsSUFBSSxFQUFFLGVBQWU7aUJBQ3JCO2FBQ0Q7WUFDRCxVQUFVLEVBQUU7Z0JBQ1g7b0JBQ0MsV0FBVyxFQUFFLE9BQU87b0JBQ3BCLElBQUksRUFBRSxPQUFPO29CQUNiLElBQUksRUFBRSxTQUFTO29CQUNmLE9BQU8sRUFBRTt3QkFDUjs0QkFDQyxJQUFJLEVBQUUsc0JBQXNCOzRCQUM1QixLQUFLLEVBQUUsU0FBUzs0QkFDaEIsV0FBVyxFQUFFLCtDQUErQzt5QkFDNUQ7d0JBQ0Q7NEJBQ0MsSUFBSSxFQUFFLHVCQUF1Qjs0QkFDN0IsS0FBSyxFQUFFLHVCQUF1Qjs0QkFDOUIsV0FBVyxFQUFFLGtDQUFrQzt5QkFDL0M7d0JBQ0Q7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