From 428ccb8b7a44ce60cabb7401a5464cf5fcbd4dba Mon Sep 17 00:00:00 2001
From: Chocobozzz <me@florianbigard.com>
Date: Tue, 11 May 2021 12:04:47 +0200
Subject: [PATCH] Reorganize plugin models

---
 .../plugin-list-installed.component.ts        |  3 +-
 .../plugin-search/plugin-search.component.ts  |  3 +-
 .../shared/video-edit.component.ts            | 11 +++++--
 client/src/root-helpers/plugins.ts            |  7 ++--
 server/controllers/api/plugins.ts             | 33 ++++++++++---------
 server/lib/plugins/hooks.ts                   |  6 ++--
 server/lib/plugins/plugin-index.ts            | 20 +++++------
 server/lib/plugins/plugin-manager.ts          | 14 +++-----
 server/lib/plugins/register-helpers.ts        |  4 +--
 server/middlewares/validators/plugins.ts      | 18 +++++-----
 server/models/server/plugin.ts                |  4 +--
 server/tests/api/check-params/plugins.ts      | 12 +++----
 server/tests/api/server/plugins.ts            | 10 ++----
 server/tools/peertube-plugins.ts              |  3 +-
 shared/extra-utils/server/plugins.ts          |  4 +--
 .../plugins/{ => client}/client-hook.model.ts |  0
 shared/models/plugins/client/index.ts         |  6 ++++
 .../{ => client}/plugin-client-scope.type.ts  |  0
 .../plugin-element-placeholder.type.ts        |  0
 .../register-client-form-field.model.ts       |  0
 .../register-client-hook.model.ts             |  0
 .../register-client-settings-script.model.ts  |  2 +-
 shared/models/plugins/index.ts                | 28 ++--------------
 shared/models/plugins/plugin-index/index.ts   |  3 ++
 .../peertube-plugin-index-list.model.ts       |  2 +-
 .../peertube-plugin-index.model.ts            |  0
 .../peertube-plugin-latest-version.model.ts   |  0
 .../plugins/plugin-package-json.model.ts      |  2 +-
 shared/models/plugins/server/api/index.ts     |  3 ++
 .../{ => server/api}/install-plugin.model.ts  |  0
 .../{ => server/api}/manage-plugin.model.ts   |  0
 .../{ => server/api}/peertube-plugin.model.ts |  2 +-
 shared/models/plugins/server/index.ts         |  6 ++++
 .../models/plugins/server/managers/index.ts   |  9 +++++
 .../plugin-playlist-privacy-manager.model.ts  |  2 +-
 .../plugin-settings-manager.model.ts          |  0
 .../managers}/plugin-storage-manager.model.ts |  0
 .../plugin-transcoding-manager.model.ts       |  2 +-
 .../plugin-video-category-manager.model.ts    |  0
 .../plugin-video-language-manager.model.ts    |  0
 .../plugin-video-licence-manager.model.ts     |  0
 .../plugin-video-privacy-manager.model.ts     |  2 +-
 .../{ => server}/plugin-translation.model.ts  |  0
 .../register-server-hook.model.ts             |  0
 .../plugins/{ => server}/server-hook.model.ts |  0
 .../models/plugins/server/settings/index.ts   |  2 ++
 .../settings}/public-server.setting.ts        |  0
 .../register-server-setting.model.ts          |  2 +-
 48 files changed, 113 insertions(+), 112 deletions(-)
 rename shared/models/plugins/{ => client}/client-hook.model.ts (100%)
 create mode 100644 shared/models/plugins/client/index.ts
 rename shared/models/plugins/{ => client}/plugin-client-scope.type.ts (100%)
 rename shared/models/plugins/{ => client}/plugin-element-placeholder.type.ts (100%)
 rename shared/models/plugins/{ => client}/register-client-form-field.model.ts (100%)
 rename shared/models/plugins/{ => client}/register-client-hook.model.ts (100%)
 rename shared/models/plugins/{ => client}/register-client-settings-script.model.ts (69%)
 create mode 100644 shared/models/plugins/plugin-index/index.ts
 rename shared/models/plugins/{ => plugin-index}/peertube-plugin-index-list.model.ts (79%)
 rename shared/models/plugins/{ => plugin-index}/peertube-plugin-index.model.ts (100%)
 rename shared/models/plugins/{ => plugin-index}/peertube-plugin-latest-version.model.ts (100%)
 create mode 100644 shared/models/plugins/server/api/index.ts
 rename shared/models/plugins/{ => server/api}/install-plugin.model.ts (100%)
 rename shared/models/plugins/{ => server/api}/manage-plugin.model.ts (100%)
 rename shared/models/plugins/{ => server/api}/peertube-plugin.model.ts (86%)
 create mode 100644 shared/models/plugins/server/index.ts
 create mode 100644 shared/models/plugins/server/managers/index.ts
 rename shared/models/plugins/{ => server/managers}/plugin-playlist-privacy-manager.model.ts (65%)
 rename shared/models/plugins/{ => server/managers}/plugin-settings-manager.model.ts (100%)
 rename shared/models/plugins/{ => server/managers}/plugin-storage-manager.model.ts (100%)
 rename shared/models/plugins/{ => server/managers}/plugin-transcoding-manager.model.ts (85%)
 rename shared/models/plugins/{ => server/managers}/plugin-video-category-manager.model.ts (100%)
 rename shared/models/plugins/{ => server/managers}/plugin-video-language-manager.model.ts (100%)
 rename shared/models/plugins/{ => server/managers}/plugin-video-licence-manager.model.ts (100%)
 rename shared/models/plugins/{ => server/managers}/plugin-video-privacy-manager.model.ts (72%)
 rename shared/models/plugins/{ => server}/plugin-translation.model.ts (100%)
 rename shared/models/plugins/{ => server}/register-server-hook.model.ts (100%)
 rename shared/models/plugins/{ => server}/server-hook.model.ts (100%)
 create mode 100644 shared/models/plugins/server/settings/index.ts
 rename shared/models/plugins/{ => server/settings}/public-server.setting.ts (100%)
 rename shared/models/plugins/{ => server/settings}/register-server-setting.model.ts (83%)

