mirror of
https://github.com/AutoMaker-Org/automaker.git
synced 2026-02-02 08:33:36 +00:00
This commit fixes bidirectional data synchronization between Electron and Web modes by addressing multiple interconnected issues: **Core Fixes:** 1. **Electron userData Path (main.ts)** - Explicitly set userData path in development using app.setPath() - Navigate from __dirname to project root instead of relying on process.cwd() - Ensures Electron reads from /data instead of ~/.config/Automaker 2. **Server DataDir Path (main.ts, start-automaker.sh)** - Fixed startServer() to use __dirname for reliable path calculation - Export DATA_DIR environment variable in start-automaker.sh - Server now consistently uses shared /data directory 3. **Settings Sync Protection (settings-service.ts)** - Modified wipe protection to distinguish legitimate removals from accidents - Allow empty projects array if trashedProjects has items - Prevent false-positive wipe detection when removing projects 4. **Diagnostics & Logging** - Enhanced cache loading logging in use-settings-migration.ts - Detailed migration decision logs for troubleshooting - Track project counts from both cache and server **Impact:** - Projects created in Electron now appear in Web mode after restart - Projects removed in Web mode stay removed in Electron after restart - Settings changes sync bidirectionally across mode switches - No more data loss or project duplication issues **Testing:** - Verified Electron uses /home/dhanush/Projects/automaker/data - Confirmed server startup logs show correct DATA_DIR - Tested project persistence across mode restarts - Validated no writes to ~/.config/Automaker in dev mode Fixes: Data persistence between Electron and Web modes Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
94 lines
3.3 KiB
TypeScript
94 lines
3.3 KiB
TypeScript
/**
|
|
* PUT /api/settings/global - Update global user settings
|
|
*
|
|
* Accepts partial GlobalSettings update. Fields provided are merged into
|
|
* existing settings (not replaced). Returns updated settings.
|
|
*
|
|
* Request body: `Partial<GlobalSettings>`
|
|
* Response: `{ "success": true, "settings": GlobalSettings }`
|
|
*/
|
|
|
|
import type { Request, Response } from 'express';
|
|
import type { SettingsService } from '../../../services/settings-service.js';
|
|
import type { GlobalSettings } from '../../../types/settings.js';
|
|
import { getErrorMessage, logError, logger } from '../common.js';
|
|
import { setLogLevel, LogLevel } from '@automaker/utils';
|
|
import { setRequestLoggingEnabled } from '../../../index.js';
|
|
|
|
/**
|
|
* Map server log level string to LogLevel enum
|
|
*/
|
|
const LOG_LEVEL_MAP: Record<string, LogLevel> = {
|
|
error: LogLevel.ERROR,
|
|
warn: LogLevel.WARN,
|
|
info: LogLevel.INFO,
|
|
debug: LogLevel.DEBUG,
|
|
};
|
|
|
|
/**
|
|
* Create handler factory for PUT /api/settings/global
|
|
*
|
|
* @param settingsService - Instance of SettingsService for file I/O
|
|
* @returns Express request handler
|
|
*/
|
|
export function createUpdateGlobalHandler(settingsService: SettingsService) {
|
|
return async (req: Request, res: Response): Promise<void> => {
|
|
try {
|
|
const updates = req.body as Partial<GlobalSettings>;
|
|
|
|
if (!updates || typeof updates !== 'object') {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: 'Invalid request body - expected settings object',
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Minimal debug logging to help diagnose accidental wipes.
|
|
const projectsLen = Array.isArray((updates as any).projects)
|
|
? (updates as any).projects.length
|
|
: undefined;
|
|
const trashedLen = Array.isArray((updates as any).trashedProjects)
|
|
? (updates as any).trashedProjects.length
|
|
: undefined;
|
|
logger.info(
|
|
`[SERVER_SETTINGS_UPDATE] Request received: projects=${projectsLen ?? 'n/a'}, trashedProjects=${trashedLen ?? 'n/a'}, theme=${
|
|
(updates as any).theme ?? 'n/a'
|
|
}, localStorageMigrated=${(updates as any).localStorageMigrated ?? 'n/a'}`
|
|
);
|
|
|
|
logger.info('[SERVER_SETTINGS_UPDATE] Calling updateGlobalSettings...');
|
|
const settings = await settingsService.updateGlobalSettings(updates);
|
|
logger.info(
|
|
'[SERVER_SETTINGS_UPDATE] Update complete, projects count:',
|
|
settings.projects?.length ?? 0
|
|
);
|
|
|
|
// Apply server log level if it was updated
|
|
if ('serverLogLevel' in updates && updates.serverLogLevel) {
|
|
const level = LOG_LEVEL_MAP[updates.serverLogLevel];
|
|
if (level !== undefined) {
|
|
setLogLevel(level);
|
|
logger.info(`Server log level changed to: ${updates.serverLogLevel}`);
|
|
}
|
|
}
|
|
|
|
// Apply request logging setting if it was updated
|
|
if ('enableRequestLogging' in updates && typeof updates.enableRequestLogging === 'boolean') {
|
|
setRequestLoggingEnabled(updates.enableRequestLogging);
|
|
logger.info(
|
|
`HTTP request logging ${updates.enableRequestLogging ? 'enabled' : 'disabled'}`
|
|
);
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
settings,
|
|
});
|
|
} catch (error) {
|
|
logError(error, 'Update global settings failed');
|
|
res.status(500).json({ success: false, error: getErrorMessage(error) });
|
|
}
|
|
};
|
|
}
|