freealberta/map/app/controllers/listmonkController.js
2025-08-15 11:14:38 -06:00

253 lines
7.8 KiB
JavaScript

const listmonkService = require('../services/listmonk');
const nocodbService = require('../services/nocodb');
const logger = require('../utils/logger');
// Get Listmonk sync status
exports.getSyncStatus = async (req, res) => {
try {
const status = listmonkService.getSyncStatus();
// Also check connection if it's enabled
if (status.enabled && !status.connected) {
// Try to reconnect
const reconnected = await listmonkService.checkConnection();
status.connected = reconnected;
}
res.json(status);
} catch (error) {
logger.error('Failed to get Listmonk status', error);
res.status(500).json({
success: false,
error: 'Failed to get sync status'
});
}
};
// Bulk sync all locations to Listmonk
exports.syncAllLocations = async (req, res) => {
try {
if (!listmonkService.syncEnabled) {
return res.status(400).json({
success: false,
error: 'Listmonk sync is disabled'
});
}
const locationData = await nocodbService.getLocations();
const locations = locationData?.list || [];
if (!locations || locations.length === 0) {
return res.json({
success: true,
message: 'No locations to sync',
results: { total: 0, success: 0, failed: 0, errors: [] }
});
}
const results = await listmonkService.bulkSync(locations, 'location');
res.json({
success: true,
message: `Bulk location sync completed: ${results.success} succeeded, ${results.failed} failed`,
results
});
} catch (error) {
logger.error('Bulk location sync failed', error);
res.status(500).json({
success: false,
error: 'Failed to sync locations to Listmonk'
});
}
};
// Bulk sync all users to Listmonk
exports.syncAllUsers = async (req, res) => {
try {
if (!listmonkService.syncEnabled) {
return res.status(400).json({
success: false,
error: 'Listmonk sync is disabled'
});
}
const config = require('../config');
const userData = await nocodbService.getAllPaginated(config.nocodb.loginSheetId);
const users = userData?.list || [];
if (!users || users.length === 0) {
return res.json({
success: true,
message: 'No users to sync',
results: { total: 0, success: 0, failed: 0, errors: [] }
});
}
const results = await listmonkService.bulkSync(users, 'user');
res.json({
success: true,
message: `Bulk user sync completed: ${results.success} succeeded, ${results.failed} failed`,
results
});
} catch (error) {
logger.error('Bulk user sync failed', error);
res.status(500).json({
success: false,
error: 'Failed to sync users to Listmonk'
});
}
};
// Sync both locations and users
exports.syncAll = async (req, res) => {
try {
if (!listmonkService.syncEnabled) {
return res.status(400).json({
success: false,
error: 'Listmonk sync is disabled'
});
}
let results = {
locations: { total: 0, success: 0, failed: 0, errors: [] },
users: { total: 0, success: 0, failed: 0, errors: [] }
};
// Sync locations
try {
const locationData = await nocodbService.getLocations();
const locations = locationData?.list || [];
if (locations && locations.length > 0) {
results.locations = await listmonkService.bulkSync(locations, 'location');
}
} catch (error) {
logger.error('Failed to sync locations during full sync', error);
results.locations.errors.push({ error: error.message });
}
// Sync users
try {
const userData = await nocodbService.getAllPaginated(config.nocodb.loginSheetId);
const users = userData?.list || [];
if (users && users.length > 0) {
results.users = await listmonkService.bulkSync(users, 'user');
}
} catch (error) {
logger.error('Failed to sync users during full sync', error);
results.users.errors.push({ error: error.message });
}
const totalSuccess = results.locations.success + results.users.success;
const totalFailed = results.locations.failed + results.users.failed;
res.json({
success: true,
message: `Complete sync finished: ${totalSuccess} succeeded, ${totalFailed} failed`,
results
});
} catch (error) {
logger.error('Complete sync failed', error);
res.status(500).json({
success: false,
error: 'Failed to perform complete sync'
});
}
};
// Get Listmonk list statistics
exports.getListStats = async (req, res) => {
try {
if (!listmonkService.syncEnabled) {
return res.json({
success: false,
error: 'Listmonk sync is disabled',
stats: null
});
}
const stats = await listmonkService.getListStats();
// Convert stats object to array format for frontend
let statsArray = [];
if (stats && typeof stats === 'object') {
statsArray = Object.entries(stats).map(([key, list]) => ({
id: key,
name: list.name,
subscriberCount: list.subscriber_count || 0,
description: `Email list for ${key}`
}));
}
res.json({
success: true,
stats: statsArray
});
} catch (error) {
logger.error('Failed to get Listmonk list stats', error);
res.status(500).json({
success: false,
error: 'Failed to get list statistics'
});
}
};
// Test Listmonk connection
exports.testConnection = async (req, res) => {
try {
const connected = await listmonkService.checkConnection();
if (connected) {
res.json({
success: true,
message: 'Listmonk connection successful',
connected: true
});
} else {
res.json({
success: false,
message: listmonkService.lastError || 'Connection failed',
connected: false
});
}
} catch (error) {
logger.error('Failed to test Listmonk connection', error);
res.status(500).json({
success: false,
error: 'Failed to test connection'
});
}
};
// Reinitialize Listmonk lists
exports.reinitializeLists = async (req, res) => {
try {
if (!listmonkService.syncEnabled) {
return res.status(400).json({
success: false,
error: 'Listmonk sync is disabled'
});
}
const initialized = await listmonkService.initializeLists();
if (initialized) {
res.json({
success: true,
message: 'Listmonk lists reinitialized successfully'
});
} else {
res.json({
success: false,
message: listmonkService.lastError || 'Failed to initialize lists'
});
}
} catch (error) {
logger.error('Failed to reinitialize Listmonk lists', error);
res.status(500).json({
success: false,
error: 'Failed to reinitialize lists'
});
}
};