123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- import { ConstantManager } from '@peertube/peertube-models'
- import { logger } from '@server/helpers/logger.js'
- import {
- VIDEO_CATEGORIES,
- VIDEO_LANGUAGES,
- VIDEO_LICENCES,
- VIDEO_PLAYLIST_PRIVACIES,
- VIDEO_PRIVACIES
- } from '@server/initializers/constants.js'
- 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, 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
- }
- }
|