Add ability to remove privacies using plugins
authorChocobozzz <me@florianbigard.com>
Mon, 20 Apr 2020 13:32:11 +0000 (15:32 +0200)
committerChocobozzz <me@florianbigard.com>
Mon, 20 Apr 2020 13:42:27 +0000 (15:42 +0200)
server/lib/plugins/register-helpers-store.ts
server/tests/fixtures/peertube-plugin-test-three/main.js
server/tests/plugins/video-constants.ts
server/typings/plugins/register-server-option.model.ts
shared/models/plugins/plugin-playlist-privacy-manager.model.ts [new file with mode: 0644]
shared/models/plugins/plugin-video-privacy-manager.model.ts [new file with mode: 0644]
support/doc/plugins/guide.md

index c76c0161a8a1ea2ec175a629cc88f4fb03ba26f4..5ca52b1517aaf8251123870364c6857940aa40a3 100644 (file)
@@ -2,7 +2,13 @@ import { PluginSettingsManager } from '@shared/models/plugins/plugin-settings-ma
 import { PluginModel } from '@server/models/server/plugin'
 import { PluginStorageManager } from '@shared/models/plugins/plugin-storage-manager.model'
 import { PluginVideoLanguageManager } from '@shared/models/plugins/plugin-video-language-manager.model'
-import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES } from '@server/initializers/constants'
+import {
+  VIDEO_CATEGORIES,
+  VIDEO_LANGUAGES,
+  VIDEO_LICENCES,
+  VIDEO_PLAYLIST_PRIVACIES,
+  VIDEO_PRIVACIES
+} from '@server/initializers/constants'
 import { PluginVideoLicenceManager } from '@shared/models/plugins/plugin-video-licence-manager.model'
 import { PluginVideoCategoryManager } from '@shared/models/plugins/plugin-video-category-manager.model'
 import { RegisterServerOptions } from '@server/typings/plugins'
@@ -12,8 +18,10 @@ import { RegisterServerHookOptions } from '@shared/models/plugins/register-serve
 import { serverHookObject } from '@shared/models/plugins/server-hook.model'
 import { RegisterServerSettingOptions } from '@shared/models/plugins/register-server-setting.model'
 import * as express from 'express'
+import { PluginVideoPrivacyManager } from '@shared/models/plugins/plugin-video-privacy-manager.model'
+import { PluginPlaylistPrivacyManager } from '@shared/models/plugins/plugin-playlist-privacy-manager.model'
 
