diff --git a/bin/patch.js b/bin/patch.js index 62dd6b53..988e5b25 100644 --- a/bin/patch.js +++ b/bin/patch.js @@ -3,7 +3,7 @@ const inquirer = require('inquirer') const chalk = require('chalk') const prompt = inquirer.createPromptModule() const package = require('../package.json') -const { execSync } = require('child_process') +const { $ } = require('zx') const { resolve } = require('path') const { readdirSync } = require('fs') const PATCH_DIR = resolve(process.cwd(), './patch') @@ -14,22 +14,18 @@ async function bootstarp() { console.log(chalk.yellow(`current version: ${package.version}`)) const patchFiles = readdirSync(PATCH_DIR).filter( - (file) => file.startsWith('v') && file.endsWith('.ts'), + (file) => file.startsWith('v') && file.endsWith('.js'), ) prompt({ type: 'list', name: 'version', message: 'Select version you want to patch.', - choices: patchFiles.map((f) => f.replace(/\.ts$/, '')), - }).then(({ version }) => { - execSync('yarn run build', { - encoding: 'utf-8', - }) - - const patchPath = resolve('dist/patch/', version + '.js') + choices: patchFiles.map((f) => f.replace(/\.js$/, '')), + }).then(async ({ version }) => { + const patchPath = resolve(PATCH_DIR, `./${version}.js`) console.log(chalk.green('starting patch... ' + patchPath)) - execSync(`node ${patchPath}`, { encoding: 'utf8' }) + await $`node ${patchPath}` }) } diff --git a/package.json b/package.json index d977b3d6..fd9a6a6b 100644 --- a/package.json +++ b/package.json @@ -93,6 +93,7 @@ "lodash": "*", "marked": "3.0.4", "mkdirp": "*", + "mongodb": "*", "mongoose": "*", "mongoose-lean-id": "0.2.0", "mongoose-lean-virtuals": "0.8.1", diff --git a/patch/bootstrap.js b/patch/bootstrap.js index 38521c33..efeedbbd 100644 --- a/patch/bootstrap.js +++ b/patch/bootstrap.js @@ -1,41 +1,19 @@ -// import { getModelForClass, mongoose } from '@typegoose/typegoose' -// import { config } from 'dotenv' -// import { ConnectionBase } from 'mongoose' -// import * as APP from '../src/app.config.mjs' -// import { CategoryModel } from '../src/modules/category/category.model' -// import { NoteModel } from '../src/modules/note/note.model' -// import { PostModel } from '../src/modules/post/post.model' -// const env = config().parsed || {} -// const url = APP.MONGO_DB.uri +const { MongoClient, Db } = require('mongodb') +const MONGO_DB = require('../src/app.config').MONGO_DB -// const opt = { -// useCreateIndex: true, -// useFindAndModify: false, -// useNewUrlParser: true, -// useUnifiedTopology: true, -// autoIndex: true, -// } -// mongoose.connect(url, opt) -// const post = getModelForClass(PostModel) -// const note = getModelForClass(NoteModel) -// const category = getModelForClass(CategoryModel) +/** + * + * @param {(db: Db) => Promise} cb + */ +async function bootstrap(cb) { + const client = new MongoClient(`mongodb://${MONGO_DB.host}:${MONGO_DB.port}`) + await client.connect() + const db = client.db(MONGO_DB.dbName) -// const Config = { -// env, -// db: (mongoose.connection as any).client.db( -// APP.MONGO_DB.collectionName, -// ) as ConnectionBase, -// models: { -// post, -// note, -// category, -// }, -// } -// async function bootstrap(cb: (config: typeof Config) => any) { -// await cb.call(this, Config) + await cb(db) -// mongoose.disconnect() -// process.exit() -// } + await client.close() + process.exit(0) +} -// export { bootstrap as patch } +module.exports = exports.bootstrap = bootstrap diff --git a/patch/index.js b/patch/index.js new file mode 100644 index 00000000..d5f68a2a --- /dev/null +++ b/patch/index.js @@ -0,0 +1 @@ +require('./bootstrap') diff --git a/patch/index.ts b/patch/index.ts deleted file mode 100644 index fc4f6543..00000000 --- a/patch/index.ts +++ /dev/null @@ -1 +0,0 @@ -import './bootstrap' diff --git a/patch/v2.0.0-alpha.1.js b/patch/v2.0.0-alpha.1.js new file mode 100644 index 00000000..406b3a25 --- /dev/null +++ b/patch/v2.0.0-alpha.1.js @@ -0,0 +1,14 @@ +// patch for version lower than v2.0.0-alpha.1 + +const bootstrap = require('./bootstrap') + +bootstrap(async (db) => { + return await Promise.all([ + ['notes', 'posts'].map(async (collectionName) => { + return db + .collection(collectionName) + .updateMany({}, { $unset: { options: 1 } }) + }), + db.collection('categories').updateMany({}, { $unset: { count: '' } }), + ]) +}) diff --git a/patch/v2.0.0-alpha.1.ts b/patch/v2.0.0-alpha.1.ts deleted file mode 100644 index 4a4f7c1d..00000000 --- a/patch/v2.0.0-alpha.1.ts +++ /dev/null @@ -1,17 +0,0 @@ -// // patch for version lower than v2.0.0-alpha.1 - -// import { patch } from './bootstrap' - -// patch(async ({ models: { note, post, category } }) => { -// await Promise.all([ -// [note, post].map((model) => { -// return model.updateMany( -// {}, -// { -// $unset: ['options'], -// }, -// ) -// }), -// category.updateMany({}, { $unset: { count: '' } }), -// ]) -// }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f3897c9b..8ccc44b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -73,6 +73,7 @@ specifiers: lodash: '*' marked: 3.0.4 mkdirp: '*' + mongodb: '*' mongoose: '*' mongoose-lean-id: 0.2.0 mongoose-lean-virtuals: 0.8.1 @@ -148,6 +149,7 @@ dependencies: lodash: 4.17.21 marked: 3.0.4 mkdirp: 1.0.4 + mongodb: 4.1.1 mongoose: 5.13.8 mongoose-lean-id: 0.2.0_mongoose@5.13.8 mongoose-lean-virtuals: 0.8.1_mongoose@5.13.8 @@ -2053,14 +2055,12 @@ packages: /@types/webidl-conversions/6.1.1: resolution: {integrity: sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q==} - dev: true /@types/whatwg-url/8.2.1: resolution: {integrity: sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ==} dependencies: '@types/node': 16.9.2 '@types/webidl-conversions': 6.1.1 - dev: true /@types/yargs-parser/20.2.1: resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} @@ -3053,7 +3053,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: buffer: 5.7.1 - dev: true /buffer-equal-constant-time/1.0.1: resolution: {integrity: sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=} @@ -6365,7 +6364,6 @@ packages: dependencies: '@types/whatwg-url': 8.2.1 whatwg-url: 9.1.0 - dev: true /mongodb/3.6.11: resolution: {integrity: sha512-4Y4lTFHDHZZdgMaHmojtNAlqkvddX2QQBEN0K//GzxhGwlI9tZ9R0vhbjr1Decw+TF7qK0ZLjQT292XgHRRQgw==} @@ -6409,7 +6407,6 @@ packages: mongodb-connection-string-url: 2.1.0 optionalDependencies: saslprep: 1.0.3 - dev: true /mongoose-lean-id/0.2.0_mongoose@5.13.8: resolution: {integrity: sha512-ioC++wVTfprE2wh7Baw4jdZ1mCIpK3uw74sWf53enNCKZHVhKsL7fMyB1ryb4SmGwOj4StebTGy7YwimjZ0Qlg==} @@ -8247,7 +8244,6 @@ packages: engines: {node: '>=8'} dependencies: punycode: 2.1.1 - dev: true /tree-kill/1.2.2: resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} @@ -8592,7 +8588,6 @@ packages: /webidl-conversions/6.1.0: resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} engines: {node: '>=10.4'} - dev: true /webpack-node-externals/3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} @@ -8723,7 +8718,6 @@ packages: dependencies: tr46: 2.1.0 webidl-conversions: 6.1.0 - dev: true /which-boxed-primitive/1.0.2: resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} diff --git a/src/app.config.js b/src/app.config.js index ae9fc5c3..635da52a 100644 --- a/src/app.config.js +++ b/src/app.config.js @@ -27,12 +27,12 @@ exports.CROSS_DOMAIN = { } exports.MONGO_DB = { - collectionName: argv.collection_name || 'mx-space', + dbName: argv.collection_name || 'mx-space', host: argv.db_host || '127.0.0.1', port: argv.db_port || 27017, get uri() { return `mongodb://${this.host}:${this.port}/${ - process.env.TEST ? 'mx-space_unitest' : this.collectionName + process.env.TEST ? 'mx-space_unitest' : this.dbName }` }, } diff --git a/src/modules/backup/backup.service.ts b/src/modules/backup/backup.service.ts index 309208e3..fa24a67d 100644 --- a/src/modules/backup/backup.service.ts +++ b/src/modules/backup/backup.service.ts @@ -87,7 +87,7 @@ export class BackupService { await $`unzip backup.zip` await $`mongorestore -h ${MONGO_DB.host || '127.0.0.1'} --port ${ MONGO_DB.port || 27017 - } -d ${MONGO_DB.collectionName} ./mx-space --drop >/dev/null 2>&1` + } -d ${MONGO_DB.dbName} ./mx-space --drop >/dev/null 2>&1` this.logger.debug('恢复成功') await this.adminGateway.broadcast( @@ -120,7 +120,7 @@ export class BackupService { cd(dirPath) await $`mongorestore -h ${MONGO_DB.host || '127.0.0.1'} --port ${ MONGO_DB.port || 27017 - } -d ${MONGO_DB.collectionName} ./mx-space --drop >/dev/null 2>&1` + } -d ${MONGO_DB.dbName} ./mx-space --drop >/dev/null 2>&1` } catch (e) { this.logger.error(e) throw e diff --git a/src/processors/helper/helper.cron.service.ts b/src/processors/helper/helper.cron.service.ts index 2b001ac7..655189c2 100644 --- a/src/processors/helper/helper.cron.service.ts +++ b/src/processors/helper/helper.cron.service.ts @@ -91,7 +91,7 @@ export class CronService { const backupDirPath = join(BACKUP_DIR, dateDir) mkdirp.sync(backupDirPath) try { - await $`mongodump -h ${MONGO_DB.host} --port ${MONGO_DB.port} -d ${MONGO_DB.collectionName} -o ${backupDirPath} >/dev/null 2>&1` + await $`mongodump -h ${MONGO_DB.host} --port ${MONGO_DB.port} -d ${MONGO_DB.dbName} -o ${backupDirPath} >/dev/null 2>&1` execSync(`zip -r backup-${dateDir} mx-space/* && rm -rf mx-space`, { cwd: backupDirPath,