import { env } from '@/lib/env'; export class N8nService { private webhookUrl: string; private rollbackWebhookUrl: string; constructor() { // Use consistent webhook URLs without -test suffix this.webhookUrl = process.env.N8N_WEBHOOK_URL || 'https://brain.slm-lab.net/webhook/mission-created'; this.rollbackWebhookUrl = process.env.N8N_ROLLBACK_WEBHOOK_URL || 'https://brain.slm-lab.net/webhook/mission-rollback'; } async triggerMissionCreation(data: any): Promise { try { console.log('Triggering n8n workflow with data:', JSON.stringify(data, null, 2)); console.log('Using webhook URL:', this.webhookUrl); const response = await fetch(this.webhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const result = await response.json(); console.log('Received response from n8n:', JSON.stringify(result, null, 2)); // Handle different response formats if (typeof result === 'string') { console.warn('Received string response from n8n:', result); return { success: false, error: 'Invalid response format from n8n', results: { leantimeProjectId: null, outlineCollectionId: null, rocketChatChannelId: null, giteaRepositoryUrl: null } }; } // Extract results from the response const integrationResults = result.results || result; console.log('Integration results:', JSON.stringify(integrationResults, null, 2)); return { success: true, results: { leantimeProjectId: integrationResults.leantimeProjectId?.toString() || null, outlineCollectionId: integrationResults.outlineCollectionId?.toString() || null, rocketChatChannelId: integrationResults.rocketChatChannelId?.toString() || null, giteaRepositoryUrl: integrationResults.giteaRepositoryUrl || null } }; } catch (error) { console.error('Error triggering n8n workflow:', error); return { success: false, error: error instanceof Error ? error.message : 'Unknown error', results: { leantimeProjectId: null, outlineCollectionId: null, rocketChatChannelId: null, giteaRepositoryUrl: null } }; } } async triggerMissionRollback(data: any): Promise { try { console.log('Triggering n8n rollback workflow with data:', JSON.stringify(data, null, 2)); console.log('Using rollback webhook URL:', this.rollbackWebhookUrl); const response = await fetch(this.rollbackWebhookUrl, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const result = await response.json(); console.log('Received response from n8n rollback:', JSON.stringify(result, null, 2)); return { success: true, results: result }; } catch (error) { console.error('Error triggering n8n rollback workflow:', error); return { success: false, error: error instanceof Error ? error.message : 'Unknown error' }; } } }