X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;ds=sidebyside;f=server%2Flib%2Fplugins%2Fregister-helpers.ts;h=1aaef36068486a892208a37db43b7660d1aa01a2;hb=f50bff17f5b69c576960360857e25224cea13c0a;hp=f5b5733702105ad1a53d0cf029c61deb8b5ccf20;hpb=eb34ec30e0b57286fc6f85160490d2e973a3b0b1;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/lib/plugins/register-helpers.ts b/server/lib/plugins/register-helpers.ts index f5b573370..1aaef3606 100644 --- a/server/lib/plugins/register-helpers.ts +++ b/server/lib/plugins/register-helpers.ts @@ -1,56 +1,32 @@ -import * as express from 'express' +import express from 'express' +import { Server } from 'http' import { logger } from '@server/helpers/logger' -import { - VIDEO_CATEGORIES, - VIDEO_LANGUAGES, - VIDEO_LICENCES, - VIDEO_PLAYLIST_PRIVACIES, - VIDEO_PRIVACIES -} from '@server/initializers/constants' import { onExternalUserAuthenticated } from '@server/lib/auth/external-auth' +import { VideoConstantManagerFactory } from '@server/lib/plugins/video-constant-manager-factory' import { PluginModel } from '@server/models/server/plugin' import { RegisterServerAuthExternalOptions, RegisterServerAuthExternalResult, RegisterServerAuthPassOptions, RegisterServerExternalAuthenticatedResult, - RegisterServerOptions + RegisterServerOptions, + RegisterServerWebSocketRouteOptions } from '@server/types/plugins' import { EncoderOptionsBuilder, - PluginPlaylistPrivacyManager, PluginSettingsManager, PluginStorageManager, - PluginVideoCategoryManager, - PluginVideoLanguageManager, - PluginVideoLicenceManager, - PluginVideoPrivacyManager, RegisterServerHookOptions, RegisterServerSettingOptions, - serverHookObject + serverHookObject, + SettingsChangeCallback, + VideoPlaylistPrivacy, + VideoPrivacy } from '@shared/models' -import { VideoTranscodingProfilesManager } from '../transcoding/video-transcoding-profiles' +import { VideoTranscodingProfilesManager } from '../transcoding/default-transcoding-profiles' import { buildPluginHelpers } from './plugin-helpers-builder' -type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy' -type VideoConstant = { [key in number | string]: string } - -type UpdatedVideoConstant = { - [name in AlterableVideoConstant]: { - added: { key: number | string, label: string }[] - deleted: { key: number | string, label: string }[] - } -} - export class RegisterHelpers { - private readonly updatedVideoConstants: UpdatedVideoConstant = { - playlistPrivacy: { added: [], deleted: [] }, - privacy: { added: [], deleted: [] }, - language: { added: [], deleted: [] }, - licence: { added: [], deleted: [] }, - category: { added: [], deleted: [] } - } - private readonly transcodingProfiles: { [ npmName: string ]: { type: 'vod' | 'live' @@ -73,16 +49,21 @@ export class RegisterHelpers { private idAndPassAuths: RegisterServerAuthPassOptions[] = [] private externalAuths: RegisterServerAuthExternalOptions[] = [] - private readonly onSettingsChangeCallbacks: ((settings: any) => Promise)[] = [] + private readonly onSettingsChangeCallbacks: SettingsChangeCallback[] = [] + + private readonly webSocketRoutes: RegisterServerWebSocketRouteOptions[] = [] private readonly router: express.Router + private readonly videoConstantManagerFactory: VideoConstantManagerFactory constructor ( private readonly npmName: string, private readonly plugin: PluginModel, + private readonly server: Server, private readonly onHookAdded: (options: RegisterServerHookOptions) => void ) { this.router = express.Router() + this.videoConstantManagerFactory = new VideoConstantManagerFactory(this.npmName) } buildRegisterHelpers (): RegisterServerOptions { @@ -90,17 +71,18 @@ export class RegisterHelpers { const registerSetting = this.buildRegisterSetting() const getRouter = this.buildGetRouter() + const registerWebSocketRoute = this.buildRegisterWebSocketRoute() const settingsManager = this.buildSettingsManager() const storageManager = this.buildStorageManager() - const videoLanguageManager = this.buildVideoLanguageManager() + const videoLanguageManager = this.videoConstantManagerFactory.createVideoConstantManager('language') - const videoLicenceManager = this.buildVideoLicenceManager() - const videoCategoryManager = this.buildVideoCategoryManager() + const videoLicenceManager = this.videoConstantManagerFactory.createVideoConstantManager('licence') + const videoCategoryManager = this.videoConstantManagerFactory.createVideoConstantManager('category') - const videoPrivacyManager = this.buildVideoPrivacyManager() - const playlistPrivacyManager = this.buildPlaylistPrivacyManager() + const videoPrivacyManager = this.videoConstantManagerFactory.createVideoConstantManager('privacy') + const playlistPrivacyManager = this.videoConstantManagerFactory.createVideoConstantManager('playlistPrivacy') const transcodingManager = this.buildTranscodingManager() @@ -109,23 +91,50 @@ export class RegisterHelpers { const unregisterIdAndPassAuth = this.buildUnregisterIdAndPassAuth() const unregisterExternalAuth = this.buildUnregisterExternalAuth() - const peertubeHelpers = buildPluginHelpers(this.plugin, this.npmName) + const peertubeHelpers = buildPluginHelpers(this.server, this.plugin, this.npmName) return { registerHook, registerSetting, getRouter, + registerWebSocketRoute, settingsManager, storageManager, - videoLanguageManager, - videoCategoryManager, - videoLicenceManager, + videoLanguageManager: { + ...videoLanguageManager, + /** @deprecated use `addConstant` instead **/ + addLanguage: videoLanguageManager.addConstant, + /** @deprecated use `deleteConstant` instead **/ + deleteLanguage: videoLanguageManager.deleteConstant + }, + videoCategoryManager: { + ...videoCategoryManager, + /** @deprecated use `addConstant` instead **/ + addCategory: videoCategoryManager.addConstant, + /** @deprecated use `deleteConstant` instead **/ + deleteCategory: videoCategoryManager.deleteConstant + }, + videoLicenceManager: { + ...videoLicenceManager, + /** @deprecated use `addConstant` instead **/ + addLicence: videoLicenceManager.addConstant, + /** @deprecated use `deleteConstant` instead **/ + deleteLicence: videoLicenceManager.deleteConstant + }, - videoPrivacyManager, - playlistPrivacyManager, + videoPrivacyManager: { + ...videoPrivacyManager, + /** @deprecated use `deleteConstant` instead **/ + deletePrivacy: videoPrivacyManager.deleteConstant + }, + playlistPrivacyManager: { + ...playlistPrivacyManager, + /** @deprecated use `deleteConstant` instead **/ + deletePlaylistPrivacy: playlistPrivacyManager.deleteConstant + }, transcodingManager, @@ -139,29 +148,7 @@ export class RegisterHelpers { } reinitVideoConstants (npmName: string) { - const hash = { - language: VIDEO_LANGUAGES, - licence: VIDEO_LICENCES, - category: VIDEO_CATEGORIES, - privacy: VIDEO_PRIVACIES, - playlistPrivacy: VIDEO_PLAYLIST_PRIVACIES - } - const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category', 'privacy', 'playlistPrivacy' ] - - for (const type of types) { - const updatedConstants = this.updatedVideoConstants[type][npmName] - if (!updatedConstants) continue - - for (const added of updatedConstants.added) { - delete hash[type][added.key] - } - - for (const deleted of updatedConstants.deleted) { - hash[type][deleted.key] = deleted.label - } - - delete this.updatedVideoConstants[type][npmName] - } + this.videoConstantManagerFactory.resetVideoConstants(npmName) } reinitTranscodingProfilesAndEncoders (npmName: string) { @@ -200,10 +187,20 @@ export class RegisterHelpers { return this.onSettingsChangeCallbacks } + getWebSocketRoutes () { + return this.webSocketRoutes + } + private buildGetRouter () { return () => this.router } + private buildRegisterWebSocketRoute () { + return (options: RegisterServerWebSocketRouteOptions) => { + this.webSocketRoutes.push(options) + } + } + private buildRegisterSetting () { return (options: RegisterServerSettingOptions) => { this.settings.push(options) @@ -277,7 +274,7 @@ export class RegisterHelpers { setSetting: (name: string, value: string) => PluginModel.setSetting(this.plugin.name, this.plugin.type, name, value), - onSettingsChange: (cb: (settings: any) => Promise) => this.onSettingsChangeCallbacks.push(cb) + onSettingsChange: (cb: SettingsChangeCallback) => this.onSettingsChangeCallbacks.push(cb) } } @@ -289,111 +286,6 @@ export class RegisterHelpers { } } - private buildVideoLanguageManager (): PluginVideoLanguageManager { - return { - addLanguage: (key: string, label: string) => { - return this.addConstant({ npmName: this.npmName, type: 'language', obj: VIDEO_LANGUAGES, key, label }) - }, - - deleteLanguage: (key: string) => { - return this.deleteConstant({ npmName: this.npmName, type: 'language', obj: VIDEO_LANGUAGES, key }) - } - } - } - - private buildVideoCategoryManager (): PluginVideoCategoryManager { - return { - addCategory: (key: number, label: string) => { - return this.addConstant({ npmName: this.npmName, type: 'category', obj: VIDEO_CATEGORIES, key, label }) - }, - - deleteCategory: (key: number) => { - return this.deleteConstant({ npmName: this.npmName, type: 'category', obj: VIDEO_CATEGORIES, key }) - } - } - } - - 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) => { - return this.addConstant({ npmName: this.npmName, type: 'licence', obj: VIDEO_LICENCES, key, label }) - }, - - deleteLicence: (key: number) => { - return this.deleteConstant({ npmName: this.npmName, type: 'licence', obj: VIDEO_LICENCES, key }) - } - } - } - - private addConstant (parameters: { - npmName: string - type: AlterableVideoConstant - obj: VideoConstant - key: T - label: string - }) { - const { npmName, type, obj, key, label } = parameters - - if (obj[key]) { - logger.warn('Cannot add %s %s by plugin %s: key already exists.', type, npmName, key) - return false - } - - if (!this.updatedVideoConstants[type][npmName]) { - this.updatedVideoConstants[type][npmName] = { - added: [], - deleted: [] - } - } - - this.updatedVideoConstants[type][npmName].added.push({ key, label }) - obj[key] = label - - return true - } - - private deleteConstant (parameters: { - npmName: string - type: AlterableVideoConstant - obj: VideoConstant - key: T - }) { - const { npmName, type, obj, key } = parameters - - if (!obj[key]) { - logger.warn('Cannot delete %s %s by plugin %s: key does not exist.', type, npmName, key) - return false - } - - if (!this.updatedVideoConstants[type][npmName]) { - this.updatedVideoConstants[type][npmName] = { - added: [], - deleted: [] - } - } - - this.updatedVideoConstants[type][npmName].deleted.push({ key, label: obj[key] }) - delete obj[key] - - return true - } - private buildTranscodingManager () { const self = this