fix: resolve database connection error for analytics settings
Mirror to GitHub / mirror (push) Successful in 20s
Test and Lint / backend-test (push) Successful in 1m10s
continuous-integration/drone/push Build is passing
Test and Lint / frontend-test (push) Successful in 2m23s
Version and Release / version-bump (push) Successful in 32s
Version and Release / trigger-drone (push) Successful in 3s
Mirror to GitHub / mirror (push) Successful in 20s
Test and Lint / backend-test (push) Successful in 1m10s
continuous-integration/drone/push Build is passing
Test and Lint / frontend-test (push) Successful in 2m23s
Version and Release / version-bump (push) Successful in 32s
Version and Release / trigger-drone (push) Successful in 3s
- Update publicSettings.js to handle missing analytics setting_type gracefully - Add dedicated PUT /analytics endpoint for saving analytics settings - Update frontend settings service to route to correct endpoints based on setting type - Fix query to use WHERE clause that won't fail if analytics type doesn't exist This fixes the "Connection terminated unexpectedly" error when fetching public settings with analytics configuration. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
This commit is contained in:
@@ -496,6 +496,43 @@ router.put('/security', adminAuth, async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Update analytics settings
|
||||||
|
router.put('/analytics', adminAuth, async (req, res) => {
|
||||||
|
try {
|
||||||
|
const settings = req.body;
|
||||||
|
|
||||||
|
// Update or insert each setting
|
||||||
|
for (const [key, value] of Object.entries(settings)) {
|
||||||
|
await db('app_settings')
|
||||||
|
.insert({
|
||||||
|
setting_key: key,
|
||||||
|
setting_value: JSON.stringify(value),
|
||||||
|
setting_type: 'analytics',
|
||||||
|
updated_at: new Date()
|
||||||
|
})
|
||||||
|
.onConflict('setting_key')
|
||||||
|
.merge({
|
||||||
|
setting_value: JSON.stringify(value),
|
||||||
|
updated_at: new Date()
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log activity
|
||||||
|
await db('activity_logs').insert({
|
||||||
|
activity_type: 'analytics_settings_updated',
|
||||||
|
actor_type: 'admin',
|
||||||
|
actor_id: req.admin.id,
|
||||||
|
actor_name: req.admin.username,
|
||||||
|
metadata: JSON.stringify({ settings_count: Object.keys(settings).length })
|
||||||
|
});
|
||||||
|
|
||||||
|
res.json({ message: 'Analytics settings updated successfully' });
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Analytics settings update error:', error);
|
||||||
|
res.status(500).json({ error: 'Failed to update analytics settings' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Get storage info
|
// Get storage info
|
||||||
router.get('/storage/info', adminAuth, async (req, res) => {
|
router.get('/storage/info', adminAuth, async (req, res) => {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -5,9 +5,13 @@ const router = express.Router();
|
|||||||
// Get public settings (branding and theme)
|
// Get public settings (branding and theme)
|
||||||
router.get('/', async (req, res) => {
|
router.get('/', async (req, res) => {
|
||||||
try {
|
try {
|
||||||
// Fetch branding, theme, general, security, and analytics settings
|
// Fetch branding, theme, general, and security settings
|
||||||
|
// Note: We include analytics in the query but it might not exist yet
|
||||||
const settings = await db('app_settings')
|
const settings = await db('app_settings')
|
||||||
.whereIn('setting_type', ['branding', 'theme', 'general', 'security', 'analytics'])
|
.where(function() {
|
||||||
|
this.whereIn('setting_type', ['branding', 'theme', 'general', 'security', 'analytics'])
|
||||||
|
.orWhere('setting_key', 'like', 'analytics_%');
|
||||||
|
})
|
||||||
.select('setting_key', 'setting_value');
|
.select('setting_key', 'setting_value');
|
||||||
|
|
||||||
// Convert to object format
|
// Convert to object format
|
||||||
@@ -44,9 +48,9 @@ router.get('/', async (req, res) => {
|
|||||||
maintenance_mode: settingsObject.general_maintenance_mode === true || settingsObject.general_maintenance_mode === 'true',
|
maintenance_mode: settingsObject.general_maintenance_mode === true || settingsObject.general_maintenance_mode === 'true',
|
||||||
// Umami analytics configuration (only if enabled)
|
// Umami analytics configuration (only if enabled)
|
||||||
umami_enabled: settingsObject.analytics_umami_enabled === true || settingsObject.analytics_umami_enabled === 'true',
|
umami_enabled: settingsObject.analytics_umami_enabled === true || settingsObject.analytics_umami_enabled === 'true',
|
||||||
umami_url: settingsObject.analytics_umami_enabled ? (settingsObject.analytics_umami_url || null) : null,
|
umami_url: (settingsObject.analytics_umami_enabled === true || settingsObject.analytics_umami_enabled === 'true') ? (settingsObject.analytics_umami_url || null) : null,
|
||||||
umami_website_id: settingsObject.analytics_umami_enabled ? (settingsObject.analytics_umami_website_id || null) : null,
|
umami_website_id: (settingsObject.analytics_umami_enabled === true || settingsObject.analytics_umami_enabled === 'true') ? (settingsObject.analytics_umami_website_id || null) : null,
|
||||||
umami_share_url: settingsObject.analytics_umami_enabled ? (settingsObject.analytics_umami_share_url || null) : null
|
umami_share_url: (settingsObject.analytics_umami_enabled === true || settingsObject.analytics_umami_enabled === 'true') ? (settingsObject.analytics_umami_share_url || null) : null
|
||||||
};
|
};
|
||||||
|
|
||||||
res.json(publicSettings);
|
res.json(publicSettings);
|
||||||
|
|||||||
@@ -162,7 +162,19 @@ export const settingsService = {
|
|||||||
|
|
||||||
// Update multiple settings at once
|
// Update multiple settings at once
|
||||||
async updateSettings(settings: Record<string, any>): Promise<void> {
|
async updateSettings(settings: Record<string, any>): Promise<void> {
|
||||||
await api.put('/admin/settings/general', settings);
|
// Determine the endpoint based on setting keys
|
||||||
|
const firstKey = Object.keys(settings)[0];
|
||||||
|
let endpoint = '/admin/settings/general';
|
||||||
|
|
||||||
|
if (firstKey?.startsWith('security_')) {
|
||||||
|
endpoint = '/admin/settings/security';
|
||||||
|
} else if (firstKey?.startsWith('analytics_')) {
|
||||||
|
endpoint = '/admin/settings/analytics';
|
||||||
|
} else if (firstKey?.startsWith('branding_')) {
|
||||||
|
endpoint = '/admin/settings/branding';
|
||||||
|
}
|
||||||
|
|
||||||
|
await api.put(endpoint, settings);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Get storage information
|
// Get storage information
|
||||||
|
|||||||
Reference in New Issue
Block a user