79 lines
2.6 KiB
JavaScript
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 };
|