mirror of https://github.com/Chocobozzz/PeerTube
140 lines
3.9 KiB
TypeScript
140 lines
3.9 KiB
TypeScript
import { logger } from '@server/helpers/logger'
|
|
import {
|
|
VIDEO_CATEGORIES,
|
|
VIDEO_LANGUAGES,
|
|
VIDEO_LICENCES,
|
|
VIDEO_PLAYLIST_PRIVACIES,
|
|
VIDEO_PRIVACIES
|
|
} from '@server/initializers/constants'
|
|
import { ConstantManager } from '@shared/models/plugins/server/plugin-constant-manager.model'
|
|
|
|
type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy'
|
|
type VideoConstant = Record<number | string, string>
|
|
|
|
type UpdatedVideoConstant = {
|
|
[name in AlterableVideoConstant]: {
|
|
[ npmName: string]: {
|
|
added: VideoConstant[]
|
|
deleted: VideoConstant[]
|
|
}
|
|
}
|
|
}
|
|
|
|
const constantsHash: { [key in AlterableVideoConstant]: VideoConstant } = {
|
|
language: VIDEO_LANGUAGES,
|
|
licence: VIDEO_LICENCES,
|
|
category: VIDEO_CATEGORIES,
|
|
privacy: VIDEO_PRIVACIES,
|
|
playlistPrivacy: VIDEO_PLAYLIST_PRIVACIES
|
|
}
|
|
|
|
export class VideoConstantManagerFactory {
|
|
private readonly updatedVideoConstants: UpdatedVideoConstant = {
|
|
playlistPrivacy: { },
|
|
privacy: { },
|
|
language: { },
|
|
licence: { },
|
|
category: { }
|
|
}
|
|
|
|
constructor (
|
|
private readonly npmName: string
|
|
) {}
|
|
|
|
public resetVideoConstants (npmName: string) {
|
|
const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category', 'privacy', 'playlistPrivacy' ]
|
|
for (const type of types) {
|
|
this.resetConstants({ npmName, type })
|
|
}
|
|
}
|
|
|
|
private resetConstants (parameters: { npmName: string, type: AlterableVideoConstant }) {
|
|
const { npmName, type } = parameters
|
|
const updatedConstants = this.updatedVideoConstants[type][npmName]
|
|
|
|
if (!updatedConstants) return
|
|
|
|
for (const added of updatedConstants.added) {
|
|
delete constantsHash[type][added.key]
|
|
}
|
|
|
|
for (const deleted of updatedConstants.deleted) {
|
|
constantsHash[type][deleted.key] = deleted.label
|
|
}
|
|
|
|
delete this.updatedVideoConstants[type][npmName]
|
|
}
|
|
|
|
public createVideoConstantManager<K extends number | string>(type: AlterableVideoConstant): ConstantManager<K> {
|
|
const { npmName } = this
|
|
return {
|
|
addConstant: (key: K, label: string) => this.addConstant({ npmName, type, key, label }),
|
|
deleteConstant: (key: K) => this.deleteConstant({ npmName, type, key }),
|
|
getConstantValue: (key: K) => constantsHash[type][key],
|
|
getConstants: () => constantsHash[type] as Record<K, string>,
|
|
resetConstants: () => this.resetConstants({ npmName, type })
|
|
}
|
|
}
|
|
|
|
private addConstant<T extends string | number> (parameters: {
|
|
npmName: string
|
|
type: AlterableVideoConstant
|
|
key: T
|
|
label: string
|
|
}) {
|
|
const { npmName, type, key, label } = parameters
|
|
const obj = constantsHash[type]
|
|
|
|
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: key, label } as VideoConstant)
|
|
obj[key] = label
|
|
|
|
return true
|
|
}
|
|
|
|
private deleteConstant<T extends string | number> (parameters: {
|
|
npmName: string
|
|
type: AlterableVideoConstant
|
|
key: T
|
|
}) {
|
|
const { npmName, type, key } = parameters
|
|
const obj = constantsHash[type]
|
|
|
|
if (!obj[key]) {
|
|
logger.warn('Cannot delete %s by plugin %s: key %s does not exist.', type, npmName, key)
|
|
return false
|
|
}
|
|
|
|
if (!this.updatedVideoConstants[type][npmName]) {
|
|
this.updatedVideoConstants[type][npmName] = {
|
|
added: [],
|
|
deleted: []
|
|
}
|
|
}
|
|
|
|
const updatedConstants = this.updatedVideoConstants[type][npmName]
|
|
|
|
const alreadyAdded = updatedConstants.added.find(a => a.key === key)
|
|
if (alreadyAdded) {
|
|
updatedConstants.added.filter(a => a.key !== key)
|
|
} else if (obj[key]) {
|
|
updatedConstants.deleted.push({ key, label: obj[key] } as VideoConstant)
|
|
}
|
|
|
|
delete obj[key]
|
|
|
|
return true
|
|
}
|
|
}
|