mirror of
https://github.com/hellodigua/ChatLab.git
synced 2026-10-25 17:54:34 +08:00
feat: migrate localStorage to backend storage with declarative persist plugin
- Add backendPersist Pinia plugin for declarative preferences.json persistence - Move Preferences types to @openchatlab/shared-types (single source of truth) - Migrate sessionGapThreshold from localStorage to config.toml [ui] - Migrate chatlab_filter_history from localStorage to preferences.json - Fix stale localStorage locale read in i18n/index.ts - Simplify usePreferencesSync (172 → 75 lines) by delegating to plugin Adding a new backend-synced preference now only requires 3 changes: 1. shared-types interface 2. node-runtime DEFAULTS 3. store backendPersist.pick
This commit is contained in:
1 parent
05394c2155
commit
08260499f8
37 files changed
+857
-196
No files matched your search
@@ -25,6 +25,7 @@ import { registerSessionRoutes } from './routes/sessions'
|
||||
import { registerWebRoutes } from './routes/web'
|
||||
import { registerNlpRoutes } from './routes/nlp'
|
||||
import { registerAiRoutes } from './routes/ai'
|
||||
import { registerPreferencesRoutes } from './routes/preferences'
|
||||
import { initServerAiLogger, closeServerAiLogger } from '../ai/logger'
|
||||
import { initSync, cleanupSync } from '../sync'
|
||||
|
||||
@@ -133,6 +134,7 @@ export async function startHttpServer(options?: HttpServerOptions): Promise<{
|
||||
registerNlpRoutes(server, dbManager)
|
||||
registerAiRoutes(server, dbManager, convManager)
|
||||
registerWebRoutes(server, dbManager, { pathProvider, nativeBinding })
|
||||
registerPreferencesRoutes(server, pathProvider)
|
||||
|
||||
initSync(server, dbManager, pathProvider, { port, host, token })
|
||||
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* Preferences HTTP routes — /_web/preferences/*
|
||||
*
|
||||
* Read/write preferences.json and config.toml [ui] section for Web UI.
|
||||
*/
|
||||
|
||||
import type { FastifyInstance } from 'fastify'
|
||||
import { PreferencesManager, type Preferences } from '@openchatlab/node-runtime'
|
||||
import { loadConfig, writeConfigField, type UiConfig } from '@openchatlab/config'
|
||||
import type { PathProvider } from '@openchatlab/core'
|
||||
|
||||
let prefManager: PreferencesManager | null = null
|
||||
|
||||
export function registerPreferencesRoutes(server: FastifyInstance, pathProvider: PathProvider): void {
|
||||
if (!prefManager) {
|
||||
prefManager = new PreferencesManager(pathProvider.getSystemDir())
|
||||
}
|
||||
|
||||
server.get('/_web/preferences', async () => {
|
||||
return prefManager!.load()
|
||||
})
|
||||
|
||||
server.patch<{ Body: Partial<Preferences> }>('/_web/preferences', async (request) => {
|
||||
return prefManager!.save(request.body)
|
||||
})
|
||||
|
||||
server.get('/_web/preferences/ui-config', async () => {
|
||||
const config = loadConfig()
|
||||
return config.ui
|
||||
})
|
||||
|
||||
server.patch<{ Body: Partial<UiConfig> }>('/_web/preferences/ui-config', async (request) => {
|
||||
try {
|
||||
for (const [key, value] of Object.entries(request.body)) {
|
||||
if (value !== undefined) {
|
||||
writeConfigField('ui', key, value as string | number)
|
||||
}
|
||||
}
|
||||
return { success: true }
|
||||
} catch (err) {
|
||||
return { success: false, error: err instanceof Error ? err.message : String(err) }
|
||||
}
|
||||
})
|
||||
|
||||
server.get('/_web/preferences/locale', async () => {
|
||||
const config = loadConfig()
|
||||
return { lang: config.locale.lang }
|
||||
})
|
||||
|
||||
server.patch<{ Body: { lang: string } }>('/_web/preferences/locale', async (request) => {
|
||||
try {
|
||||
writeConfigField('locale', 'lang', request.body.lang)
|
||||
return { success: true }
|
||||
} catch (err) {
|
||||
return { success: false, error: err instanceof Error ? err.message : String(err) }
|
||||
}
|
||||
})
|
||||
}
|
||||
Reference in new issue
Block a user