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 { PeerTubePlugin } from '../../../shared/models/plugins/peertube-plugin.model'
}
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)
}
--- /dev/null
+async function register ({
+ storageManager,
+ peertubeHelpers
+}) {
+ const { logger } = peertubeHelpers
+
+ {
+ await storageManager.storeData('superkey', { value: 'toto' })
+ await storageManager.storeData('anotherkey', { value: 'toto2' })
+
+ const result = await storageManager.getData('superkey')
+ logger.info('superkey stored value is %s', result.value)
+ }
+}
+
+async function unregister () {
+ return
+}
+
+module.exports = {
+ register,
+ unregister
+}
+
+// ###########################################################################
--- /dev/null
+{
+ "name": "peertube-plugin-test-six",
+ "version": "0.0.1",
+ "description": "Plugin test 6",
+ "engine": {
+ "peertube": ">=1.3.0"
+ },
+ "keywords": [
+ "peertube",
+ "plugin"
+ ],
+ "homepage": "https://github.com/Chocobozzz/PeerTube",
+ "author": "Chocobozzz",
+ "bugs": "https://github.com/Chocobozzz/PeerTube/issues",
+ "library": "./main.js",
+ "staticDirs": {},
+ "css": [],
+ "clientScripts": [],
+ "translations": {}
+}
import './video-constants'
import './plugin-helpers'
import './plugin-router'
+import './plugin-storage'
--- /dev/null
+/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
+
+import 'mocha'
+import { getPluginTestPath, installPlugin, setAccessTokensToServers } from '../../../shared/extra-utils'
+import { cleanupTests, flushAndRunServer, ServerInfo, waitUntilLog } from '../../../shared/extra-utils/server/servers'
+
+describe('Test plugin storage', function () {
+ let server: ServerInfo
+
+ before(async function () {
+ this.timeout(30000)
+
+ server = await flushAndRunServer(1)
+ await setAccessTokensToServers([ server ])
+
+ await installPlugin({
+ url: server.url,
+ accessToken: server.accessToken,
+ path: getPluginTestPath('-six')
+ })
+ })
+
+ it('Should correctly store a subkey', async function () {
+ await waitUntilLog(server, 'superkey stored value is toto')
+ })
+
+ after(async function () {
+ await cleanupTests([ server ])
+ })
+})