]>
Commit | Line | Data |
---|---|---|
1 | import { logger } from '@server/helpers/logger' | |
2 | import { | |
3 | VIDEO_CATEGORIES, | |
4 | VIDEO_LANGUAGES, | |
5 | VIDEO_LICENCES, | |
6 | VIDEO_PLAYLIST_PRIVACIES, | |
7 | VIDEO_PRIVACIES | |
8 | } from '@server/initializers/constants' | |
9 | import { ConstantManager } from '@shared/models/plugins/server/plugin-constant-manager.model' | |
10 | ||
11 | type AlterableVideoConstant = 'language' | 'licence' | 'category' | 'privacy' | 'playlistPrivacy' | |
12 | type VideoConstant = Record<number | string, string> | |
13 | ||
14 | type UpdatedVideoConstant = { | |
15 | [name in AlterableVideoConstant]: { | |
16 | [ npmName: string]: { | |
17 | added: VideoConstant[] | |
18 | deleted: VideoConstant[] | |
19 | } | |
20 | } | |
21 | } | |
22 | ||
23 | const constantsHash: { [key in AlterableVideoConstant]: VideoConstant } = { | |
24 | language: VIDEO_LANGUAGES, | |
25 | licence: VIDEO_LICENCES, | |
26 | category: VIDEO_CATEGORIES, | |
27 | privacy: VIDEO_PRIVACIES, | |
28 | playlistPrivacy: VIDEO_PLAYLIST_PRIVACIES | |
29 | } | |
30 | ||
31 | export class VideoConstantManagerFactory { | |
32 | private readonly updatedVideoConstants: UpdatedVideoConstant = { | |
33 | playlistPrivacy: { }, | |
34 | privacy: { }, | |
35 | language: { }, | |
36 | licence: { }, | |
37 | category: { } | |
38 | } | |
39 | ||
40 | constructor ( | |
41 | private readonly npmName: string | |
42 | ) {} | |
43 | ||
44 | public resetVideoConstants (npmName: string) { | |
45 | const types: AlterableVideoConstant[] = [ 'language', 'licence', 'category', 'privacy', 'playlistPrivacy' ] | |
46 | for (const type of types) { | |
47 | this.resetConstants({ npmName, type }) | |
48 | } | |
49 | } | |
50 | ||
51 | private resetConstants (parameters: { npmName: string, type: AlterableVideoConstant }) { | |
52 | const { npmName, type } = parameters | |
53 | const updatedConstants = this.updatedVideoConstants[type][npmName] | |
54 | ||
55 | if (!updatedConstants) return | |
56 | ||
57 | for (const added of updatedConstants.added) { | |
58 | delete constantsHash[type][added.key] | |
59 | } | |
60 | ||
61 | for (const deleted of updatedConstants.deleted) { | |
62 | constantsHash[type][deleted.key] = deleted.label | |
63 | } | |
64 | ||
65 | delete this.updatedVideoConstants[type][npmName] | |
66 | } | |
67 | ||
68 | public createVideoConstantManager<K extends number | string>(type: AlterableVideoConstant): ConstantManager<K> { | |
69 | const { npmName } = this | |
70 | return { | |
71 | addConstant: (key: K, label: string) => this.addConstant({ npmName, type, key, label }), | |
72 | deleteConstant: (key: K) => this.deleteConstant({ npmName, type, key }), | |
73 | getConstantValue: (key: K) => constantsHash[type][key], | |
74 | getConstants: () => constantsHash[type] as Record<K, string>, | |
75 | resetConstants: () => this.resetConstants({ npmName, type }) | |
76 | } | |
77 | } | |
78 | ||
79 | private addConstant<T extends string | number> (parameters: { | |
80 | npmName: string | |
81 | type: AlterableVideoConstant | |
82 | key: T | |
83 | label: string | |
84 | }) { | |
85 | const { npmName, type, key, label } = parameters | |
86 | const obj = constantsHash[type] | |
87 | ||
88 | if (obj[key]) { | |
89 | logger.warn('Cannot add %s %s by plugin %s: key already exists.', type, npmName, key) | |
90 | return false | |
91 | } | |
92 | ||
93 | if (!this.updatedVideoConstants[type][npmName]) { | |
94 | this.updatedVideoConstants[type][npmName] = { | |
95 | added: [], | |
96 | deleted: [] | |
97 | } | |
98 | } | |
99 | ||
100 | this.updatedVideoConstants[type][npmName].added.push({ key, label } as VideoConstant) | |
101 | obj[key] = label | |
102 | ||
103 | return true | |
104 | } | |
105 | ||
106 | private deleteConstant<T extends string | number> (parameters: { | |
107 | npmName: string | |
108 | type: AlterableVideoConstant | |
109 | key: T | |
110 | }) { | |
111 | const { npmName, type, key } = parameters | |
112 | const obj = constantsHash[type] | |
113 | ||
114 | if (!obj[key]) { | |
115 | logger.warn('Cannot delete %s by plugin %s: key %s does not exist.', type, npmName, key) | |
116 | return false | |
117 | } | |
118 | ||
119 | if (!this.updatedVideoConstants[type][npmName]) { | |
120 | this.updatedVideoConstants[type][npmName] = { | |
121 | added: [], | |
122 | deleted: [] | |
123 | } | |
124 | } | |
125 | ||
126 | const updatedConstants = this.updatedVideoConstants[type][npmName] | |
127 | ||
128 | const alreadyAdded = updatedConstants.added.find(a => a.key === key) | |
129 | if (alreadyAdded) { | |
130 | updatedConstants.added.filter(a => a.key !== key) | |
131 | } else if (obj[key]) { | |
132 | updatedConstants.deleted.push({ key, label: obj[key] } as VideoConstant) | |
133 | } | |
134 | ||
135 | delete obj[key] | |
136 | ||
137 | return true | |
138 | } | |
139 | } |