From 6702a1b2ccd666285dee9c72b5bace641d2fce8b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 16 Jul 2019 11:33:22 +0200 Subject: Add ability to search available plugins --- server/lib/schedulers/plugins-check-scheduler.ts | 60 ++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 server/lib/schedulers/plugins-check-scheduler.ts (limited to 'server/lib/schedulers/plugins-check-scheduler.ts') diff --git a/server/lib/schedulers/plugins-check-scheduler.ts b/server/lib/schedulers/plugins-check-scheduler.ts new file mode 100644 index 000000000..9c60dbcd4 --- /dev/null +++ b/server/lib/schedulers/plugins-check-scheduler.ts @@ -0,0 +1,60 @@ +import { logger } from '../../helpers/logger' +import { AbstractScheduler } from './abstract-scheduler' +import { retryTransactionWrapper } from '../../helpers/database-utils' +import { SCHEDULER_INTERVALS_MS } from '../../initializers/constants' +import { CONFIG } from '../../initializers/config' +import { PluginModel } from '../../models/server/plugin' +import { chunk } from 'lodash' +import { getLatestPluginsVersion } from '../plugins/plugin-index' +import { compareSemVer } from '../../../shared/core-utils/miscs/miscs' + +export class PluginsCheckScheduler extends AbstractScheduler { + + private static instance: AbstractScheduler + + protected schedulerIntervalMs = SCHEDULER_INTERVALS_MS.checkPlugins + + private constructor () { + super() + } + + protected async internalExecute () { + return retryTransactionWrapper(this.checkLatestPluginsVersion.bind(this)) + } + + private async checkLatestPluginsVersion () { + if (CONFIG.PLUGINS.INDEX.ENABLED === false) return + + logger.info('Checkin latest plugins version.') + + const plugins = await PluginModel.listInstalled() + + // Process 10 plugins in 1 HTTP request + const chunks = chunk(plugins, 10) + for (const chunk of chunks) { + // Find plugins according to their npm name + const pluginIndex: { [npmName: string]: PluginModel} = {} + for (const plugin of chunk) { + pluginIndex[PluginModel.buildNpmName(plugin.name, plugin.type)] = plugin + } + + const npmNames = Object.keys(pluginIndex) + const results = await getLatestPluginsVersion(npmNames) + + for (const result of results) { + const plugin = pluginIndex[result.npmName] + if (!result.latestVersion) continue + + if (plugin.latestVersion !== result.latestVersion && compareSemVer(plugin.latestVersion, result.latestVersion) < 0) { + plugin.latestVersion = result.latestVersion + await plugin.save() + } + } + } + + } + + static get Instance () { + return this.instance || (this.instance = new this()) + } +} -- cgit v1.2.3