mirror of
https://gitee.com/nocobase/nocobase.git
synced 2025-05-05 05:29:26 +08:00
* chore: skip yarn install in pm command * feat: dump sub app by sub app name * feat: dump & restore by sub app * chore: enable application name to edit * chore: field belongsTo uiSchema * test: drop schema * feat: uiSchema migrator * fix: test * fix: remove uiSchema * fix: rerun migration * chore: migrate fieldsHistory uiSchema * fix: set uiSchema options * chore: transaction params * fix: sql error in mysql * fix: sql compatibility * feat: collection group api * chore: restore & dump action template * chore: tmp commit * chore: collectionGroupAction * feat: dumpableCollection api * refactor: dump command * fix: remove uiSchemaUid * chore: get uiSchemaUid from tmp field * feat: return dumped file url in dumper.dump * feat: dump api * refactor: collection groyoup * chore: comment * feat: restore command force option * feat: dump with collection groups * refactor: restore command * feat: restore http api * fix: test * fix: test * fix: restore test * chore: volta pin * fix: sub app load collection options * fix: stop sub app * feat: add stopped status to application to prevent duplicate application stop * chore: tmp commit * test: upgrade * feat: pass upgrade event to sub app * fix: app manager client * fix: remove stopped status * fix: emit beforeStop event * feat: support dump & restore subApp through api * chore: dumpable collections api * refactor: getTableNameWithSchema * fix: schema name * feat: cname * refactor: collection 同步实现方式 * refactor: move collection group manager to database * fix: test * fix: remove uiSchema * fix: uiSchema * fix: remove settings * chore: plugin enable & disable event * feat: modal warning * fix: users_jobs namespace * fix: rolesUischemas namespace * fix: am snippet * feat: beforeSubAppInstall event * fix: improve NOCOBASE_LOCALE_KEY & NOCOBASE_ROLE_KEY --------- Co-authored-by: chenos <chenlinxh@gmail.com>
51 lines
1.6 KiB
TypeScript
51 lines
1.6 KiB
TypeScript
import { Plugin } from '@nocobase/server';
|
|
import addDumpCommand from './commands/dump-command';
|
|
import addRestoreCommand from './commands/restore-command';
|
|
|
|
import zhCN from './locale/zh-CN';
|
|
import dumpAction from './actions/dump-action';
|
|
import { getPackageContent, restoreAction } from './actions/restore-action';
|
|
import getDictAction from './actions/get-dict-action';
|
|
import dumpableCollections from './actions/dumpable-collections-action';
|
|
import multer from '@koa/multer';
|
|
import * as os from 'os';
|
|
|
|
export default class Duplicator extends Plugin {
|
|
beforeLoad() {
|
|
this.app.i18n.addResources('zh-CN', 'duplicator', zhCN);
|
|
|
|
addDumpCommand(this.app);
|
|
addRestoreCommand(this.app);
|
|
}
|
|
|
|
async load() {
|
|
this.app.resourcer.define({
|
|
name: 'duplicator',
|
|
middleware: async (ctx, next) => {
|
|
if (ctx.action.actionName !== 'upload') {
|
|
return next();
|
|
}
|
|
const storage = multer.diskStorage({
|
|
destination: os.tmpdir(), // 获取临时目录
|
|
filename: function (req, file, cb) {
|
|
const randomName = Date.now().toString() + Math.random().toString().slice(2); // 随机生成文件名
|
|
cb(null, randomName);
|
|
},
|
|
});
|
|
|
|
const upload = multer({ storage }).single('file');
|
|
return upload(ctx, next);
|
|
},
|
|
actions: {
|
|
restore: restoreAction,
|
|
upload: getPackageContent,
|
|
dump: dumpAction,
|
|
dumpableCollections: dumpableCollections,
|
|
getDict: getDictAction,
|
|
},
|
|
});
|
|
|
|
this.app.acl.allow('duplicator', 'getDict');
|
|
}
|
|
}
|