diff --git a/packages/plugins/@nocobase/plugin-multi-app-manager/src/server/server.ts b/packages/plugins/@nocobase/plugin-multi-app-manager/src/server/server.ts index 1319288fa..26f14cd67 100644 --- a/packages/plugins/@nocobase/plugin-multi-app-manager/src/server/server.ts +++ b/packages/plugins/@nocobase/plugin-multi-app-manager/src/server/server.ts @@ -9,6 +9,52 @@ import { ApplicationModel } from '../server'; export type AppDbCreator = (app: Application, transaction?: Transactionable) => Promise; export type AppOptionsFactory = (appName: string, mainApp: Application) => any; +export type SubAppUpgradeHandler = (mainApp: Application) => Promise; + +const defaultSubAppUpgradeHandle: SubAppUpgradeHandler = async (mainApp: Application) => { + const repository = mainApp.db.getRepository('applications'); + const findOptions = {}; + + const appSupervisor = AppSupervisor.getInstance(); + + if (appSupervisor.runningMode == 'single') { + findOptions['filter'] = { + name: appSupervisor.singleAppName, + }; + } + + const instances = await repository.find(findOptions); + + for (const instance of instances) { + const instanceOptions = instance.get('options'); + + // skip standalone deployment application + if (instanceOptions?.standaloneDeployment && appSupervisor.runningMode !== 'single') { + continue; + } + + const beforeSubAppStatus = AppSupervisor.getInstance().getAppStatus(instance.name); + + const subApp = await appSupervisor.getApp(instance.name, { + upgrading: true, + }); + + console.log({ beforeSubAppStatus }); + try { + mainApp.setMaintainingMessage(`upgrading sub app ${instance.name}...`); + console.log(`${instance.name}: upgrading...`); + + await subApp.runAsCLI(['upgrade'], { from: 'user' }); + if (!beforeSubAppStatus && AppSupervisor.getInstance().getAppStatus(instance.name) === 'initialized') { + await AppSupervisor.getInstance().removeApp(instance.name); + } + } catch (error) { + console.log(`${instance.name}: upgrade failed`); + mainApp.logger.error(error); + console.error(error); + } + } +}; const defaultDbCreator = async (app: Application) => { const databaseOptions = app.options.database as any; @@ -72,6 +118,7 @@ const defaultAppOptionsFactory = (appName: string, mainApp: Application) => { export class PluginMultiAppManager extends Plugin { appDbCreator: AppDbCreator = defaultDbCreator; appOptionsFactory: AppOptionsFactory = defaultAppOptionsFactory; + subAppUpgradeHandler: SubAppUpgradeHandler = defaultSubAppUpgradeHandle; private beforeGetApplicationMutex = new Mutex(); @@ -84,6 +131,10 @@ export class PluginMultiAppManager extends Plugin { return lodash.cloneDeep(lodash.omit(oldConfig, ['migrator'])); } + setSubAppUpgradeHandler(handler: SubAppUpgradeHandler) { + this.subAppUpgradeHandler = handler; + } + setAppOptionsFactory(factory: AppOptionsFactory) { this.appOptionsFactory = factory; } @@ -243,50 +294,7 @@ export class PluginMultiAppManager extends Plugin { }); this.app.on('afterUpgrade', async (app, options) => { - const cliArgs = options?.cliArgs; - - const repository = this.db.getRepository('applications'); - const findOptions = {}; - - const appSupervisor = AppSupervisor.getInstance(); - - if (appSupervisor.runningMode == 'single') { - findOptions['filter'] = { - name: appSupervisor.singleAppName, - }; - } - - const instances = await repository.find(findOptions); - - for (const instance of instances) { - const instanceOptions = instance.get('options'); - - // skip standalone deployment application - if (instanceOptions?.standaloneDeployment && appSupervisor.runningMode !== 'single') { - continue; - } - - const beforeSubAppStatus = AppSupervisor.getInstance().getAppStatus(instance.name); - - const subApp = await appSupervisor.getApp(instance.name, { - upgrading: true, - }); - - console.log({ beforeSubAppStatus }); - try { - this.app.setMaintainingMessage(`upgrading sub app ${instance.name}...`); - console.log(`${instance.name}: upgrading...`); - - await subApp.runAsCLI(['upgrade'], { from: 'user' }); - if (!beforeSubAppStatus && AppSupervisor.getInstance().getAppStatus(instance.name) === 'initialized') { - await AppSupervisor.getInstance().removeApp(instance.name); - } - } catch (error) { - console.log(`${instance.name}: upgrade failed`); - this.app.logger.error(error); - console.error(error); - } - } + await this.subAppUpgradeHandler(app); }); this.app.resourcer.registerActionHandlers({