diff --git a/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts b/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts
index 1a95980ae..6af224920 100644
--- a/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts
+++ b/client/src/app/+admin/plugins/plugin-list-installed/plugin-list-installed.component.ts
@@ -5,8 +5,7 @@ import { PluginApiService } from '@app/+admin/plugins/shared/plugin-api.service'
 import { ComponentPagination, ConfirmService, hasMoreItems, Notifier } from '@app/core'
 import { PluginService } from '@app/core/plugins/plugin.service'
 import { compareSemVer } from '@shared/core-utils/miscs/miscs'
-import { PeerTubePlugin } from '@shared/models/plugins/peertube-plugin.model'
-import { PluginType } from '@shared/models/plugins/plugin.type'
+import { PeerTubePlugin, PluginType } from '@shared/models'
 
 @Component({
   selector: 'my-plugin-list-installed',
diff --git a/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts b/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
index d2c179aba..0a6e57904 100644
--- a/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
+++ b/client/src/app/+admin/plugins/plugin-search/plugin-search.component.ts
@@ -4,8 +4,7 @@ import { Component, OnInit } from '@angular/core'
 import { ActivatedRoute, Router } from '@angular/router'
 import { PluginApiService } from '@app/+admin/plugins/shared/plugin-api.service'
 import { ComponentPagination, ConfirmService, hasMoreItems, Notifier, PluginService } from '@app/core'
-import { PeerTubePluginIndex } from '@shared/models/plugins/peertube-plugin-index.model'
-import { PluginType } from '@shared/models/plugins/plugin.type'
+import { PeerTubePluginIndex, PluginType } from '@shared/models'
 
 @Component({
   selector: 'my-plugin-search',
diff --git a/client/src/app/+videos/+video-edit/shared/video-edit.component.ts b/client/src/app/+videos/+video-edit/shared/video-edit.component.ts
index 34119f7ab..3d916dbce 100644
--- a/client/src/app/+videos/+video-edit/shared/video-edit.component.ts
+++ b/client/src/app/+videos/+video-edit/shared/video-edit.component.ts
@@ -21,8 +21,15 @@ import {
 import { FormReactiveValidationMessages, FormValidatorService } from '@app/shared/shared-forms'
 import { InstanceService } from '@app/shared/shared-instance'
 import { VideoCaptionEdit, VideoEdit, VideoService } from '@app/shared/shared-main'
-import { LiveVideo, ServerConfig, VideoConstant, VideoDetails, VideoPrivacy } from '@shared/models'
-import { RegisterClientFormFieldOptions, RegisterClientVideoFieldOptions } from '@shared/models/plugins/register-client-form-field.model'
+import {
+  LiveVideo,
+  RegisterClientFormFieldOptions,
+  RegisterClientVideoFieldOptions,
+  ServerConfig,
+  VideoConstant,
+  VideoDetails,
+  VideoPrivacy
+} from '@shared/models'
 import { I18nPrimengCalendarService } from './i18n-primeng-calendar.service'
 import { VideoCaptionAddModalComponent } from './video-caption-add-modal.component'
 import { VideoEditType } from './video-edit.type'
diff --git a/client/src/root-helpers/plugins.ts b/client/src/root-helpers/plugins.ts
index 5344c0468..8c1c858b7 100644
--- a/client/src/root-helpers/plugins.ts
+++ b/client/src/root-helpers/plugins.ts
@@ -1,14 +1,15 @@
 import { RegisterClientHelpers } from 'src/types/register-client-option.model'
 import { getHookType, internalRunHook } from '@shared/core-utils/plugins/hooks'
-import { RegisterClientFormFieldOptions, RegisterClientVideoFieldOptions } from '@shared/models/plugins/register-client-form-field.model'
 import {
   ClientHookName,
   clientHookObject,
   ClientScript,
   PluginType,
+  RegisterClientFormFieldOptions,
   RegisterClientHookOptions,
-  ServerConfigPlugin,
-  RegisterClientSettingsScript
+  RegisterClientSettingsScript,
+  RegisterClientVideoFieldOptions,
+  ServerConfigPlugin
 } from '../../../shared/models'
 import { ClientScript as ClientScriptModule } from '../types/client-script.model'
 import { importModule } from './utils'
diff --git a/server/controllers/api/plugins.ts b/server/controllers/api/plugins.ts
index a186de010..e18eed332 100644
--- a/server/controllers/api/plugins.ts
+++ b/server/controllers/api/plugins.ts
@@ -1,16 +1,18 @@
 import * as express from 'express'
-import { getFormattedObjects } from '../../helpers/utils'
+import { logger } from '@server/helpers/logger'
+import { getFormattedObjects } from '@server/helpers/utils'
+import { listAvailablePluginsFromIndex } from '@server/lib/plugins/plugin-index'
+import { PluginManager } from '@server/lib/plugins/plugin-manager'
 import {
   asyncMiddleware,
   authenticate,
+  availablePluginsSortValidator,
   ensureUserHasRight,
   paginationValidator,
+  pluginsSortValidator,
   setDefaultPagination,
   setDefaultSort
-} from '../../middlewares'
-import { availablePluginsSortValidator, pluginsSortValidator } from '../../middlewares/validators'
-import { PluginModel } from '../../models/server/plugin'
-import { UserRight } from '../../../shared/models/users'
+} from '@server/middlewares'
 import {
   existingPluginValidator,
   installOrUpdatePluginValidator,
@@ -18,16 +20,17 @@ import {
   listPluginsValidator,
   uninstallPluginValidator,
   updatePluginSettingsValidator
-} from '../../middlewares/validators/plugins'
-import { PluginManager } from '../../lib/plugins/plugin-manager'
-import { InstallOrUpdatePlugin } from '../../../shared/models/plugins/install-plugin.model'
-import { ManagePlugin } from '../../../shared/models/plugins/manage-plugin.model'
-import { logger } from '../../helpers/logger'
-import { listAvailablePluginsFromIndex } from '../../lib/plugins/plugin-index'
-import { PeertubePluginIndexList } from '../../../shared/models/plugins/peertube-plugin-index-list.model'
-import { RegisteredServerSettings } from '../../../shared/models/plugins/register-server-setting.model'
-import { PublicServerSetting } from '../../../shared/models/plugins/public-server.setting'
-import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
+} from '@server/middlewares/validators/plugins'
+import { PluginModel } from '@server/models/server/plugin'
+import { HttpStatusCode } from '@shared/core-utils'
+import {
+  InstallOrUpdatePlugin,
+  ManagePlugin,
+  PeertubePluginIndexList,
+  PublicServerSetting,
+  RegisteredServerSettings,
+  UserRight
+} from '@shared/models'
 
 const pluginRouter = express.Router()
 
diff --git a/server/lib/plugins/hooks.ts b/server/lib/plugins/hooks.ts
index aa92f03cc..5e97b52a0 100644
--- a/server/lib/plugins/hooks.ts
+++ b/server/lib/plugins/hooks.ts
@@ -1,7 +1,7 @@
-import { ServerActionHookName, ServerFilterHookName } from '../../../shared/models/plugins/server-hook.model'
-import { PluginManager } from './plugin-manager'
-import { logger } from '../../helpers/logger'
 import * as Bluebird from 'bluebird'
+import { ServerActionHookName, ServerFilterHookName } from '../../../shared/models'
+import { logger } from '../../helpers/logger'
+import { PluginManager } from './plugin-manager'
 
 type PromiseFunction <U, T> = (params: U) => Promise<T> | Bluebird<T>
 type RawFunction <U, T> = (params: U) => T
diff --git a/server/lib/plugins/plugin-index.ts b/server/lib/plugins/plugin-index.ts
index 165bc91b3..119cee8e0 100644
--- a/server/lib/plugins/plugin-index.ts
+++ b/server/lib/plugins/plugin-index.ts
@@ -1,16 +1,16 @@
 import { sanitizeUrl } from '@server/helpers/core-utils'
-import { ResultList } from '../../../shared/models'
-import { PeertubePluginIndexList } from '../../../shared/models/plugins/peertube-plugin-index-list.model'
-import { PeerTubePluginIndex } from '../../../shared/models/plugins/peertube-plugin-index.model'
+import { logger } from '@server/helpers/logger'
+import { doJSONRequest } from '@server/helpers/requests'
+import { CONFIG } from '@server/initializers/config'
+import { PEERTUBE_VERSION } from '@server/initializers/constants'
+import { PluginModel } from '@server/models/server/plugin'
 import {
+  PeerTubePluginIndex,
+  PeertubePluginIndexList,
   PeertubePluginLatestVersionRequest,
-  PeertubePluginLatestVersionResponse
-} from '../../../shared/models/plugins/peertube-plugin-latest-version.model'
-import { logger } from '../../helpers/logger'
-import { doJSONRequest } from '../../helpers/requests'
-import { CONFIG } from '../../initializers/config'
-import { PEERTUBE_VERSION } from '../../initializers/constants'
-import { PluginModel } from '../../models/server/plugin'
+  PeertubePluginLatestVersionResponse,
+  ResultList
+} from '@shared/models'
 import { PluginManager } from './plugin-manager'
 
 async function listAvailablePluginsFromIndex (options: PeertubePluginIndexList) {
diff --git a/server/lib/plugins/plugin-manager.ts b/server/lib/plugins/plugin-manager.ts
index ba9814383..6b9a255a4 100644
--- a/server/lib/plugins/plugin-manager.ts
+++ b/server/lib/plugins/plugin-manager.ts
@@ -4,16 +4,11 @@ import { createReadStream, createWriteStream } from 'fs'
 import { ensureDir, outputFile, readJSON } from 'fs-extra'
 import { basename, join } from 'path'
 import { MOAuthTokenUser, MUser } from '@server/types/models'
-import { RegisterServerHookOptions } from '@shared/models/plugins/register-server-hook.model'
+import { getCompleteLocale } from '@shared/core-utils'
+import { ClientScript, PluginPackageJson, PluginTranslation, PluginTranslationPaths, RegisterServerHookOptions } from '@shared/models'
 import { getHookType, internalRunHook } from '../../../shared/core-utils/plugins/hooks'
-import {
-  ClientScript,
-  PluginPackageJson,
-  PluginTranslationPaths as PackagePluginTranslations
-} from '../../../shared/models/plugins/plugin-package-json.model'
-import { PluginTranslation } from '../../../shared/models/plugins/plugin-translation.model'
 import { PluginType } from '../../../shared/models/plugins/plugin.type'
-import { ServerHook, ServerHookName } from '../../../shared/models/plugins/server-hook.model'
+import { ServerHook, ServerHookName } from '../../../shared/models/plugins/server/server-hook.model'
 import { isLibraryCodeValid, isPackageJSONValid } from '../../helpers/custom-validators/plugins'
 import { logger } from '../../helpers/logger'
 import { CONFIG } from '../../initializers/config'
@@ -23,7 +18,6 @@ import { PluginLibrary, RegisterServerAuthExternalOptions, RegisterServerAuthPas
 import { ClientHtml } from '../client-html'
 import { RegisterHelpers } from './register-helpers'
 import { installNpmPlugin, installNpmPluginFromDisk, removeNpmPlugin } from './yarn'
-import { getCompleteLocale } from '@shared/core-utils'
 
 export interface RegisteredPlugin {
   npmName: string
@@ -443,7 +437,7 @@ export class PluginManager implements ServerHook {
 
   // ###################### Translations ######################
 
-  private async addTranslations (plugin: PluginModel, npmName: string, translationPaths: PackagePluginTranslations) {
+  private async addTranslations (plugin: PluginModel, npmName: string, translationPaths: PluginTranslationPaths) {
     for (const locale of Object.keys(translationPaths)) {
       const path = translationPaths[locale]
       const json = await readJSON(join(this.getPluginPath(plugin.name, plugin.type), path))
diff --git a/server/lib/plugins/register-helpers.ts b/server/lib/plugins/register-helpers.ts
index 203217b70..f5b573370 100644
--- a/server/lib/plugins/register-helpers.ts
+++ b/server/lib/plugins/register-helpers.ts
@@ -26,9 +26,9 @@ import {
   PluginVideoLicenceManager,
   PluginVideoPrivacyManager,
   RegisterServerHookOptions,
-  RegisterServerSettingOptions
+  RegisterServerSettingOptions,
+  serverHookObject
 } from '@shared/models'
-import { serverHookObject } from '@shared/models/plugins/server-hook.model'
 import { VideoTranscodingProfilesManager } from '../transcoding/video-transcoding-profiles'
 import { buildPluginHelpers } from './plugin-helpers-builder'
 
diff --git a/server/middlewares/validators/plugins.ts b/server/middlewares/validators/plugins.ts
index ab87fe720..2c47ec5bb 100644
--- a/server/middlewares/validators/plugins.ts
+++ b/server/middlewares/validators/plugins.ts
@@ -1,15 +1,15 @@
 import * as express from 'express'
 import { body, param, query, ValidationChain } from 'express-validator'
-import { logger } from '../../helpers/logger'
-import { areValidationErrors } from './utils'
-import { isNpmPluginNameValid, isPluginNameValid, isPluginTypeValid, isPluginVersionValid } from '../../helpers/custom-validators/plugins'
-import { PluginManager } from '../../lib/plugins/plugin-manager'
-import { isBooleanValid, isSafePath, toBooleanOrNull, exists, toIntOrNull } from '../../helpers/custom-validators/misc'
-import { PluginModel } from '../../models/server/plugin'
-import { InstallOrUpdatePlugin } from '../../../shared/models/plugins/install-plugin.model'
-import { PluginType } from '../../../shared/models/plugins/plugin.type'
-import { CONFIG } from '../../initializers/config'
 import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
+import { PluginType } from '../../../shared/models/plugins/plugin.type'
+import { InstallOrUpdatePlugin } from '../../../shared/models/plugins/server/api/install-plugin.model'
+import { exists, isBooleanValid, isSafePath, toBooleanOrNull, toIntOrNull } from '../../helpers/custom-validators/misc'
+import { isNpmPluginNameValid, isPluginNameValid, isPluginTypeValid, isPluginVersionValid } from '../../helpers/custom-validators/plugins'
+import { logger } from '../../helpers/logger'
+import { CONFIG } from '../../initializers/config'
+import { PluginManager } from '../../lib/plugins/plugin-manager'
+import { PluginModel } from '../../models/server/plugin'
+import { areValidationErrors } from './utils'
 
 const getPluginValidator = (pluginType: PluginType, withVersion = true) => {
   const validators: (ValidationChain | express.Handler)[] = [
diff --git a/server/models/server/plugin.ts b/server/models/server/plugin.ts
index 82387af6a..94c9b04bf 100644
--- a/server/models/server/plugin.ts
+++ b/server/models/server/plugin.ts
@@ -1,9 +1,7 @@
 import { FindAndCountOptions, json, QueryTypes } from 'sequelize'
 import { AllowNull, Column, CreatedAt, DataType, DefaultScope, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
 import { MPlugin, MPluginFormattable } from '@server/types/models'
-import { PeerTubePlugin } from '../../../shared/models/plugins/peertube-plugin.model'
-import { PluginType } from '../../../shared/models/plugins/plugin.type'
-import { RegisterServerSettingOptions } from '../../../shared/models/plugins/register-server-setting.model'
+import { PeerTubePlugin, PluginType, RegisterServerSettingOptions } from '../../../shared/models'
 import {
   isPluginDescriptionValid,
   isPluginHomepage,
diff --git a/server/tests/api/check-params/plugins.ts b/server/tests/api/check-params/plugins.ts
index 6e540bcbb..a833fe6ff 100644
--- a/server/tests/api/check-params/plugins.ts
+++ b/server/tests/api/check-params/plugins.ts
@@ -1,7 +1,7 @@
 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
 
 import 'mocha'
-
+import { HttpStatusCode } from '@shared/core-utils'
 import {
   checkBadCountPagination,
   checkBadSortPagination,
@@ -11,14 +11,14 @@ import {
   flushAndRunServer,
   immutableAssign,
   installPlugin,
-  makeGetRequest, makePostBodyRequest, makePutBodyRequest,
+  makeGetRequest,
+  makePostBodyRequest,
+  makePutBodyRequest,
   ServerInfo,
   setAccessTokensToServers,
   userLogin
-} from '../../../../shared/extra-utils'
-import { PluginType } from '../../../../shared/models/plugins/plugin.type'
-import { PeerTubePlugin } from '../../../../shared/models/plugins/peertube-plugin.model'
-import { HttpStatusCode } from '../../../../shared/core-utils/miscs/http-error-codes'
+} from '@shared/extra-utils'
+import { PeerTubePlugin, PluginType } from '@shared/models'
 
 describe('Test server plugins API validators', function () {
   let server: ServerInfo
diff --git a/server/tests/api/server/plugins.ts b/server/tests/api/server/plugins.ts
index 1c6eabe6d..3c09acc9a 100644
--- a/server/tests/api/server/plugins.ts
+++ b/server/tests/api/server/plugins.ts
@@ -28,14 +28,8 @@ import {
   updatePluginSettings,
   wait,
   waitUntilLog
-} from '../../../../shared/extra-utils'
-import { PeerTubePluginIndex } from '../../../../shared/models/plugins/peertube-plugin-index.model'
-import { PeerTubePlugin } from '../../../../shared/models/plugins/peertube-plugin.model'
-import { PluginPackageJson } from '../../../../shared/models/plugins/plugin-package-json.model'
-import { PluginType } from '../../../../shared/models/plugins/plugin.type'
-import { PublicServerSetting } from '../../../../shared/models/plugins/public-server.setting'
-import { ServerConfig } from '../../../../shared/models/server'
-import { User } from '../../../../shared/models/users'
+} from '@shared/extra-utils'
+import { PeerTubePlugin, PeerTubePluginIndex, PluginPackageJson, PluginType, PublicServerSetting, ServerConfig, User } from '@shared/models'
 
 const expect = chai.expect
 
diff --git a/server/tools/peertube-plugins.ts b/server/tools/peertube-plugins.ts
index c8a576844..cb591377b 100644
--- a/server/tools/peertube-plugins.ts
+++ b/server/tools/peertube-plugins.ts
@@ -4,10 +4,9 @@ import { registerTSPaths } from '../helpers/register-ts-paths'
 registerTSPaths()
 
 import * as program from 'commander'
-import { PluginType } from '../../shared/models/plugins/plugin.type'
 import { installPlugin, listPlugins, uninstallPlugin, updatePlugin } from '../../shared/extra-utils/server/plugins'
 import { getAdminTokenOrDie, getServerCredentials } from './cli'
-import { PeerTubePlugin } from '../../shared/models/plugins/peertube-plugin.model'
+import { PeerTubePlugin, PluginType } from '../../shared/models'
 import { isAbsolute } from 'path'
 import * as CliTable3 from 'cli-table3'
 import commander = require('commander')
diff --git a/shared/extra-utils/server/plugins.ts b/shared/extra-utils/server/plugins.ts
index 864954ee7..d53e5b382 100644
--- a/shared/extra-utils/server/plugins.ts
+++ b/shared/extra-utils/server/plugins.ts
@@ -4,12 +4,12 @@ import { expect } from 'chai'
 import { readJSON, writeJSON } from 'fs-extra'
 import { join } from 'path'
 import { RegisteredServerSettings } from '@shared/models'
-import { PeertubePluginIndexList } from '../../models/plugins/peertube-plugin-index-list.model'
+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'
-import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
 
 function listPlugins (parameters: {
   url: string
diff --git a/shared/models/plugins/client-hook.model.ts b/shared/models/plugins/client/client-hook.model.ts
similarity index 100%
rename from shared/models/plugins/client-hook.model.ts
rename to shared/models/plugins/client/client-hook.model.ts
diff --git a/shared/models/plugins/client/index.ts b/shared/models/plugins/client/index.ts
new file mode 100644
index 000000000..6dfc6351f
--- /dev/null
+++ b/shared/models/plugins/client/index.ts
@@ -0,0 +1,6 @@
+export * from './client-hook.model'
+export * from './plugin-client-scope.type'
+export * from './plugin-element-placeholder.type'
+export * from './register-client-form-field.model'
+export * from './register-client-hook.model'
+export * from './register-client-settings-script.model'
diff --git a/shared/models/plugins/plugin-client-scope.type.ts b/shared/models/plugins/client/plugin-client-scope.type.ts
similarity index 100%
rename from shared/models/plugins/plugin-client-scope.type.ts
rename to shared/models/plugins/client/plugin-client-scope.type.ts
diff --git a/shared/models/plugins/plugin-element-placeholder.type.ts b/shared/models/plugins/client/plugin-element-placeholder.type.ts
similarity index 100%
rename from shared/models/plugins/plugin-element-placeholder.type.ts
rename to shared/models/plugins/client/plugin-element-placeholder.type.ts
diff --git a/shared/models/plugins/register-client-form-field.model.ts b/shared/models/plugins/client/register-client-form-field.model.ts
similarity index 100%
rename from shared/models/plugins/register-client-form-field.model.ts
rename to shared/models/plugins/client/register-client-form-field.model.ts
diff --git a/shared/models/plugins/register-client-hook.model.ts b/shared/models/plugins/client/register-client-hook.model.ts
similarity index 100%
rename from shared/models/plugins/register-client-hook.model.ts
rename to shared/models/plugins/client/register-client-hook.model.ts
diff --git a/shared/models/plugins/register-client-settings-script.model.ts b/shared/models/plugins/client/register-client-settings-script.model.ts
similarity index 69%
rename from shared/models/plugins/register-client-settings-script.model.ts
rename to shared/models/plugins/client/register-client-settings-script.model.ts
index ac16af366..481ceef96 100644
--- a/shared/models/plugins/register-client-settings-script.model.ts
+++ b/shared/models/plugins/client/register-client-settings-script.model.ts
@@ -1,4 +1,4 @@
-import { RegisterServerSettingOptions } from "./register-server-setting.model"
+import { RegisterServerSettingOptions } from '../server'
 
 export interface RegisterClientSettingsScript {
   isSettingHidden (options: {
diff --git a/shared/models/plugins/index.ts b/shared/models/plugins/index.ts
index 03b27f907..cbbe4916e 100644
--- a/shared/models/plugins/index.ts
+++ b/shared/models/plugins/index.ts
@@ -1,28 +1,6 @@
-export * from './client-hook.model'
+export * from './client'
+export * from './plugin-index'
+export * from './server'
 export * from './hook-type.enum'
-export * from './install-plugin.model'
-export * from './manage-plugin.model'
-export * from './peertube-plugin-index-list.model'
-export * from './peertube-plugin-index.model'
-export * from './peertube-plugin-latest-version.model'
-export * from './peertube-plugin.model'
-export * from './plugin-client-scope.type'
-export * from './plugin-element-placeholder.type'
 export * from './plugin-package-json.model'
-export * from './plugin-playlist-privacy-manager.model'
-export * from './plugin-settings-manager.model'
-export * from './plugin-storage-manager.model'
-export * from './plugin-transcoding-manager.model'
-export * from './plugin-translation.model'
-export * from './plugin-video-category-manager.model'
-export * from './plugin-video-language-manager.model'
-export * from './plugin-video-licence-manager.model'
-export * from './plugin-video-privacy-manager.model'
 export * from './plugin.type'
-export * from './public-server.setting'
-export * from './register-client-hook.model'
-export * from './register-client-settings-script.model'
-export * from './register-client-form-field.model'
-export * from './register-server-hook.model'
-export * from './register-server-setting.model'
-export * from './server-hook.model'
diff --git a/shared/models/plugins/plugin-index/index.ts b/shared/models/plugins/plugin-index/index.ts
new file mode 100644
index 000000000..913846638
--- /dev/null
+++ b/shared/models/plugins/plugin-index/index.ts
@@ -0,0 +1,3 @@
+export * from './peertube-plugin-index-list.model'
+export * from './peertube-plugin-index.model'
+export * from './peertube-plugin-latest-version.model'
diff --git a/shared/models/plugins/peertube-plugin-index-list.model.ts b/shared/models/plugins/plugin-index/peertube-plugin-index-list.model.ts
similarity index 79%
rename from shared/models/plugins/peertube-plugin-index-list.model.ts
rename to shared/models/plugins/plugin-index/peertube-plugin-index-list.model.ts
index 817bac31e..ecb46482e 100644
--- a/shared/models/plugins/peertube-plugin-index-list.model.ts
+++ b/shared/models/plugins/plugin-index/peertube-plugin-index-list.model.ts
@@ -1,4 +1,4 @@
-import { PluginType } from './plugin.type'
+import { PluginType } from '../plugin.type'
 
 export interface PeertubePluginIndexList {
   start: number
diff --git a/shared/models/plugins/peertube-plugin-index.model.ts b/shared/models/plugins/plugin-index/peertube-plugin-index.model.ts
similarity index 100%
rename from shared/models/plugins/peertube-plugin-index.model.ts
rename to shared/models/plugins/plugin-index/peertube-plugin-index.model.ts
diff --git a/shared/models/plugins/peertube-plugin-latest-version.model.ts b/shared/models/plugins/plugin-index/peertube-plugin-latest-version.model.ts
similarity index 100%
rename from shared/models/plugins/peertube-plugin-latest-version.model.ts
rename to shared/models/plugins/plugin-index/peertube-plugin-latest-version.model.ts
diff --git a/shared/models/plugins/plugin-package-json.model.ts b/shared/models/plugins/plugin-package-json.model.ts
index c26e9ae5b..b2f92af80 100644
--- a/shared/models/plugins/plugin-package-json.model.ts
+++ b/shared/models/plugins/plugin-package-json.model.ts
@@ -1,4 +1,4 @@
-import { PluginClientScope } from './plugin-client-scope.type'
+import { PluginClientScope } from './client/plugin-client-scope.type'
 
 export type PluginTranslationPaths = {
   [ locale: string ]: string
diff --git a/shared/models/plugins/server/api/index.ts b/shared/models/plugins/server/api/index.ts
new file mode 100644
index 000000000..eb59a03f0
--- /dev/null
+++ b/shared/models/plugins/server/api/index.ts
@@ -0,0 +1,3 @@
+export * from './install-plugin.model'
+export * from './manage-plugin.model'
+export * from './peertube-plugin.model'
diff --git a/shared/models/plugins/install-plugin.model.ts b/shared/models/plugins/server/api/install-plugin.model.ts
similarity index 100%
rename from shared/models/plugins/install-plugin.model.ts
rename to shared/models/plugins/server/api/install-plugin.model.ts
diff --git a/shared/models/plugins/manage-plugin.model.ts b/shared/models/plugins/server/api/manage-plugin.model.ts
similarity index 100%
rename from shared/models/plugins/manage-plugin.model.ts
rename to shared/models/plugins/server/api/manage-plugin.model.ts
diff --git a/shared/models/plugins/peertube-plugin.model.ts b/shared/models/plugins/server/api/peertube-plugin.model.ts
similarity index 86%
rename from shared/models/plugins/peertube-plugin.model.ts
rename to shared/models/plugins/server/api/peertube-plugin.model.ts
index 2b0bb8cfa..54c383f57 100644
--- a/shared/models/plugins/peertube-plugin.model.ts
+++ b/shared/models/plugins/server/api/peertube-plugin.model.ts
@@ -1,4 +1,4 @@
-import { PluginType } from './plugin.type'
+import { PluginType } from '../../plugin.type'
 
 export interface PeerTubePlugin {
   name: string
diff --git a/shared/models/plugins/server/index.ts b/shared/models/plugins/server/index.ts
new file mode 100644
index 000000000..d3ff49d3b
--- /dev/null
+++ b/shared/models/plugins/server/index.ts
@@ -0,0 +1,6 @@
+export * from './api'
+export * from './managers'
+export * from './settings'
+export * from './plugin-translation.model'
+export * from './register-server-hook.model'
+export * from './server-hook.model'
diff --git a/shared/models/plugins/server/managers/index.ts b/shared/models/plugins/server/managers/index.ts
new file mode 100644
index 000000000..49365a854
--- /dev/null
+++ b/shared/models/plugins/server/managers/index.ts
@@ -0,0 +1,9 @@
+
+export * from './plugin-playlist-privacy-manager.model'
+export * from './plugin-settings-manager.model'
+export * from './plugin-storage-manager.model'
+export * from './plugin-transcoding-manager.model'
+export * from './plugin-video-category-manager.model'
+export * from './plugin-video-language-manager.model'
+export * from './plugin-video-licence-manager.model'
+export * from './plugin-video-privacy-manager.model'
diff --git a/shared/models/plugins/plugin-playlist-privacy-manager.model.ts b/shared/models/plugins/server/managers/plugin-playlist-privacy-manager.model.ts
similarity index 65%
rename from shared/models/plugins/plugin-playlist-privacy-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-playlist-privacy-manager.model.ts
index d1823ef4e..4703c0a8b 100644
--- a/shared/models/plugins/plugin-playlist-privacy-manager.model.ts
+++ b/shared/models/plugins/server/managers/plugin-playlist-privacy-manager.model.ts
@@ -1,4 +1,4 @@
-import { VideoPlaylistPrivacy } from '../videos/playlist/video-playlist-privacy.model'
+import { VideoPlaylistPrivacy } from '../../../videos/playlist/video-playlist-privacy.model'
 
 export interface PluginPlaylistPrivacyManager {
   // PUBLIC = 1,
diff --git a/shared/models/plugins/plugin-settings-manager.model.ts b/shared/models/plugins/server/managers/plugin-settings-manager.model.ts
similarity index 100%
rename from shared/models/plugins/plugin-settings-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-settings-manager.model.ts
diff --git a/shared/models/plugins/plugin-storage-manager.model.ts b/shared/models/plugins/server/managers/plugin-storage-manager.model.ts
similarity index 100%
rename from shared/models/plugins/plugin-storage-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-storage-manager.model.ts
diff --git a/shared/models/plugins/plugin-transcoding-manager.model.ts b/shared/models/plugins/server/managers/plugin-transcoding-manager.model.ts
similarity index 85%
rename from shared/models/plugins/plugin-transcoding-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-transcoding-manager.model.ts
index 8babccd4e..a0422a460 100644
--- a/shared/models/plugins/plugin-transcoding-manager.model.ts
+++ b/shared/models/plugins/server/managers/plugin-transcoding-manager.model.ts
@@ -1,4 +1,4 @@
-import { EncoderOptionsBuilder } from '../videos/video-transcoding.model'
+import { EncoderOptionsBuilder } from '../../../videos/video-transcoding.model'
 
 export interface PluginTranscodingManager {
   addLiveProfile (encoder: string, profile: string, builder: EncoderOptionsBuilder): boolean
diff --git a/shared/models/plugins/plugin-video-category-manager.model.ts b/shared/models/plugins/server/managers/plugin-video-category-manager.model.ts
similarity index 100%
rename from shared/models/plugins/plugin-video-category-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-video-category-manager.model.ts
diff --git a/shared/models/plugins/plugin-video-language-manager.model.ts b/shared/models/plugins/server/managers/plugin-video-language-manager.model.ts
similarity index 100%
rename from shared/models/plugins/plugin-video-language-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-video-language-manager.model.ts
diff --git a/shared/models/plugins/plugin-video-licence-manager.model.ts b/shared/models/plugins/server/managers/plugin-video-licence-manager.model.ts
similarity index 100%
rename from shared/models/plugins/plugin-video-licence-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-video-licence-manager.model.ts
diff --git a/shared/models/plugins/plugin-video-privacy-manager.model.ts b/shared/models/plugins/server/managers/plugin-video-privacy-manager.model.ts
similarity index 72%
rename from shared/models/plugins/plugin-video-privacy-manager.model.ts
rename to shared/models/plugins/server/managers/plugin-video-privacy-manager.model.ts
index 3ada99608..7717115e3 100644
--- a/shared/models/plugins/plugin-video-privacy-manager.model.ts
+++ b/shared/models/plugins/server/managers/plugin-video-privacy-manager.model.ts
@@ -1,4 +1,4 @@
-import { VideoPrivacy } from '../videos/video-privacy.enum'
+import { VideoPrivacy } from '../../../videos/video-privacy.enum'
 
 export interface PluginVideoPrivacyManager {
   // PUBLIC = 1
diff --git a/shared/models/plugins/plugin-translation.model.ts b/shared/models/plugins/server/plugin-translation.model.ts
similarity index 100%
rename from shared/models/plugins/plugin-translation.model.ts
rename to shared/models/plugins/server/plugin-translation.model.ts
diff --git a/shared/models/plugins/register-server-hook.model.ts b/shared/models/plugins/server/register-server-hook.model.ts
similarity index 100%
rename from shared/models/plugins/register-server-hook.model.ts
rename to shared/models/plugins/server/register-server-hook.model.ts
diff --git a/shared/models/plugins/server-hook.model.ts b/shared/models/plugins/server/server-hook.model.ts
similarity index 100%
rename from shared/models/plugins/server-hook.model.ts
rename to shared/models/plugins/server/server-hook.model.ts
diff --git a/shared/models/plugins/server/settings/index.ts b/shared/models/plugins/server/settings/index.ts
new file mode 100644
index 000000000..b456de019
--- /dev/null
+++ b/shared/models/plugins/server/settings/index.ts
@@ -0,0 +1,2 @@
+export * from './public-server.setting'
+export * from './register-server-setting.model'
diff --git a/shared/models/plugins/public-server.setting.ts b/shared/models/plugins/server/settings/public-server.setting.ts
similarity index 100%
rename from shared/models/plugins/public-server.setting.ts
rename to shared/models/plugins/server/settings/public-server.setting.ts
diff --git a/shared/models/plugins/register-server-setting.model.ts b/shared/models/plugins/server/settings/register-server-setting.model.ts
similarity index 83%
rename from shared/models/plugins/register-server-setting.model.ts
rename to shared/models/plugins/server/settings/register-server-setting.model.ts
index 9f45c3c37..d9a798cac 100644
--- a/shared/models/plugins/register-server-setting.model.ts
+++ b/shared/models/plugins/server/settings/register-server-setting.model.ts
@@ -1,4 +1,4 @@
-import { RegisterClientFormFieldOptions } from './register-client-form-field.model'
+import { RegisterClientFormFieldOptions } from '../../client'
 
 export type RegisterServerSettingOptions = RegisterClientFormFieldOptions & {
   // If the setting is not private, anyone can view its value (client code included)