refactor: rename session_names table and related code to sessions for clarity and consistency

This commit is contained in:
Haileyesus
2026-04-22 13:43:16 +03:00
parent 295b8846a7
commit 2e326214e1
6 changed files with 47 additions and 24 deletions

View File

@@ -8,8 +8,8 @@ import {
USER_NOTIFICATION_PREFERENCES_TABLE_SQL,
VAPID_KEYS_TABLE_SQL,
PUSH_SUBSCRIPTIONS_TABLE_SQL,
SESSION_NAMES_TABLE_SQL,
SESSION_NAMES_LOOKUP_INDEX_SQL,
SESSIONS_TABLE_SQL,
SESSIONS_LOOKUP_INDEX_SQL,
DATABASE_SCHEMA_SQL
} from './schema.js';
@@ -109,8 +109,30 @@ const runMigrations = () => {
db.exec(VAPID_KEYS_TABLE_SQL);
db.exec(PUSH_SUBSCRIPTIONS_TABLE_SQL);
db.exec(APP_CONFIG_TABLE_SQL);
db.exec(SESSION_NAMES_TABLE_SQL);
db.exec(SESSION_NAMES_LOOKUP_INDEX_SQL);
const hasLegacySessionNamesTable = Boolean(
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');
} catch (error) {
@@ -479,11 +501,11 @@ const pushSubscriptionsDb = {
};
// Session custom names database operations
const sessionNamesDb = {
const sessionsDb = {
// Set (insert or update) a custom session name
setName: (sessionId, provider, customName) => {
db.prepare(`
INSERT INTO session_names (session_id, provider, custom_name)
INSERT INTO sessions (session_id, provider, custom_name)
VALUES (?, ?, ?)
ON CONFLICT(session_id, provider)
DO UPDATE SET custom_name = excluded.custom_name, updated_at = CURRENT_TIMESTAMP
@@ -493,7 +515,7 @@ const sessionNamesDb = {
// Get a single custom session name
getName: (sessionId, provider) => {
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);
return row?.custom_name || null;
},
@@ -503,7 +525,7 @@ const sessionNamesDb = {
if (!sessionIds.length) return new Map();
const placeholders = sessionIds.map(() => '?').join(',');
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 = ?`
).all(...sessionIds, provider);
return new Map(rows.map(r => [r.session_id, r.custom_name]));
@@ -512,7 +534,7 @@ const sessionNamesDb = {
// Delete a custom session name
deleteName: (sessionId, provider) => {
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;
},
};
@@ -522,7 +544,7 @@ function applyCustomSessionNames(sessions, provider) {
if (!sessions?.length) return;
try {
const ids = sessions.map(s => s.id);
const customNames = sessionNamesDb.getNames(ids, provider);
const customNames = sessionsDb.getNames(ids, provider);
for (const session of sessions) {
const custom = customNames.get(session.id);
if (custom) session.summary = custom;
@@ -586,7 +608,7 @@ export {
credentialsDb,
notificationPreferencesDb,
pushSubscriptionsDb,
sessionNamesDb,
sessionsDb,
applyCustomSessionNames,
appConfigDb,
githubTokensDb // Backward compatibility

View File

@@ -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
);`;
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,
session_id TEXT NOT NULL,
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)
);`;
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;
@@ -94,9 +94,9 @@ ${VAPID_KEYS_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}
`;

View File

@@ -50,7 +50,7 @@ import pluginsRoutes from './routes/plugins.js';
import messagesRoutes from './routes/messages.js';
import providerRoutes from './modules/providers/provider.routes.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 { validateApiKey, authenticateToken, authenticateWebSocket } from './middleware/auth.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;
console.log(`[API] Deleting session: ${sessionId} from project: ${projectName}`);
await deleteSession(projectName, sessionId);
sessionNamesDb.deleteName(sessionId, 'claude');
sessionsDb.deleteName(sessionId, 'claude');
console.log(`[API] Session ${sessionId} deleted successfully`);
res.json({ success: true });
} catch (error) {
@@ -483,7 +483,7 @@ app.put('/api/sessions/:sessionId/rename', authenticateToken, async (req, res) =
if (!provider || !VALID_PROVIDERS.includes(provider)) {
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 });
} catch (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
await setupProjectsWatcher();
// await getProjects(); // TODO: REMOVE THIS
// Start server-side plugin processes for enabled plugins
startEnabledPluginServers().catch(err => {
console.error('[Plugins] Error during startup:', err.message);

View File

@@ -1,6 +1,6 @@
import express from 'express';
import { deleteCodexSession } from '../projects.js';
import { sessionNamesDb } from '../database/db.js';
import { sessionsDb } from '../database/db.js';
const router = express.Router();
@@ -8,7 +8,7 @@ router.delete('/sessions/:sessionId', async (req, res) => {
try {
const { sessionId } = req.params;
await deleteCodexSession(sessionId);
sessionNamesDb.deleteName(sessionId, 'codex');
sessionsDb.deleteName(sessionId, 'codex');
res.json({ success: true });
} catch (error) {
console.error(`Error deleting Codex session ${req.params.sessionId}:`, error);

View File

@@ -1,6 +1,6 @@
import express from 'express';
import sessionManager from '../sessionManager.js';
import { sessionNamesDb } from '../database/db.js';
import { sessionsDb } from '../database/db.js';
const router = express.Router();
@@ -13,7 +13,7 @@ router.delete('/sessions/:sessionId', async (req, res) => {
}
await sessionManager.deleteSession(sessionId);
sessionNamesDb.deleteName(sessionId, 'gemini');
sessionsDb.deleteName(sessionId, 'gemini');
res.json({ success: true });
} catch (error) {
console.error(`Error deleting Gemini session ${req.params.sessionId}:`, error);

View File

@@ -1,5 +1,5 @@
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 = {
action_required: 'actionRequired',
@@ -107,7 +107,7 @@ function resolveSessionName(event) {
return null;
}
return normalizeSessionName(sessionNamesDb.getName(event.sessionId, event.provider));
return normalizeSessionName(sessionsDb.getName(event.sessionId, event.provider));
}
function buildPushBody(event) {