From 11d79fc61108265c6fe65f1e444a5e4ff345dd39 Mon Sep 17 00:00:00 2001 From: John Livingston Date: Wed, 2 Jun 2021 19:16:27 +0200 Subject: [PATCH] Migration script in prevision of the future settings "chat-type". --- server/lib/migration/settings.ts | 88 ++++++++++++++++++++++++++++++++ server/lib/settings.ts | 9 +++- server/main.ts | 3 ++ 3 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 server/lib/migration/settings.ts diff --git a/server/lib/migration/settings.ts b/server/lib/migration/settings.ts new file mode 100644 index 00000000..10378955 --- /dev/null +++ b/server/lib/migration/settings.ts @@ -0,0 +1,88 @@ +import { pluginShortName } from '../helpers' +import type { ChatType } from '../settings' + +async function _migrateChatTypeSetting (options: RegisterServerOptions): Promise { + const peertubeHelpers = options.peertubeHelpers + const logger = peertubeHelpers.logger + // Previous to plugin v3.0.0, there was multiple checkbox and input-text for settings the plugin mode. + // With Peertube v2.3.0, we can replace all these settings with a single select. + // This function migrates old values if needed. + // NB: we cant use safely settingsManager.getSetting, because settings are not registered yet. + logger.info('Checking if we need to migrate chat-type') + if (!/^[-a-z]+$/.test(pluginShortName)) { + // to prevent sql injection... be sure there is no special char here. + throw new Error(`Wrong pluginShortName '${pluginShortName}'`) + } + const [results] = await peertubeHelpers.database.query( + 'SELECT "settings" FROM "plugin"' + + ' WHERE "plugin"."name" = :pluginShortName', + { + replacements: { + pluginShortName + } + } + ) + if (!Array.isArray(results)) { + throw new Error('_migrateChatTypeSetting: query result is not an array.') + } + if (results.length === 0) { + logger.error('Plugin not found in database') + return + } + if (results.length > 1) { + logger.error('Multiple lines for plugin in database, dont know which one to migrate... Aborting.') + return + } + const settings = results[0].settings + if (!settings) { + logger.info('Plugin settings are empty in database, no migration needed.') + return + } + if (typeof settings !== 'object') { + logger.error('Plugin settings in database seems to be invalid json') + return + } + if ('chat-type' in settings) { + logger.info('The setting chat-type is already here, no need to migrate.') + return + } + + logger.info('The setting chat-type is not here, checking if we have to migrate from previous settings...') + let chatType: ChatType | undefined + if (settings['chat-use-prosody'] === true) { + chatType = 'builtin-prosody' + } else if (settings['chat-use-builtin'] === true) { + chatType = 'builtin-converse' + } else if (((settings['chat-uri'] || '') as string) !== '') { + chatType = 'external-uri' + } else { + logger.info('It seems there was no previous active chat configuration.') + return + } + + logger.info(`We have to set chat-type to value '${chatType}'.`) + // eslint-disable-next-line @typescript-eslint/no-unused-vars + await peertubeHelpers.database.query( + 'UPDATE "plugin" ' + + ' SET "settings" = "settings" || :value ' + + ' WHERE "name" = :pluginShortName', + { + replacements: { + pluginShortName, + value: JSON.stringify({ + 'chat-type': chatType + }) + } + } + ) +} + +async function migrateSettings (options: RegisterServerOptions): Promise { + const logger = options.peertubeHelpers.logger + logger.info('Checking if there is a migration script to launch...') + await _migrateChatTypeSetting(options) +} + +export { + migrateSettings +} diff --git a/server/lib/settings.ts b/server/lib/settings.ts index 73a688ed..26d370eb 100644 --- a/server/lib/settings.ts +++ b/server/lib/settings.ts @@ -1,7 +1,9 @@ import { getBaseRouterRoute } from './helpers' import { ensureProsodyRunning, ensureProsodyNotRunning } from './prosody/ctl' -export function initSettings (options: RegisterServerOptions): void { +type ChatType = 'disabled' | 'builtin-prosody' | 'builtin-converse' | 'external-uri' + +function initSettings (options: RegisterServerOptions): void { const { peertubeHelpers, registerSetting, settingsManager } = options registerSetting({ @@ -214,3 +216,8 @@ Before asking for help, please use this diagnostic tool: } }) } + +export { + ChatType, + initSettings +} diff --git a/server/main.ts b/server/main.ts index e2b7c00e..3b5e242b 100644 --- a/server/main.ts +++ b/server/main.ts @@ -1,3 +1,4 @@ +import { migrateSettings } from './lib/migration/settings' import { initSettings } from './lib/settings' import { initRouters } from './lib/routers/index' import { ensureProsodyRunning, ensureProsodyNotRunning } from './lib/prosody/ctl' @@ -10,6 +11,8 @@ let OPTIONS: RegisterServerOptions | undefined async function register (options: RegisterServerOptions): Promise { OPTIONS = options + await migrateSettings(options) + await initSettings(options) await initRouters(options)