-type AlterableVideoConstant = 'language' | 'licence' | 'category'
+type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy'
 type VideoConstant = { [key in number | string]: string }
 
 type UpdatedVideoConstant = {
@@ -25,6 +33,8 @@ type UpdatedVideoConstant = {
 
 export class RegisterHelpersStore {
   private readonly updatedVideoConstants: UpdatedVideoConstant = {
+    playlistPrivacy: { added: [], deleted: [] },
+    privacy: { added: [], deleted: [] },
     language: { added: [], deleted: [] },
     licence: { added: [], deleted: [] },
     category: { added: [], deleted: [] }
@@ -56,6 +66,9 @@ export class RegisterHelpersStore {
     const videoLicenceManager = this.buildVideoLicenceManager()
     const videoCategoryManager = this.buildVideoCategoryManager()
 
+    const videoPrivacyManager = this.buildVideoPrivacyManager()
+    const playlistPrivacyManager = this.buildPlaylistPrivacyManager()
+
     const peertubeHelpers = buildPluginHelpers(this.npmName)
 
     return {
@@ -71,6 +84,9 @@ export class RegisterHelpersStore {
       videoCategoryManager,
       videoLicenceManager,
 
+      videoPrivacyManager,
+      playlistPrivacyManager,
+
       peertubeHelpers
     }
   }
@@ -79,9 +95,11 @@ export class RegisterHelpersStore {
     const hash = {
       language: VIDEO_LANGUAGES,
       licence: VIDEO_LICENCES,
-      category: VIDEO_CATEGORIES
+      category: VIDEO_CATEGORIES,
+      privacy: VIDEO_PRIVACIES,
+      playlistPrivacy: VIDEO_PLAYLIST_PRIVACIES
     }
-    const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category' ]
+    const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category', 'privacy', 'playlistPrivacy' ]
 
     for (const type of types) {
       const updatedConstants = this.updatedVideoConstants[type][npmName]
@@ -168,6 +186,22 @@ export class RegisterHelpersStore {
     }
   }
 
+  private buildVideoPrivacyManager (): PluginVideoPrivacyManager {
+    return {
+      deletePrivacy: (key: number) => {
+        return this.deleteConstant({ npmName: this.npmName, type: 'privacy', obj: VIDEO_PRIVACIES, key })
+      }
+    }
+  }
+
+  private buildPlaylistPrivacyManager (): PluginPlaylistPrivacyManager {
+    return {
+      deletePlaylistPrivacy: (key: number) => {
+        return this.deleteConstant({ npmName: this.npmName, type: 'playlistPrivacy', obj: VIDEO_PLAYLIST_PRIVACIES, key })
+      }
+    }
+  }
+
   private buildVideoLicenceManager (): PluginVideoLicenceManager {
     return {
       addLicence: (key: number, label: string) => {
index 4945feb5517bcad141073afda9444b48473a34cc..f2b89bcf0de526ba8f4161f78be4d3d45bebaced 100644 (file)
@@ -5,7 +5,9 @@ async function register ({
   storageManager,
   videoCategoryManager,
   videoLicenceManager,
-  videoLanguageManager
+  videoLanguageManager,
+  videoPrivacyManager,
+  playlistPrivacyManager
 }) {
   videoLanguageManager.addLanguage('al_bhed', 'Al Bhed')
   videoLanguageManager.addLanguage('al_bhed2', 'Al Bhed 2')
@@ -21,6 +23,9 @@ async function register ({
   videoLicenceManager.addLicence(43, 'High best licence')
   videoLicenceManager.deleteLicence(1) // Attribution
   videoLicenceManager.deleteLicence(7) // Public domain
+
+  videoPrivacyManager.deletePrivacy(2)
+  playlistPrivacyManager.deletePlaylistPrivacy(3)
 }
 
 async function unregister () {
index 5374b5eccc38385c59827683128f3921b910cf23..fec9196e25704caa8c2cfeaf07ce580c50a62bf8 100644 (file)
@@ -4,17 +4,18 @@ import * as chai from 'chai'
 import 'mocha'
 import { cleanupTests, flushAndRunServer, ServerInfo } from '../../../shared/extra-utils/server/servers'
 import {
+  createVideoPlaylist,
   getPluginTestPath,
   getVideo,
   getVideoCategories,
   getVideoLanguages,
-  getVideoLicences,
+  getVideoLicences, getVideoPlaylistPrivacies, getVideoPrivacies,
   installPlugin,
   setAccessTokensToServers,
   uninstallPlugin,
   uploadVideo
 } from '../../../shared/extra-utils'
-import { VideoDetails } from '../../../shared/models/videos'
+import { VideoDetails, VideoPlaylistPrivacy } from '../../../shared/models/videos'
 
 const expect = chai.expect
 
@@ -67,6 +68,35 @@ describe('Test plugin altering video constants', function () {
     expect(licences[43]).to.equal('High best licence')
   })
 
+  it('Should have updated video privacies', async function () {
+    const res = await getVideoPrivacies(server.url)
+    const privacies = res.body
+
+    expect(privacies[1]).to.exist
+    expect(privacies[2]).to.not.exist
+    expect(privacies[3]).to.exist
+    expect(privacies[4]).to.exist
+  })
+
+  it('Should have updated playlist privacies', async function () {
+    const res = await getVideoPlaylistPrivacies(server.url)
+    const playlistPrivacies = res.body
+
+    expect(playlistPrivacies[1]).to.exist
+    expect(playlistPrivacies[2]).to.exist
+    expect(playlistPrivacies[3]).to.not.exist
+  })
+
+  it('Should not be able to create a video with this privacy', async function () {
+    const attrs = { name: 'video', privacy: 2 }
+    await uploadVideo(server.url, server.accessToken, attrs, 400)
+  })
+
+  it('Should not be able to create a video with this privacy', async function () {
+    const attrs = { displayName: 'video playlist', privacy: VideoPlaylistPrivacy.PRIVATE }
+    await createVideoPlaylist({ url: server.url, token: server.accessToken, playlistAttrs: attrs, expectedStatus: 400 })
+  })
+
   it('Should be able to upload a video with these values', async function () {
     const attrs = { name: 'video', category: 42, licence: 42, language: 'al_bhed2' }
     const resUpload = await uploadVideo(server.url, server.accessToken, attrs)
@@ -79,7 +109,7 @@ describe('Test plugin altering video constants', function () {
     expect(video.category.label).to.equal('Best category')
   })
 
-  it('Should uninstall the plugin and reset languages, categories and licences', async function () {
+  it('Should uninstall the plugin and reset languages, categories, licences and privacies', async function () {
     await uninstallPlugin({ url: server.url, accessToken: server.accessToken, npmName: 'peertube-plugin-test-three' })
 
     {
@@ -114,6 +144,25 @@ describe('Test plugin altering video constants', function () {
       expect(licences[42]).to.not.exist
       expect(licences[43]).to.not.exist
     }
+
+    {
+      const res = await getVideoPrivacies(server.url)
+      const privacies = res.body
+
+      expect(privacies[1]).to.exist
+      expect(privacies[2]).to.exist
+      expect(privacies[3]).to.exist
+      expect(privacies[4]).to.exist
+    }
+
+    {
+      const res = await getVideoPlaylistPrivacies(server.url)
+      const playlistPrivacies = res.body
+
+      expect(playlistPrivacies[1]).to.exist
+      expect(playlistPrivacies[2]).to.exist
+      expect(playlistPrivacies[3]).to.exist
+    }
   })
 
   after(async function () {
index 3d6217d1b8b771d32b862b2a636b9abed97ecaf3..813e93003c93c3f86b37c5aff86ed60cec77621a 100644 (file)
@@ -7,6 +7,8 @@ import { PluginVideoLanguageManager } from '../../../shared/models/plugins/plugi
 import { PluginVideoLicenceManager } from '../../../shared/models/plugins/plugin-video-licence-manager.model'
 import { Logger } from 'winston'
 import { Router } from 'express'
+import { PluginVideoPrivacyManager } from '@shared/models/plugins/plugin-video-privacy-manager.model'
+import { PluginPlaylistPrivacyManager } from '@shared/models/plugins/plugin-playlist-privacy-manager.model'
 
 export type PeerTubeHelpers = {
   logger: Logger
@@ -33,6 +35,9 @@ export type RegisterServerOptions = {
   videoLanguageManager: PluginVideoLanguageManager
   videoLicenceManager: PluginVideoLicenceManager
 
+  videoPrivacyManager: PluginVideoPrivacyManager
+  playlistPrivacyManager: PluginPlaylistPrivacyManager
+
   // Get plugin router to create custom routes
   // Base routes of this router are
   //  * /plugins/:pluginName/:pluginVersion/router/...
diff --git a/shared/models/plugins/plugin-playlist-privacy-manager.model.ts b/shared/models/plugins/plugin-playlist-privacy-manager.model.ts
new file mode 100644 (file)
index 0000000..f9630c7
--- /dev/null
@@ -0,0 +1,8 @@
+import { VideoPlaylistPrivacy } from '@shared/models'
+
+export interface PluginPlaylistPrivacyManager {
+  // PUBLIC = 1,
+  // UNLISTED = 2,
+  // PRIVATE = 3
+  deletePlaylistPrivacy: (privacyKey: VideoPlaylistPrivacy) => boolean
+}
diff --git a/shared/models/plugins/plugin-video-privacy-manager.model.ts b/shared/models/plugins/plugin-video-privacy-manager.model.ts
new file mode 100644 (file)
index 0000000..d602ba2
--- /dev/null
@@ -0,0 +1,9 @@
+import { VideoPrivacy } from '@shared/models'
+
+export interface PluginVideoPrivacyManager {
+  // PUBLIC = 1
+  // UNLISTED = 2
+  // PRIVATE = 3
+  // INTERNAL = 4
+  deletePrivacy: (privacyKey: VideoPrivacy) => boolean
+}
index 1bee1f611418a5e974222937443aceddb8660b2d..fdad630873092fbbdcca21a163bec77b4c871943 100644 (file)
     - [Update video constants](#update-video-constants)
     - [Add custom routes](#add-custom-routes)
   - [Client helpers (themes & plugins)](#client-helpers-themes--plugins)
-  - [Plugin static route](#plugin-static-route)
+    - [Plugin static route](#plugin-static-route)
+    - [Notifier](#notifier)
+    - [Markdown Renderer](#markdown-renderer)
+    - [Custom Modal](#custom-modal)
     - [Translate](#translate)
     - [Get public settings](#get-public-settings)
   - [Publishing](#publishing)
@@ -180,6 +183,9 @@ videoCategoryManager.deleteCategory(1) // Music
 
 videoLicenceManager.addLicence(42, 'Best licence')
 videoLicenceManager.deleteLicence(7) // Public domain
+
+videoPrivacyManager.deletePrivacy(2) // Remove Unlisted video privacy
+playlistPrivacyManager.deletePlaylistPrivacy(3) // Remove Private video playlist privacy
 ```
 
 #### Add custom routes