mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-03-10 08:27:40 +00:00
124 lines
3.9 KiB
JavaScript
124 lines
3.9 KiB
JavaScript
import express from 'express';
|
|
import { userDb } from '../database/db.js';
|
|
import { authenticateToken } from '../middleware/auth.js';
|
|
import { getSystemGitConfig } from '../utils/gitConfig.js';
|
|
import { spawn } from 'child_process';
|
|
|
|
const router = express.Router();
|
|
|
|
function spawnAsync(command, args, options = {}) {
|
|
return new Promise((resolve, reject) => {
|
|
const child = spawn(command, args, { ...options, shell: false });
|
|
let stdout = '';
|
|
let stderr = '';
|
|
child.stdout.on('data', (data) => { stdout += data.toString(); });
|
|
child.stderr.on('data', (data) => { stderr += data.toString(); });
|
|
child.on('error', (error) => { reject(error); });
|
|
child.on('close', (code) => {
|
|
if (code === 0) { resolve({ stdout, stderr }); return; }
|
|
const error = new Error(`Command failed: ${command} ${args.join(' ')}`);
|
|
error.code = code;
|
|
error.stdout = stdout;
|
|
error.stderr = stderr;
|
|
reject(error);
|
|
});
|
|
});
|
|
}
|
|
|
|
router.get('/git-config', authenticateToken, async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
let gitConfig = userDb.getGitConfig(userId);
|
|
|
|
// If database is empty, try to get from system git config
|
|
if (!gitConfig || (!gitConfig.git_name && !gitConfig.git_email)) {
|
|
const systemConfig = await getSystemGitConfig();
|
|
|
|
// If system has values, save them to database for this user
|
|
if (systemConfig.git_name || systemConfig.git_email) {
|
|
userDb.updateGitConfig(userId, systemConfig.git_name, systemConfig.git_email);
|
|
gitConfig = systemConfig;
|
|
console.log(`Auto-populated git config from system for user ${userId}: ${systemConfig.git_name} <${systemConfig.git_email}>`);
|
|
}
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
gitName: gitConfig?.git_name || null,
|
|
gitEmail: gitConfig?.git_email || null
|
|
});
|
|
} catch (error) {
|
|
console.error('Error getting git config:', error);
|
|
res.status(500).json({ error: 'Failed to get git configuration' });
|
|
}
|
|
});
|
|
|
|
// Apply git config globally via git config --global
|
|
router.post('/git-config', authenticateToken, async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
const { gitName, gitEmail } = req.body;
|
|
|
|
if (!gitName || !gitEmail) {
|
|
return res.status(400).json({ error: 'Git name and email are required' });
|
|
}
|
|
|
|
// Validate email format
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
if (!emailRegex.test(gitEmail)) {
|
|
return res.status(400).json({ error: 'Invalid email format' });
|
|
}
|
|
|
|
userDb.updateGitConfig(userId, gitName, gitEmail);
|
|
|
|
try {
|
|
await spawnAsync('git', ['config', '--global', 'user.name', gitName]);
|
|
await spawnAsync('git', ['config', '--global', 'user.email', gitEmail]);
|
|
console.log(`Applied git config globally: ${gitName} <${gitEmail}>`);
|
|
} catch (gitError) {
|
|
console.error('Error applying git config:', gitError);
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
gitName,
|
|
gitEmail
|
|
});
|
|
} catch (error) {
|
|
console.error('Error updating git config:', error);
|
|
res.status(500).json({ error: 'Failed to update git configuration' });
|
|
}
|
|
});
|
|
|
|
router.post('/complete-onboarding', authenticateToken, async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
userDb.completeOnboarding(userId);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Onboarding completed successfully'
|
|
});
|
|
} catch (error) {
|
|
console.error('Error completing onboarding:', error);
|
|
res.status(500).json({ error: 'Failed to complete onboarding' });
|
|
}
|
|
});
|
|
|
|
router.get('/onboarding-status', authenticateToken, async (req, res) => {
|
|
try {
|
|
const userId = req.user.id;
|
|
const hasCompleted = userDb.hasCompletedOnboarding(userId);
|
|
|
|
res.json({
|
|
success: true,
|
|
hasCompletedOnboarding: hasCompleted
|
|
});
|
|
} catch (error) {
|
|
console.error('Error checking onboarding status:', error);
|
|
res.status(500).json({ error: 'Failed to check onboarding status' });
|
|
}
|
|
});
|
|
|
|
export default router;
|