diff options
Diffstat (limited to 'shared/extra-utils/server/plugins-command.ts')
-rw-r--r-- | shared/extra-utils/server/plugins-command.ts | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/shared/extra-utils/server/plugins-command.ts b/shared/extra-utils/server/plugins-command.ts new file mode 100644 index 000000000..f06e58a22 --- /dev/null +++ b/shared/extra-utils/server/plugins-command.ts | |||
@@ -0,0 +1,245 @@ | |||
1 | /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ | ||
2 | |||
3 | import { readJSON, writeJSON } from 'fs-extra' | ||
4 | import { join } from 'path' | ||
5 | import { root } from '@server/helpers/core-utils' | ||
6 | import { HttpStatusCode } from '@shared/core-utils' | ||
7 | import { | ||
8 | PeerTubePlugin, | ||
9 | PeerTubePluginIndex, | ||
10 | PeertubePluginIndexList, | ||
11 | PluginPackageJson, | ||
12 | PluginTranslation, | ||
13 | PluginType, | ||
14 | PublicServerSetting, | ||
15 | RegisteredServerSettings, | ||
16 | ResultList | ||
17 | } from '@shared/models' | ||
18 | import { buildServerDirectory } from '../miscs' | ||
19 | import { AbstractCommand, OverrideCommandOptions } from '../shared' | ||
20 | |||
21 | export class PluginsCommand extends AbstractCommand { | ||
22 | |||
23 | static getPluginTestPath (suffix = '') { | ||
24 | return join(root(), 'server', 'tests', 'fixtures', 'peertube-plugin-test' + suffix) | ||
25 | } | ||
26 | |||
27 | list (options: OverrideCommandOptions & { | ||
28 | start?: number | ||
29 | count?: number | ||
30 | sort?: string | ||
31 | pluginType?: PluginType | ||
32 | uninstalled?: boolean | ||
33 | }) { | ||
34 | const { start, count, sort, pluginType, uninstalled } = options | ||
35 | const path = '/api/v1/plugins' | ||
36 | |||
37 | return this.getRequestBody<ResultList<PeerTubePlugin>>({ | ||
38 | ...options, | ||
39 | |||
40 | path, | ||
41 | query: { | ||
42 | start, | ||
43 | count, | ||
44 | sort, | ||
45 | pluginType, | ||
46 | uninstalled | ||
47 | }, | ||
48 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
49 | }) | ||
50 | } | ||
51 | |||
52 | listAvailable (options: OverrideCommandOptions & { | ||
53 | start?: number | ||
54 | count?: number | ||
55 | sort?: string | ||
56 | pluginType?: PluginType | ||
57 | currentPeerTubeEngine?: string | ||
58 | search?: string | ||
59 | expectedStatus?: HttpStatusCode | ||
60 | }) { | ||
61 | const { start, count, sort, pluginType, search, currentPeerTubeEngine } = options | ||
62 | const path = '/api/v1/plugins/available' | ||
63 | |||
64 | const query: PeertubePluginIndexList = { | ||
65 | start, | ||
66 | count, | ||
67 | sort, | ||
68 | pluginType, | ||
69 | currentPeerTubeEngine, | ||
70 | search | ||
71 | } | ||
72 | |||
73 | return this.getRequestBody<ResultList<PeerTubePluginIndex>>({ | ||
74 | ...options, | ||
75 | |||
76 | path, | ||
77 | query, | ||
78 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
79 | }) | ||
80 | } | ||
81 | |||
82 | get (options: OverrideCommandOptions & { | ||
83 | npmName: string | ||
84 | }) { | ||
85 | const path = '/api/v1/plugins/' + options.npmName | ||
86 | |||
87 | return this.getRequestBody<PeerTubePlugin>({ | ||
88 | ...options, | ||
89 | |||
90 | path, | ||
91 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
92 | }) | ||
93 | } | ||
94 | |||
95 | updateSettings (options: OverrideCommandOptions & { | ||
96 | npmName: string | ||
97 | settings: any | ||
98 | }) { | ||
99 | const { npmName, settings } = options | ||
100 | const path = '/api/v1/plugins/' + npmName + '/settings' | ||
101 | |||
102 | return this.putBodyRequest({ | ||
103 | ...options, | ||
104 | |||
105 | path, | ||
106 | fields: { settings }, | ||
107 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
108 | }) | ||
109 | } | ||
110 | |||
111 | getRegisteredSettings (options: OverrideCommandOptions & { | ||
112 | npmName: string | ||
113 | }) { | ||
114 | const path = '/api/v1/plugins/' + options.npmName + '/registered-settings' | ||
115 | |||
116 | return this.getRequestBody<RegisteredServerSettings>({ | ||
117 | ...options, | ||
118 | |||
119 | path, | ||
120 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
121 | }) | ||
122 | } | ||
123 | |||
124 | getPublicSettings (options: OverrideCommandOptions & { | ||
125 | npmName: string | ||
126 | }) { | ||
127 | const { npmName } = options | ||
128 | const path = '/api/v1/plugins/' + npmName + '/public-settings' | ||
129 | |||
130 | return this.getRequestBody<PublicServerSetting>({ | ||
131 | ...options, | ||
132 | |||
133 | path, | ||
134 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
135 | }) | ||
136 | } | ||
137 | |||
138 | getTranslations (options: OverrideCommandOptions & { | ||
139 | locale: string | ||
140 | }) { | ||
141 | const { locale } = options | ||
142 | const path = '/plugins/translations/' + locale + '.json' | ||
143 | |||
144 | return this.getRequestBody<PluginTranslation>({ | ||
145 | ...options, | ||
146 | |||
147 | path, | ||
148 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
149 | }) | ||
150 | } | ||
151 | |||
152 | install (options: OverrideCommandOptions & { | ||
153 | path?: string | ||
154 | npmName?: string | ||
155 | }) { | ||
156 | const { npmName, path } = options | ||
157 | const apiPath = '/api/v1/plugins/install' | ||
158 | |||
159 | return this.postBodyRequest({ | ||
160 | ...options, | ||
161 | |||
162 | path: apiPath, | ||
163 | fields: { npmName, path }, | ||
164 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
165 | }) | ||
166 | } | ||
167 | |||
168 | update (options: OverrideCommandOptions & { | ||
169 | path?: string | ||
170 | npmName?: string | ||
171 | }) { | ||
172 | const { npmName, path } = options | ||
173 | const apiPath = '/api/v1/plugins/update' | ||
174 | |||
175 | return this.postBodyRequest({ | ||
176 | ...options, | ||
177 | |||
178 | path: apiPath, | ||
179 | fields: { npmName, path }, | ||
180 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
181 | }) | ||
182 | } | ||
183 | |||
184 | uninstall (options: OverrideCommandOptions & { | ||
185 | npmName: string | ||
186 | }) { | ||
187 | const { npmName } = options | ||
188 | const apiPath = '/api/v1/plugins/uninstall' | ||
189 | |||
190 | return this.postBodyRequest({ | ||
191 | ...options, | ||
192 | |||
193 | path: apiPath, | ||
194 | fields: { npmName }, | ||
195 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
196 | }) | ||
197 | } | ||
198 | |||
199 | getCSS (options: OverrideCommandOptions = {}) { | ||
200 | const path = '/plugins/global.css' | ||
201 | |||
202 | return this.getRequestText({ | ||
203 | ...options, | ||
204 | |||
205 | path, | ||
206 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
207 | }) | ||
208 | } | ||
209 | |||
210 | getExternalAuth (options: OverrideCommandOptions & { | ||
211 | npmName: string | ||
212 | npmVersion: string | ||
213 | authName: string | ||
214 | query?: any | ||
215 | }) { | ||
216 | const { npmName, npmVersion, authName, query } = options | ||
217 | |||
218 | const path = '/plugins/' + npmName + '/' + npmVersion + '/auth/' + authName | ||
219 | |||
220 | return this.getRequest({ | ||
221 | ...options, | ||
222 | |||
223 | path, | ||
224 | query, | ||
225 | defaultExpectedStatus: HttpStatusCode.OK_200, | ||
226 | redirects: 0 | ||
227 | }) | ||
228 | } | ||
229 | |||
230 | updatePackageJSON (npmName: string, json: any) { | ||
231 | const path = this.getPackageJSONPath(npmName) | ||
232 | |||
233 | return writeJSON(path, json) | ||
234 | } | ||
235 | |||
236 | getPackageJSON (npmName: string): Promise<PluginPackageJson> { | ||
237 | const path = this.getPackageJSONPath(npmName) | ||
238 | |||
239 | return readJSON(path) | ||
240 | } | ||
241 | |||
242 | private getPackageJSONPath (npmName: string) { | ||
243 | return buildServerDirectory(this.server, join('plugins', 'node_modules', npmName, 'package.json')) | ||
244 | } | ||
245 | } | ||