mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-06-28 23:35:27 +08:00
refactor: rename session_names table and related code to sessions for clarity and consistency
This commit is contained in:
@@ -8,8 +8,8 @@ import {
|
|||||||
USER_NOTIFICATION_PREFERENCES_TABLE_SQL,
|
USER_NOTIFICATION_PREFERENCES_TABLE_SQL,
|
||||||
VAPID_KEYS_TABLE_SQL,
|
VAPID_KEYS_TABLE_SQL,
|
||||||
PUSH_SUBSCRIPTIONS_TABLE_SQL,
|
PUSH_SUBSCRIPTIONS_TABLE_SQL,
|
||||||
SESSION_NAMES_TABLE_SQL,
|
SESSIONS_TABLE_SQL,
|
||||||
SESSION_NAMES_LOOKUP_INDEX_SQL,
|
SESSIONS_LOOKUP_INDEX_SQL,
|
||||||
DATABASE_SCHEMA_SQL
|
DATABASE_SCHEMA_SQL
|
||||||
} from './schema.js';
|
} from './schema.js';
|
||||||
|
|
||||||
@@ -109,8 +109,30 @@ const runMigrations = () => {
|
|||||||
db.exec(VAPID_KEYS_TABLE_SQL);
|
db.exec(VAPID_KEYS_TABLE_SQL);
|
||||||
db.exec(PUSH_SUBSCRIPTIONS_TABLE_SQL);
|
db.exec(PUSH_SUBSCRIPTIONS_TABLE_SQL);
|
||||||
db.exec(APP_CONFIG_TABLE_SQL);
|
db.exec(APP_CONFIG_TABLE_SQL);
|
||||||
db.exec(SESSION_NAMES_TABLE_SQL);
|
const hasLegacySessionNamesTable = Boolean(
|
||||||
db.exec(SESSION_NAMES_LOOKUP_INDEX_SQL);
|
db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get('session_names')
|
||||||
|
);
|
||||||
|
const hasSessionsTable = Boolean(
|
||||||
|
db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get('sessions')
|
||||||
|
);
|
||||||
|
|
||||||
|
if (hasLegacySessionNamesTable && hasSessionsTable) {
|
||||||
|
console.log('Running migration: Merging session_names into sessions');
|
||||||
|
db.exec(`
|
||||||
|
INSERT OR REPLACE INTO sessions (session_id, provider, custom_name, created_at, updated_at)
|
||||||
|
SELECT session_id, provider, custom_name, created_at, updated_at
|
||||||
|
FROM session_names
|
||||||
|
`);
|
||||||
|
db.exec('DROP TABLE session_names');
|
||||||
|
} else if (hasLegacySessionNamesTable && !hasSessionsTable) {
|
||||||
|
console.log('Running migration: Renaming session_names table to sessions');
|
||||||
|
db.exec('ALTER TABLE session_names RENAME TO sessions');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove legacy index name if present and ensure the new index exists.
|
||||||
|
db.exec('DROP INDEX IF EXISTS idx_session_names_lookup');
|
||||||
|
db.exec(SESSIONS_TABLE_SQL);
|
||||||
|
db.exec(SESSIONS_LOOKUP_INDEX_SQL);
|
||||||
|
|
||||||
console.log('Database migrations completed successfully');
|
console.log('Database migrations completed successfully');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -479,11 +501,11 @@ const pushSubscriptionsDb = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Session custom names database operations
|
// Session custom names database operations
|
||||||
const sessionNamesDb = {
|
const sessionsDb = {
|
||||||
// Set (insert or update) a custom session name
|
// Set (insert or update) a custom session name
|
||||||
setName: (sessionId, provider, customName) => {
|
setName: (sessionId, provider, customName) => {
|
||||||
db.prepare(`
|
db.prepare(`
|
||||||
INSERT INTO session_names (session_id, provider, custom_name)
|
INSERT INTO sessions (session_id, provider, custom_name)
|
||||||
VALUES (?, ?, ?)
|
VALUES (?, ?, ?)
|
||||||
ON CONFLICT(session_id, provider)
|
ON CONFLICT(session_id, provider)
|
||||||
DO UPDATE SET custom_name = excluded.custom_name, updated_at = CURRENT_TIMESTAMP
|
DO UPDATE SET custom_name = excluded.custom_name, updated_at = CURRENT_TIMESTAMP
|
||||||
@@ -493,7 +515,7 @@ const sessionNamesDb = {
|
|||||||
// Get a single custom session name
|
// Get a single custom session name
|
||||||
getName: (sessionId, provider) => {
|
getName: (sessionId, provider) => {
|
||||||
const row = db.prepare(
|
const row = db.prepare(
|
||||||
'SELECT custom_name FROM session_names WHERE session_id = ? AND provider = ?'
|
'SELECT custom_name FROM sessions WHERE session_id = ? AND provider = ?'
|
||||||
).get(sessionId, provider);
|
).get(sessionId, provider);
|
||||||
return row?.custom_name || null;
|
return row?.custom_name || null;
|
||||||
},
|
},
|
||||||
@@ -503,7 +525,7 @@ const sessionNamesDb = {
|
|||||||
if (!sessionIds.length) return new Map();
|
if (!sessionIds.length) return new Map();
|
||||||
const placeholders = sessionIds.map(() => '?').join(',');
|
const placeholders = sessionIds.map(() => '?').join(',');
|
||||||
const rows = db.prepare(
|
const rows = db.prepare(
|
||||||
`SELECT session_id, custom_name FROM session_names
|
`SELECT session_id, custom_name FROM sessions
|
||||||
WHERE session_id IN (${placeholders}) AND provider = ?`
|
WHERE session_id IN (${placeholders}) AND provider = ?`
|
||||||
).all(...sessionIds, provider);
|
).all(...sessionIds, provider);
|
||||||
return new Map(rows.map(r => [r.session_id, r.custom_name]));
|
return new Map(rows.map(r => [r.session_id, r.custom_name]));
|
||||||
@@ -512,7 +534,7 @@ const sessionNamesDb = {
|
|||||||
// Delete a custom session name
|
// Delete a custom session name
|
||||||
deleteName: (sessionId, provider) => {
|
deleteName: (sessionId, provider) => {
|
||||||
return db.prepare(
|
return db.prepare(
|
||||||
'DELETE FROM session_names WHERE session_id = ? AND provider = ?'
|
'DELETE FROM sessions WHERE session_id = ? AND provider = ?'
|
||||||
).run(sessionId, provider).changes > 0;
|
).run(sessionId, provider).changes > 0;
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
@@ -522,7 +544,7 @@ function applyCustomSessionNames(sessions, provider) {
|
|||||||
if (!sessions?.length) return;
|
if (!sessions?.length) return;
|
||||||
try {
|
try {
|
||||||
const ids = sessions.map(s => s.id);
|
const ids = sessions.map(s => s.id);
|
||||||
const customNames = sessionNamesDb.getNames(ids, provider);
|
const customNames = sessionsDb.getNames(ids, provider);
|
||||||
for (const session of sessions) {
|
for (const session of sessions) {
|
||||||
const custom = customNames.get(session.id);
|
const custom = customNames.get(session.id);
|
||||||
if (custom) session.summary = custom;
|
if (custom) session.summary = custom;
|
||||||
@@ -586,7 +608,7 @@ export {
|
|||||||
credentialsDb,
|
credentialsDb,
|
||||||
notificationPreferencesDb,
|
notificationPreferencesDb,
|
||||||
pushSubscriptionsDb,
|
pushSubscriptionsDb,
|
||||||
sessionNamesDb,
|
sessionsDb,
|
||||||
applyCustomSessionNames,
|
applyCustomSessionNames,
|
||||||
appConfigDb,
|
appConfigDb,
|
||||||
githubTokensDb // Backward compatibility
|
githubTokensDb // Backward compatibility
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ export const PUSH_SUBSCRIPTIONS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS push_sub
|
|||||||
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
|
||||||
);`;
|
);`;
|
||||||
|
|
||||||
export const SESSION_NAMES_TABLE_SQL = `CREATE TABLE IF NOT EXISTS session_names (
|
export const SESSIONS_TABLE_SQL = `CREATE TABLE IF NOT EXISTS sessions (
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
session_id TEXT NOT NULL,
|
session_id TEXT NOT NULL,
|
||||||
provider TEXT NOT NULL DEFAULT 'claude',
|
provider TEXT NOT NULL DEFAULT 'claude',
|
||||||
@@ -38,7 +38,7 @@ export const SESSION_NAMES_TABLE_SQL = `CREATE TABLE IF NOT EXISTS session_names
|
|||||||
UNIQUE(session_id, provider)
|
UNIQUE(session_id, provider)
|
||||||
);`;
|
);`;
|
||||||
|
|
||||||
export const SESSION_NAMES_LOOKUP_INDEX_SQL = `CREATE INDEX IF NOT EXISTS idx_session_names_lookup ON session_names(session_id, provider);`;
|
export const SESSIONS_LOOKUP_INDEX_SQL = `CREATE INDEX IF NOT EXISTS idx_sessions_lookup ON sessions(session_id, provider);`;
|
||||||
|
|
||||||
export const DATABASE_SCHEMA_SQL = `PRAGMA foreign_keys = ON;
|
export const DATABASE_SCHEMA_SQL = `PRAGMA foreign_keys = ON;
|
||||||
|
|
||||||
@@ -94,9 +94,9 @@ ${VAPID_KEYS_TABLE_SQL}
|
|||||||
|
|
||||||
${PUSH_SUBSCRIPTIONS_TABLE_SQL}
|
${PUSH_SUBSCRIPTIONS_TABLE_SQL}
|
||||||
|
|
||||||
${SESSION_NAMES_TABLE_SQL}
|
${SESSIONS_TABLE_SQL}
|
||||||
|
|
||||||
${SESSION_NAMES_LOOKUP_INDEX_SQL}
|
${SESSIONS_LOOKUP_INDEX_SQL}
|
||||||
|
|
||||||
${APP_CONFIG_TABLE_SQL}
|
${APP_CONFIG_TABLE_SQL}
|
||||||
`;
|
`;
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ import pluginsRoutes from './routes/plugins.js';
|
|||||||
import messagesRoutes from './routes/messages.js';
|
import messagesRoutes from './routes/messages.js';
|
||||||
import providerRoutes from './modules/providers/provider.routes.js';
|
import providerRoutes from './modules/providers/provider.routes.js';
|
||||||
import { startEnabledPluginServers, stopAllPlugins, getPluginPort } from './utils/plugin-process-manager.js';
|
import { startEnabledPluginServers, stopAllPlugins, getPluginPort } from './utils/plugin-process-manager.js';
|
||||||
import { initializeDatabase, sessionNamesDb, applyCustomSessionNames } from './database/db.js';
|
import { initializeDatabase, sessionsDb, applyCustomSessionNames } from './database/db.js';
|
||||||
import { configureWebPush } from './services/vapid-keys.js';
|
import { configureWebPush } from './services/vapid-keys.js';
|
||||||
import { validateApiKey, authenticateToken, authenticateWebSocket } from './middleware/auth.js';
|
import { validateApiKey, authenticateToken, authenticateWebSocket } from './middleware/auth.js';
|
||||||
import { IS_PLATFORM } from './constants/config.js';
|
import { IS_PLATFORM } from './constants/config.js';
|
||||||
@@ -456,7 +456,7 @@ app.delete('/api/projects/:projectName/sessions/:sessionId', authenticateToken,
|
|||||||
const { projectName, sessionId } = req.params;
|
const { projectName, sessionId } = req.params;
|
||||||
console.log(`[API] Deleting session: ${sessionId} from project: ${projectName}`);
|
console.log(`[API] Deleting session: ${sessionId} from project: ${projectName}`);
|
||||||
await deleteSession(projectName, sessionId);
|
await deleteSession(projectName, sessionId);
|
||||||
sessionNamesDb.deleteName(sessionId, 'claude');
|
sessionsDb.deleteName(sessionId, 'claude');
|
||||||
console.log(`[API] Session ${sessionId} deleted successfully`);
|
console.log(`[API] Session ${sessionId} deleted successfully`);
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -483,7 +483,7 @@ app.put('/api/sessions/:sessionId/rename', authenticateToken, async (req, res) =
|
|||||||
if (!provider || !VALID_PROVIDERS.includes(provider)) {
|
if (!provider || !VALID_PROVIDERS.includes(provider)) {
|
||||||
return res.status(400).json({ error: `Provider must be one of: ${VALID_PROVIDERS.join(', ')}` });
|
return res.status(400).json({ error: `Provider must be one of: ${VALID_PROVIDERS.join(', ')}` });
|
||||||
}
|
}
|
||||||
sessionNamesDb.setName(safeSessionId, provider, summary.trim());
|
sessionsDb.setName(safeSessionId, provider, summary.trim());
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`[API] Error renaming session ${req.params.sessionId}:`, error);
|
console.error(`[API] Error renaming session ${req.params.sessionId}:`, error);
|
||||||
@@ -2345,6 +2345,7 @@ async function startServer() {
|
|||||||
// Start watching the projects folder for changes
|
// Start watching the projects folder for changes
|
||||||
await setupProjectsWatcher();
|
await setupProjectsWatcher();
|
||||||
|
|
||||||
|
// await getProjects(); // TODO: REMOVE THIS
|
||||||
// Start server-side plugin processes for enabled plugins
|
// Start server-side plugin processes for enabled plugins
|
||||||
startEnabledPluginServers().catch(err => {
|
startEnabledPluginServers().catch(err => {
|
||||||
console.error('[Plugins] Error during startup:', err.message);
|
console.error('[Plugins] Error during startup:', err.message);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import { deleteCodexSession } from '../projects.js';
|
import { deleteCodexSession } from '../projects.js';
|
||||||
import { sessionNamesDb } from '../database/db.js';
|
import { sessionsDb } from '../database/db.js';
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ router.delete('/sessions/:sessionId', async (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const { sessionId } = req.params;
|
const { sessionId } = req.params;
|
||||||
await deleteCodexSession(sessionId);
|
await deleteCodexSession(sessionId);
|
||||||
sessionNamesDb.deleteName(sessionId, 'codex');
|
sessionsDb.deleteName(sessionId, 'codex');
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error deleting Codex session ${req.params.sessionId}:`, error);
|
console.error(`Error deleting Codex session ${req.params.sessionId}:`, error);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import express from 'express';
|
import express from 'express';
|
||||||
import sessionManager from '../sessionManager.js';
|
import sessionManager from '../sessionManager.js';
|
||||||
import { sessionNamesDb } from '../database/db.js';
|
import { sessionsDb } from '../database/db.js';
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
@@ -13,7 +13,7 @@ router.delete('/sessions/:sessionId', async (req, res) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
await sessionManager.deleteSession(sessionId);
|
await sessionManager.deleteSession(sessionId);
|
||||||
sessionNamesDb.deleteName(sessionId, 'gemini');
|
sessionsDb.deleteName(sessionId, 'gemini');
|
||||||
res.json({ success: true });
|
res.json({ success: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error(`Error deleting Gemini session ${req.params.sessionId}:`, error);
|
console.error(`Error deleting Gemini session ${req.params.sessionId}:`, error);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import webPush from 'web-push';
|
import webPush from 'web-push';
|
||||||
import { notificationPreferencesDb, pushSubscriptionsDb, sessionNamesDb } from '../database/db.js';
|
import { notificationPreferencesDb, pushSubscriptionsDb, sessionsDb } from '../database/db.js';
|
||||||
|
|
||||||
const KIND_TO_PREF_KEY = {
|
const KIND_TO_PREF_KEY = {
|
||||||
action_required: 'actionRequired',
|
action_required: 'actionRequired',
|
||||||
@@ -107,7 +107,7 @@ function resolveSessionName(event) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return normalizeSessionName(sessionNamesDb.getName(event.sessionId, event.provider));
|
return normalizeSessionName(sessionsDb.getName(event.sessionId, event.provider));
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildPushBody(event) {
|
function buildPushBody(event) {
|
||||||
|
|||||||
Reference in New Issue
Block a user