/
down.js
57 lines (49 loc) · 1.92 KB
/
down.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
const _ = require("lodash");
const pEachSeries = require("p-each-series");
const { promisify } = require("util");
const fnArgs = require('fn-args');
const status = require("./status");
const config = require("../env/config");
const migrationsDir = require("../env/migrationsDir");
const hasCallback = require('../utils/has-callback');
module.exports = async (db, client) => {
const isBlockRollback = _.get(global.options, "block");
const downgraded = [];
const statusItems = await status(db);
const appliedItems = statusItems.filter(item => item.appliedAt !== "PENDING");
const lastAppliedItem = _.last(appliedItems);
let itemsToRollback = [];
if (isBlockRollback && lastAppliedItem.migrationBlock) {
itemsToRollback = appliedItems.filter(item => item.migrationBlock === lastAppliedItem.migrationBlock).reverse();
} else {
itemsToRollback = [lastAppliedItem];
}
const rollbackItem = async item => {
if (item) {
try {
const migration = await migrationsDir.loadMigration(item.fileName);
const down = hasCallback(migration.down) ? promisify(migration.down) : migration.down;
if (hasCallback(migration.down) && fnArgs(migration.down).length < 3) {
// support old callback-based migrations prior to migrate-mongo 7.x.x
await down(db);
} else {
await down(db, client);
}
} catch (err) {
throw new Error(
`Could not migrate down ${item.fileName}: ${err.message}`
);
}
const { changelogCollectionName } = await config.read();
const changelogCollection = db.collection(changelogCollectionName);
try {
await changelogCollection.deleteOne({ fileName: item.fileName });
downgraded.push(item.fileName);
} catch (err) {
throw new Error(`Could not update changelog: ${err.message}`);
}
}
}
await pEachSeries(itemsToRollback, rollbackItem);
return downgraded;
};