/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
import { expect } from 'chai'
import { readJSON, writeJSON } from 'fs-extra'
import { join } from 'path'
import { RegisteredServerSettings } from '@shared/models'
import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
import { PeertubePluginIndexList } from '../../models/plugins/plugin-index/peertube-plugin-index-list.model'
import { PluginType } from '../../models/plugins/plugin.type'
import { buildServerDirectory, root } from '../miscs/miscs'
import { makeGetRequest, makePostBodyRequest, makePutBodyRequest } from '../requests/requests'
import { ServerInfo } from './servers'
function listPlugins (parameters: {
url: string
accessToken: string
start?: number
count?: number
sort?: string
pluginType?: PluginType
uninstalled?: boolean
expectedStatus?: HttpStatusCode
}) {
const { url, accessToken, start, count, sort, pluginType, uninstalled, expectedStatus = HttpStatusCode.OK_200 } = parameters
const path = '/api/v1/plugins'
return makeGetRequest({
url,
path,
token: accessToken,
query: {
start,
count,
sort,
pluginType,
uninstalled
},
statusCodeExpected: expectedStatus
})
}
function listAvailablePlugins (parameters: {
url: string
accessToken: string
start?: number
count?: number
sort?: string
pluginType?: PluginType
currentPeerTubeEngine?: string
search?: string
expectedStatus?: HttpStatusCode
}) {
const {
url,
accessToken,
start,
count,
sort,
pluginType,
search,
currentPeerTubeEngine,
expectedStatus = HttpStatusCode.OK_200
} = parameters
const path = '/api/v1/plugins/available'
const query: PeertubePluginIndexList = {
start,
count,
sort,
pluginType,
currentPeerTubeEngine,
search
}
return makeGetRequest({
url,
path,
token: accessToken,
query,
statusCodeExpected: expectedStatus
})
}
function getPlugin (parameters: {
url: string
accessToken: string
npmName: string
expectedStatus?: HttpStatusCode
}) {
const { url, accessToken, npmName, expectedStatus = HttpStatusCode.OK_200 } = parameters
const path = '/api/v1/plugins/' + npmName
return makeGetRequest({
url,
path,
token: accessToken,
statusCodeExpected: expectedStatus
})
}
function updatePluginSettings (parameters: {
url: string
accessToken: string
npmName: string
settings: any
expectedStatus?: HttpStatusCode
}) {
const { url, accessToken, npmName, settings, expectedStatus = HttpStatusCode.NO_CONTENT_204 } = parameters
const path = '/api/v1/plugins/' + npmName + '/settings'
return makePutBodyRequest({
url,
path,
token: accessToken,
fields: { settings },
statusCodeExpected: expectedStatus
})
}
function getPluginRegisteredSettings (parameters: {
url: string
accessToken: string
npmName: string
expectedStatus?: HttpStatusCode
}) {
const { url, accessToken, npmName, expectedStatus = HttpStatusCode.OK_200 } = parameters
const path = '/api/v1/plugins/' + npmName + '/registered-settings'
return makeGetRequest({
url,
path,
token: accessToken,
statusCodeExpected: expectedStatus
})
}
async function testHelloWorldRegisteredSettings (server: ServerInfo) {
const res = await getPluginRegisteredSettings({
url: server.url,
accessToken: server.accessToken,
npmName: 'peertube-plugin-hello-world'
})
const registeredSettings = (res.body as RegisteredServerSettings).registeredSettings
expect(registeredSettings).to.have.length.at.least(1)
const adminNameSettings = registeredSettings.find(s => s.name === 'admin-name')
expect(adminNameSettings).to.not.be.undefined
}
function getPublicSettings (parameters: {
url: string
npmName: string
expectedStatus?: HttpStatusCode
}) {
const { url, npmName, expectedStatus = HttpStatusCode.OK_200 } = parameters
const path = '/api/v1/plugins/' + npmName + '/public-settings'
return makeGetRequest({
url,
path,
statusCodeExpected: expectedStatus
})
}
function getPluginTranslations (parameters: {
url: string
locale: string
expectedStatus?: HttpStatusCode
}) {
const { url, locale, expectedStatus = HttpStatusCode.OK_200 } = parameters
const path = '/plugins/translations/' + locale + '.json'
return makeGetRequest({
url,
path,
statusCodeExpected: expectedStatus
})
}
function installPlugin (parameters: {
url: string
accessToken: string
path?: string
npmName?: string
expectedStatus?: HttpStatusCode
}) {
const { url, accessToken, npmName, path, expectedStatus = HttpStatusCode.OK_200 } = parameters
const apiPath = '/api/v1/plugins/install'
return makePostBodyRequest({
url,
path: apiPath,
token: accessToken,
fields: { npmName, path },
statusCodeExpected: expectedStatus
})
}
function updatePlugin (parameters: {
url: string
accessToken: string
path?: string
npmName?: string
expectedStatus?: HttpStatusCode
}) {
const { url, accessToken, npmName, path, expectedStatus = HttpStatusCode.OK_200 } = parameters
const apiPath = '/api/v1/plugins/update'
return makePostBodyRequest({
url,
path: apiPath,
token: accessToken,
fields: { npmName, path },
statusCodeExpected: expectedStatus
})
}
function uninstallPlugin (parameters: {
url: string
accessToken: string
npmName: string
expectedStatus?: HttpStatusCode
}) {
const { url, accessToken, npmName, expectedStatus = HttpStatusCode.NO_CONTENT_204 } = parameters
const apiPath = '/api/v1/plugins/uninstall'
return makePostBodyRequest({
url,
path: apiPath,
token: accessToken,
fields: { npmName },
statusCodeExpected: expectedStatus
})
}
function getPluginsCSS (url: string) {
const path = '/plugins/global.css'
return makeGetRequest({
url,
path,
statusCodeExpected: HttpStatusCode.OK_200
})
}
function getPackageJSONPath (server: ServerInfo, npmName: string) {
return buildServerDirectory(server, join('plugins', 'node_modules', npmName, 'package.json'))
}
function updatePluginPackageJSON (server: ServerInfo, npmName: string, json: any) {
const path = getPackageJSONPath(server, npmName)
return writeJSON(path, json)
}
function getPluginPackageJSON (server: ServerInfo, npmName: string) {
const path = getPackageJSONPath(server, npmName)
return readJSON(path)
}
function getPluginTestPath (suffix = '') {
return join(root(), 'server', 'tests', 'fixtures', 'peertube-plugin-test' + suffix)
}
function getExternalAuth (options: {
url: string
npmName: string
npmVersion: string
authName: string
query?: any
statusCodeExpected?: HttpStatusCode
}) {
const { url, npmName, npmVersion, authName, statusCodeExpected, query } = options
const path = '/plugins/' + npmName + '/' + npmVersion + '/auth/' + authName
return makeGetRequest({
url,
path,
query,
statusCodeExpected: statusCodeExpected || HttpStatusCode.OK_200,
redirects: 0
})
}
export {
listPlugins,
listAvailablePlugins,
installPlugin,
getPluginTranslations,
getPluginsCSS,
updatePlugin,
getPlugin,
uninstallPlugin,
testHelloWorldRegisteredSettings,
updatePluginSettings,
getPluginRegisteredSettings,
getPackageJSONPath,
updatePluginPackageJSON,
getPluginPackageJSON,
getPluginTestPath,
getPublicSettings,
getExternalAuth
}