]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/lib/plugins/register-helpers-store.ts
Add priority to transcoding jobs
[github/Chocobozzz/PeerTube.git] / server / lib / plugins / register-helpers-store.ts
index c76c0161a8a1ea2ec175a629cc88f4fb03ba26f4..c73079302157c573aa982d4c1109d9e239c67fd4 100644 (file)
@@ -1,19 +1,36 @@
-import { PluginSettingsManager } from '@shared/models/plugins/plugin-settings-manager.model'
-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 { 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'
-import { buildPluginHelpers } from './plugin-helpers'
+import * as express from 'express'
 import { logger } from '@server/helpers/logger'
-import { RegisterServerHookOptions } from '@shared/models/plugins/register-server-hook.model'
+import {
+  VIDEO_CATEGORIES,
+  VIDEO_LANGUAGES,
+  VIDEO_LICENCES,
+  VIDEO_PLAYLIST_PRIVACIES,
+  VIDEO_PRIVACIES
+} from '@server/initializers/constants'
+import { onExternalUserAuthenticated } from '@server/lib/auth'
+import { PluginModel } from '@server/models/server/plugin'
+import {
+  RegisterServerAuthExternalOptions,
+  RegisterServerAuthExternalResult,
+  RegisterServerAuthPassOptions,
+  RegisterServerExternalAuthenticatedResult,
+  RegisterServerOptions
+} from '@server/types/plugins'
+import {
+  PluginPlaylistPrivacyManager,
+  PluginSettingsManager,
+  PluginStorageManager,
+  PluginVideoCategoryManager,
+  PluginVideoLanguageManager,
+  PluginVideoLicenceManager,
+  PluginVideoPrivacyManager,
+  RegisterServerHookOptions,
+  RegisterServerSettingOptions
+} from '@shared/models'
 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 { buildPluginHelpers } from './plugin-helpers'
 
-type AlterableVideoConstant = 'language' | 'licence' | 'category'
+type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy'
 type VideoConstant = { [key in number | string]: string }
 
 type UpdatedVideoConstant = {
@@ -25,6 +42,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: [] }
@@ -32,6 +51,11 @@ export class RegisterHelpersStore {
 
   private readonly settings: RegisterServerSettingOptions[] = []
 
+  private idAndPassAuths: RegisterServerAuthPassOptions[] = []
+  private externalAuths: RegisterServerAuthExternalOptions[] = []
+
+  private readonly onSettingsChangeCallbacks: ((settings: any) => void)[] = []
+
   private readonly router: express.Router
 
   constructor (
@@ -56,6 +80,14 @@ export class RegisterHelpersStore {
     const videoLicenceManager = this.buildVideoLicenceManager()
     const videoCategoryManager = this.buildVideoCategoryManager()
 
+    const videoPrivacyManager = this.buildVideoPrivacyManager()
+    const playlistPrivacyManager = this.buildPlaylistPrivacyManager()
+
+    const registerIdAndPassAuth = this.buildRegisterIdAndPassAuth()
+    const registerExternalAuth = this.buildRegisterExternalAuth()
+    const unregisterIdAndPassAuth = this.buildUnregisterIdAndPassAuth()
+    const unregisterExternalAuth = this.buildUnregisterExternalAuth()
+
     const peertubeHelpers = buildPluginHelpers(this.npmName)
 
     return {
@@ -71,6 +103,14 @@ export class RegisterHelpersStore {
       videoCategoryManager,
       videoLicenceManager,
 
+      videoPrivacyManager,
+      playlistPrivacyManager,
+
+      registerIdAndPassAuth,
+      registerExternalAuth,
+      unregisterIdAndPassAuth,
+      unregisterExternalAuth,
+
       peertubeHelpers
     }
   }
@@ -79,9 +119,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]
@@ -107,6 +149,18 @@ export class RegisterHelpersStore {
     return this.router
   }
 
+  getIdAndPassAuths () {
+    return this.idAndPassAuths
+  }
+
+  getExternalAuths () {
+    return this.externalAuths
+  }
+
+  getOnSettingsChangedCallbacks () {
+    return this.onSettingsChangeCallbacks
+  }
+
   private buildGetRouter () {
     return () => this.router
   }
@@ -128,11 +182,63 @@ export class RegisterHelpersStore {
     }
   }
 
+  private buildRegisterIdAndPassAuth () {
+    return (options: RegisterServerAuthPassOptions) => {
+      if (!options.authName || typeof options.getWeight !== 'function' || typeof options.login !== 'function') {
+        logger.error('Cannot register auth plugin %s: authName, getWeight or login are not valid.', this.npmName, { options })
+        return
+      }
+
+      this.idAndPassAuths.push(options)
+    }
+  }
+
+  private buildRegisterExternalAuth () {
+    const self = this
+
+    return (options: RegisterServerAuthExternalOptions) => {
+      if (!options.authName || typeof options.authDisplayName !== 'function' || typeof options.onAuthRequest !== 'function') {
+        logger.error('Cannot register auth plugin %s: authName, authDisplayName or onAuthRequest are not valid.', this.npmName, { options })
+        return
+      }
+
+      this.externalAuths.push(options)
+
+      return {
+        userAuthenticated (result: RegisterServerExternalAuthenticatedResult): void {
+          onExternalUserAuthenticated({
+            npmName: self.npmName,
+            authName: options.authName,
+            authResult: result
+          }).catch(err => {
+            logger.error('Cannot execute onExternalUserAuthenticated.', { npmName: self.npmName, authName: options.authName, err })
+          })
+        }
+      } as RegisterServerAuthExternalResult
+    }
+  }
+
+  private buildUnregisterExternalAuth () {
+    return (authName: string) => {
+      this.externalAuths = this.externalAuths.filter(a => a.authName !== authName)
+    }
+  }
+
+  private buildUnregisterIdAndPassAuth () {
+    return (authName: string) => {
+      this.idAndPassAuths = this.idAndPassAuths.filter(a => a.authName !== authName)
+    }
+  }
+
   private buildSettingsManager (): PluginSettingsManager {
     return {
-      getSetting: (name: string) => PluginModel.getSetting(this.plugin.name, this.plugin.type, name),
+      getSetting: (name: string) => PluginModel.getSetting(this.plugin.name, this.plugin.type, name, this.settings),
 
-      setSetting: (name: string, value: string) => PluginModel.setSetting(this.plugin.name, this.plugin.type, name, value)
+      getSettings: (names: string[]) => PluginModel.getSettings(this.plugin.name, this.plugin.type, names, this.settings),
+
+      setSetting: (name: string, value: string) => PluginModel.setSetting(this.plugin.name, this.plugin.type, name, value),
+
+      onSettingsChange: (cb: (settings: any) => void) => this.onSettingsChangeCallbacks.push(cb)
     }
   }
 
@@ -168,6 +274,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) => {