valley-commons/api/listmonk.js

79 lines
2.6 KiB
JavaScript

// Listmonk newsletter integration via direct PostgreSQL access
const { Pool } = require('pg');
const LISTMONK_LIST_ID = parseInt(process.env.LISTMONK_LIST_ID) || 24; // Valley of the Commons list
const listmonkPool = process.env.LISTMONK_DB_HOST ? new Pool({
host: process.env.LISTMONK_DB_HOST || 'listmonk-db',
port: parseInt(process.env.LISTMONK_DB_PORT) || 5432,
database: process.env.LISTMONK_DB_NAME || 'listmonk',
user: process.env.LISTMONK_DB_USER || 'listmonk',
password: process.env.LISTMONK_DB_PASS || '',
}) : null;
async function addToListmonk(email, name, attribs = {}) {
if (!listmonkPool) {
console.log('[Listmonk] Database not configured, skipping');
return false;
}
const client = await listmonkPool.connect();
try {
const mergeAttribs = {
votc: {
...attribs,
registeredAt: new Date().toISOString(),
}
};
// Check if subscriber exists
const existing = await client.query(
'SELECT id, attribs FROM subscribers WHERE email = $1',
[email]
);
let subscriberId;
if (existing.rows.length > 0) {
subscriberId = existing.rows[0].id;
const existingAttribs = existing.rows[0].attribs || {};
const merged = { ...existingAttribs, ...mergeAttribs };
await client.query(
'UPDATE subscribers SET name = $1, attribs = $2, updated_at = NOW() WHERE id = $3',
[name, JSON.stringify(merged), subscriberId]
);
console.log(`[Listmonk] Updated existing subscriber: ${email} (ID: ${subscriberId})`);
} else {
const result = await client.query(
`INSERT INTO subscribers (uuid, email, name, status, attribs, created_at, updated_at)
VALUES (gen_random_uuid(), $1, $2, 'enabled', $3, NOW(), NOW())
RETURNING id`,
[email, name, JSON.stringify(mergeAttribs)]
);
subscriberId = result.rows[0].id;
console.log(`[Listmonk] Created new subscriber: ${email} (ID: ${subscriberId})`);
}
// Add to VotC list
await client.query(
`INSERT INTO subscriber_lists (subscriber_id, list_id, status, created_at, updated_at)
VALUES ($1, $2, 'confirmed', NOW(), NOW())
ON CONFLICT (subscriber_id, list_id) DO UPDATE SET status = 'confirmed', updated_at = NOW()`,
[subscriberId, LISTMONK_LIST_ID]
);
console.log(`[Listmonk] Added to VotC list: ${email}`);
return true;
} catch (error) {
console.error('[Listmonk] Error:', error.message);
return false;
} finally {
client.release();
}
}
function isConfigured() {
return !!listmonkPool;
}
module.exports = { addToListmonk, isConfigured };