diff --git a/influence/app/controllers/campaigns.js b/influence/app/controllers/campaigns.js index 8848819..0efe3f6 100644 --- a/influence/app/controllers/campaigns.js +++ b/influence/app/controllers/campaigns.js @@ -11,7 +11,7 @@ class CampaignsController { // Get email counts for each campaign and normalize data structure const campaignsWithCounts = await Promise.all(campaigns.map(async (campaign) => { - const id = campaign.Id ?? campaign.id; + const id = campaign.ID || campaign.Id || campaign.id; let emailCount = 0; if (id != null) { emailCount = await nocoDB.getCampaignEmailCount(id); @@ -66,7 +66,13 @@ class CampaignsController { }); } - const normalizedId = campaign.Id ?? campaign.id ?? id; + // Debug logging + console.log('Campaign object keys:', Object.keys(campaign)); + console.log('Campaign ID field:', campaign.ID, campaign.Id, campaign.id); + + const normalizedId = campaign.ID || campaign.Id || campaign.id; + console.log('Using normalized ID:', normalizedId); + const emailCount = await nocoDB.getCampaignEmailCount(normalizedId); // Normalize campaign data structure for frontend @@ -136,7 +142,7 @@ class CampaignsController { res.json({ success: true, campaign: { - id: campaign.Id || campaign.id, + id: campaign.ID || campaign.Id || campaign.id, slug: campaign['Campaign Slug'] || campaign.slug, title: campaign['Campaign Title'] || campaign.title, description: campaign['Description'] || campaign.description, @@ -219,7 +225,7 @@ class CampaignsController { res.status(201).json({ success: true, campaign: { - id: campaign.Id ?? campaign.id, + id: campaign.ID || campaign.Id || campaign.id, slug: campaign['Campaign Slug'] || campaign.slug, title: campaign['Campaign Title'] || campaign.title, description: campaign['Description'] || campaign.description, @@ -259,7 +265,7 @@ class CampaignsController { // Ensure slug is unique (but allow current campaign to keep its slug) const existingCampaign = await nocoDB.getCampaignBySlug(slug); - const existingId = existingCampaign ? (existingCampaign.Id || existingCampaign.id) : null; + const existingId = existingCampaign ? (existingCampaign.ID || existingCampaign.Id || existingCampaign.id) : null; if (existingCampaign && String(existingId) !== String(id)) { let counter = 1; let originalSlug = slug; @@ -288,7 +294,7 @@ class CampaignsController { res.json({ success: true, campaign: { - id: campaign.Id ?? campaign.id ?? id, + id: campaign.ID || campaign.Id || campaign.id, slug: campaign['Campaign Slug'] || campaign.slug, title: campaign['Campaign Title'] || campaign.title, description: campaign['Description'] || campaign.description, @@ -361,8 +367,10 @@ class CampaignsController { error: 'Campaign not found' }); } + - if (campaign.status !== 'active') { + + if ((campaign['Status'] || campaign.status) !== 'active') { return res.status(403).json({ success: false, error: 'Campaign is not currently active' @@ -370,22 +378,22 @@ class CampaignsController { } // Check if the requested email method is allowed - if (emailMethod === 'smtp' && !campaign.allow_smtp_email) { + if (emailMethod === 'smtp' && !(campaign['Allow SMTP Email'] || campaign.allow_smtp_email)) { return res.status(403).json({ success: false, error: 'SMTP email sending is not enabled for this campaign' }); } - if (emailMethod === 'mailto' && !campaign.allow_mailto_link) { + if (emailMethod === 'mailto' && !(campaign['Allow Mailto Link'] || campaign.allow_mailto_link)) { return res.status(403).json({ success: false, error: 'Mailto links are not enabled for this campaign' }); } - const subject = campaign.email_subject; - const message = campaign.email_body; + const subject = campaign['Email Subject'] || campaign.email_subject; + const message = campaign['Email Body'] || campaign.email_body; let emailResult = { success: true }; @@ -403,14 +411,14 @@ class CampaignsController { html: `

${message.replace(/\n/g, '
')}


-

This message was sent via the Alberta Influence Campaign Tool by ${userName || 'A constituent'} (${userEmail}) from postal code ${postalCode} as part of the "${campaign.title}" campaign.

+

This message was sent via the BNKops Influence Campaign Tool by ${userName || 'A constituent'} (${userEmail}) from postal code ${postalCode} as part of the "${campaign['Campaign Title'] || campaign.title}" campaign.

` }); } // Log the campaign email await nocoDB.logCampaignEmail({ - campaign_id: campaign.Id ?? campaign.id, + campaign_id: campaign.ID || campaign.Id || campaign.id, campaign_slug: slug, user_email: userEmail, user_name: userName, @@ -422,8 +430,7 @@ class CampaignsController { email_method: emailMethod, subject: subject, message: message, - status: emailMethod === 'mailto' ? 'clicked' : (emailResult.success ? 'sent' : 'failed'), - timestamp: new Date().toISOString() + status: emailMethod === 'mailto' ? 'clicked' : (emailResult.success ? 'sent' : 'failed') }); if (emailMethod === 'smtp') { @@ -458,6 +465,62 @@ class CampaignsController { } } + // Track user info when they find representatives + async trackUserInfo(req, res, next) { + try { + const { slug } = req.params; + const { userEmail, userName, postalCode } = req.body; + + // Get campaign + const campaign = await nocoDB.getCampaignBySlug(slug); + if (!campaign) { + return res.status(404).json({ + success: false, + error: 'Campaign not found' + }); + } + + const campaignStatus = campaign['Status'] || campaign.status; + if (campaignStatus !== 'active') { + return res.status(403).json({ + success: false, + error: 'Campaign is not currently active' + }); + } + + // Log user interaction - finding representatives + await nocoDB.logCampaignEmail({ + campaign_id: campaign.ID || campaign.Id || campaign.id, + campaign_slug: slug, + user_email: userEmail || '', + user_name: userName || '', + user_postal_code: postalCode, + recipient_email: '', + recipient_name: '', + recipient_title: '', + recipient_level: 'Other', + email_method: 'smtp', // Use valid option but distinguish by status + subject: 'User Info Capture', + message: 'User searched for representatives', + status: 'user_info_captured' + }); + + res.json({ + success: true, + message: 'User info tracked successfully' + }); + + } catch (error) { + console.error('Track user info error:', error); + res.status(500).json({ + success: false, + error: 'Failed to track user info', + message: error.message, + details: error.response?.data || null + }); + } + } + // Get representatives for postal code (for campaign use) async getRepresentativesForCampaign(req, res, next) { try { diff --git a/influence/app/public/admin.html b/influence/app/public/admin.html index 4c8268d..fca4970 100644 --- a/influence/app/public/admin.html +++ b/influence/app/public/admin.html @@ -3,7 +3,7 @@ - Admin Panel - Alberta Influence Campaign Tool + Admin Panel - BNKops Influence Campaign Tool