// SPDX-FileCopyrightText: 2024 John Livingston
//
// SPDX-License-Identifier: AGPL-3.0-only
import type { RegisterServerOptions } from '@peertube/peertube-types'
import { pluginShortName } from '../helpers'
async function migrateSettings (options: RegisterServerOptions): Promise {
const logger = options.peertubeHelpers.logger
logger.info('Checking if there is a migration script to launch...')
// 2022-10-10: as we removed the «chat-type» settings, there is no migration needed for now.
// 2024-09-02: concord theme was removed from ConverseJS, must change if used.
await _migrateConverseTheme(options)
}
async function _migrateConverseTheme (options: RegisterServerOptions): Promise {
const peertubeHelpers = options.peertubeHelpers
const logger = peertubeHelpers.logger
// NB: we cant use safely settingsManager.getSetting, because settings are not registered yet.
logger.info('Checking if we need to migrate converse-theme')
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('_migrateConverseTheme: 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 (!('converse-theme' in settings)) {
logger.debug('The setting converse-theme is not here, no need to migrate.')
return
}
if (settings['converse-theme'] !== 'concord') {
logger.debug('The setting converse-theme is not set to concord, no need to migrate.')
return
}
logger.info('The setting converse-theme is set to concord, we must replace by peertube..')
await peertubeHelpers.database.query(
'UPDATE "plugin" ' +
' SET "settings" = "settings" || :value ' +
' WHERE "name" = :pluginShortName',
{
replacements: {
pluginShortName,
value: JSON.stringify({
'converse-theme': 'peertube'
})
}
}
)
}
export {
migrateSettings
}