aboutsummaryrefslogblamecommitdiffhomepage
path: root/shared/extra-utils/server/plugins.ts
blob: d53e5b3828090165b0524711ee7986686c2837ab (plain) (tree)
1
2
3
4
5
6
7
8


                                                                                              
                                              
                           
                                                         

                                                                                                            



                                                                                              

                                   






                         
                                 
    
                                                                                                                              









                                

                 




                                      
                                            






                                
                 
                                 
    










                                          



















                                          
                                 


                     
                                 
    
                                                                                          









                                           
                                            



                     
                                 
    
                                                                                                            

                                                         
                             


                       
                         




                                                   


                     
                                 
    
                                                                                          









                                                                    














                                                                                      
                                         

                 
                                 
    
                                                                             








                                                                
                                             

                
                                 
    
                                                                            








                                                          
                                     


                     
                  
                                 
    
                                                                                                










                                           
                                    


                     
                  
                                 
    
                                                                                                










                                          
                                       

                     
                 
                                 
    
                                                                                                  










                                             





                                      
                                             



                                                                   
                                                                                               













                                                                                   



                                                                                     





                                    
                                     








                                                                                   
                                                                    



                

              
                       
                
                        
                
               

                  
                                   



                              
                       
                    

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