Fix plugin storeData
authorChocobozzz <me@florianbigard.com>
Mon, 4 May 2020 07:44:00 +0000 (09:44 +0200)
committerChocobozzz <chocobozzz@cpy.re>
Mon, 4 May 2020 14:21:39 +0000 (16:21 +0200)
server/models/server/plugin.ts
server/tests/fixtures/peertube-plugin-test-six/main.js [new file with mode: 0644]
server/tests/fixtures/peertube-plugin-test-six/package.json [new file with mode: 0644]
server/tests/plugins/index.ts
server/tests/plugins/plugin-storage.ts [new file with mode: 0644]

index c728463437cab076d4ea5ad765600e5268bb14c7..53b6227d71708eac64c6866636cd977b2bc4d8ee 100644 (file)
@@ -1,5 +1,5 @@
 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'
@@ -212,18 +212,17 @@ export class PluginModel extends Model<PluginModel> {
   }
 
   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)
   }
 
diff --git a/server/tests/fixtures/peertube-plugin-test-six/main.js b/server/tests/fixtures/peertube-plugin-test-six/main.js
new file mode 100644 (file)
index 0000000..bb9aaff
--- /dev/null
@@ -0,0 +1,25 @@
+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
+}
+
+// ###########################################################################
diff --git a/server/tests/fixtures/peertube-plugin-test-six/package.json b/server/tests/fixtures/peertube-plugin-test-six/package.json
new file mode 100644 (file)
index 0000000..8c97826
--- /dev/null
@@ -0,0 +1,20 @@
+{
+  "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": {}
+}
index d2bd691312b920530d0adca60812743463bcd098..39c4c958aa78803868f898c4d4f482c644570b56 100644 (file)
@@ -6,3 +6,4 @@ import './translations'
 import './video-constants'
 import './plugin-helpers'
 import './plugin-router'
+import './plugin-storage'
diff --git a/server/tests/plugins/plugin-storage.ts b/server/tests/plugins/plugin-storage.ts
new file mode 100644 (file)
index 0000000..356692e
--- /dev/null
@@ -0,0 +1,30 @@
+/* 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 ])
+  })
+})