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
 | |
|   }
 | |
| }
 |