Add plugin translation system
[oweals/peertube.git] / shared / extra-utils / server / plugins.ts
1 import { makeGetRequest, makePostBodyRequest, makePutBodyRequest } from '../requests/requests'
2 import { PluginType } from '../../models/plugins/plugin.type'
3 import { PeertubePluginIndexList } from '../../models/plugins/peertube-plugin-index-list.model'
4 import { readJSON, writeJSON } from 'fs-extra'
5 import { ServerInfo } from './servers'
6 import { root } from '../miscs/miscs'
7 import { join } from 'path'
8
9 function listPlugins (parameters: {
10   url: string,
11   accessToken: string,
12   start?: number,
13   count?: number,
14   sort?: string,
15   pluginType?: PluginType,
16   uninstalled?: boolean,
17   expectedStatus?: number
18 }) {
19   const { url, accessToken, start, count, sort, pluginType, uninstalled, expectedStatus = 200 } = parameters
20   const path = '/api/v1/plugins'
21
22   return makeGetRequest({
23     url,
24     path,
25     token: accessToken,
26     query: {
27       start,
28       count,
29       sort,
30       pluginType,
31       uninstalled
32     },
33     statusCodeExpected: expectedStatus
34   })
35 }
36
37 function listAvailablePlugins (parameters: {
38   url: string,
39   accessToken: string,
40   start?: number,
41   count?: number,
42   sort?: string,
43   pluginType?: PluginType,
44   currentPeerTubeEngine?: string,
45   search?: string
46   expectedStatus?: number
47 }) {
48   const { url, accessToken, start, count, sort, pluginType, search, currentPeerTubeEngine, expectedStatus = 200 } = parameters
49   const path = '/api/v1/plugins/available'
50
51   const query: PeertubePluginIndexList = {
52     start,
53     count,
54     sort,
55     pluginType,
56     currentPeerTubeEngine,
57     search
58   }
59
60   return makeGetRequest({
61     url,
62     path,
63     token: accessToken,
64     query,
65     statusCodeExpected: expectedStatus
66   })
67 }
68
69 function getPlugin (parameters: {
70   url: string,
71   accessToken: string,
72   npmName: string,
73   expectedStatus?: number
74 }) {
75   const { url, accessToken, npmName, expectedStatus = 200 } = parameters
76   const path = '/api/v1/plugins/' + npmName
77
78   return makeGetRequest({
79     url,
80     path,
81     token: accessToken,
82     statusCodeExpected: expectedStatus
83   })
84 }
85
86 function updatePluginSettings (parameters: {
87   url: string,
88   accessToken: string,
89   npmName: string,
90   settings: any,
91   expectedStatus?: number
92 }) {
93   const { url, accessToken, npmName, settings, expectedStatus = 204 } = parameters
94   const path = '/api/v1/plugins/' + npmName + '/settings'
95
96   return makePutBodyRequest({
97     url,
98     path,
99     token: accessToken,
100     fields: { settings },
101     statusCodeExpected: expectedStatus
102   })
103 }
104
105 function getPluginRegisteredSettings (parameters: {
106   url: string,
107   accessToken: string,
108   npmName: string,
109   expectedStatus?: number
110 }) {
111   const { url, accessToken, npmName, expectedStatus = 200 } = parameters
112   const path = '/api/v1/plugins/' + npmName + '/registered-settings'
113
114   return makeGetRequest({
115     url,
116     path,
117     token: accessToken,
118     statusCodeExpected: expectedStatus
119   })
120 }
121
122 function getPublicSettings (parameters: {
123   url: string,
124   npmName: string,
125   expectedStatus?: number
126 }) {
127   const { url, npmName, expectedStatus = 200 } = parameters
128   const path = '/api/v1/plugins/' + npmName + '/public-settings'
129
130   return makeGetRequest({
131     url,
132     path,
133     statusCodeExpected: expectedStatus
134   })
135 }
136
137 function getPluginTranslations (parameters: {
138   url: string,
139   locale: string,
140   expectedStatus?: number
141 }) {
142   const { url, locale, expectedStatus = 200 } = parameters
143   const path = '/plugins/translations/' + locale + '.json'
144
145   return makeGetRequest({
146     url,
147     path,
148     statusCodeExpected: expectedStatus
149   })
150 }
151
152 function installPlugin (parameters: {
153   url: string,
154   accessToken: string,
155   path?: string,
156   npmName?: string
157   expectedStatus?: number
158 }) {
159   const { url, accessToken, npmName, path, expectedStatus = 200 } = parameters
160   const apiPath = '/api/v1/plugins/install'
161
162   return makePostBodyRequest({
163     url,
164     path: apiPath,
165     token: accessToken,
166     fields: { npmName, path },
167     statusCodeExpected: expectedStatus
168   })
169 }
170
171 function updatePlugin (parameters: {
172   url: string,
173   accessToken: string,
174   path?: string,
175   npmName?: string
176   expectedStatus?: number
177 }) {
178   const { url, accessToken, npmName, path, expectedStatus = 200 } = parameters
179   const apiPath = '/api/v1/plugins/update'
180
181   return makePostBodyRequest({
182     url,
183     path: apiPath,
184     token: accessToken,
185     fields: { npmName, path },
186     statusCodeExpected: expectedStatus
187   })
188 }
189
190 function uninstallPlugin (parameters: {
191   url: string,
192   accessToken: string,
193   npmName: string
194   expectedStatus?: number
195 }) {
196   const { url, accessToken, npmName, expectedStatus = 204 } = parameters
197   const apiPath = '/api/v1/plugins/uninstall'
198
199   return makePostBodyRequest({
200     url,
201     path: apiPath,
202     token: accessToken,
203     fields: { npmName },
204     statusCodeExpected: expectedStatus
205   })
206 }
207
208 function getPluginsCSS (url: string) {
209   const path = '/plugins/global.css'
210
211   return makeGetRequest({
212     url,
213     path,
214     statusCodeExpected: 200
215   })
216 }
217
218 function getPackageJSONPath (server: ServerInfo, npmName: string) {
219   return join(root(), 'test' + server.internalServerNumber, 'plugins', 'node_modules', npmName, 'package.json')
220 }
221
222 function updatePluginPackageJSON (server: ServerInfo, npmName: string, json: any) {
223   const path = getPackageJSONPath(server, npmName)
224
225   return writeJSON(path, json)
226 }
227
228 function getPluginPackageJSON (server: ServerInfo, npmName: string) {
229   const path = getPackageJSONPath(server, npmName)
230
231   return readJSON(path)
232 }
233
234 function getPluginTestPath (suffix = '') {
235   return join(root(), 'server', 'tests', 'fixtures', 'peertube-plugin-test' + suffix)
236 }
237
238 export {
239   listPlugins,
240   listAvailablePlugins,
241   installPlugin,
242   getPluginTranslations,
243   getPluginsCSS,
244   updatePlugin,
245   getPlugin,
246   uninstallPlugin,
247   updatePluginSettings,
248   getPluginRegisteredSettings,
249   getPackageJSONPath,
250   updatePluginPackageJSON,
251   getPluginPackageJSON,
252   getPluginTestPath,
253   getPublicSettings
254 }