import * as Bluebird from 'bluebird'
-import { FindAndCountOptions, json } from 'sequelize'
+import { FindAndCountOptions, json, QueryTypes } from 'sequelize'
import { AllowNull, Column, CreatedAt, DataType, DefaultScope, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
-import { MPlugin, MPluginFormattable } from '@server/typings/models'
+import { MPlugin, MPluginFormattable } from '@server/types/models'
import { PeerTubePlugin } from '../../../shared/models/plugins/peertube-plugin.model'
import { PluginType } from '../../../shared/models/plugins/plugin.type'
import { RegisterServerSettingOptions } from '../../../shared/models/plugins/register-server-setting.model'
return PluginModel.findOne(query)
.then(p => {
- if (!p || p.settings === undefined) {
+ if (!p || !p.settings || p.settings === undefined) {
const registered = registeredSettings.find(s => s.name === settingName)
if (!registered || registered.default === undefined) return undefined
const result: { [settingName: string ]: string | boolean } = {}
for (const name of settingNames) {
- if (!p || p.settings[name] === undefined) {
+ if (!p || !p.settings || p.settings[name] === undefined) {
const registered = registeredSettings.find(s => s.name === name)
if (registered?.default !== undefined) {
}
static storeData (pluginName: string, pluginType: PluginType, key: string, data: any) {
- const query = {
- where: {
- name: pluginName,
- type: pluginType
- }
- }
+ const query = 'UPDATE "plugin" SET "storage" = jsonb_set(coalesce("storage", \'{}\'), :key, :data::jsonb) ' +
+ 'WHERE "name" = :pluginName AND "type" = :pluginType'
- const toSave = {
- [`storage.${key}`]: data
+ const jsonPath = '{' + key + '}'
+
+ const options = {
+ replacements: { pluginName, pluginType, key: jsonPath, data: JSON.stringify(data) },
+ type: QueryTypes.UPDATE
}
- return PluginModel.update(toSave, query)
+ return PluginModel.sequelize.query(query, options)
.then(() => undefined)
}