mirror of
https://github.com/TryGhost/Ghost.git
synced 2025-01-20 22:42:53 -05:00
Magnificent Migrations of Magical Majesty
This commit is contained in:
parent
11be64c544
commit
9393a956f4
5 changed files with 155 additions and 11 deletions
|
@ -1,6 +1,5 @@
|
||||||
var uuid = require('node-uuid');
|
var uuid = require('node-uuid');
|
||||||
|
|
||||||
/*global module */
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
posts: [
|
posts: [
|
||||||
{
|
{
|
||||||
|
|
22
core/server/data/fixtures/002.js
Normal file
22
core/server/data/fixtures/002.js
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
var uuid = require('node-uuid');
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
posts: [],
|
||||||
|
|
||||||
|
settings: [
|
||||||
|
{
|
||||||
|
"uuid": uuid.v4(),
|
||||||
|
"key": "installedPlugins",
|
||||||
|
"value": "[]",
|
||||||
|
"created_by": 1,
|
||||||
|
"updated_by": 1,
|
||||||
|
"type": "core"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
|
||||||
|
roles: [],
|
||||||
|
|
||||||
|
permissions: [],
|
||||||
|
|
||||||
|
permissions_roles: []
|
||||||
|
};
|
41
core/server/data/migration/002.js
Normal file
41
core/server/data/migration/002.js
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
var when = require('when'),
|
||||||
|
knex = require('../../models/base').Knex,
|
||||||
|
migrationVersion = '002',
|
||||||
|
fixtures = require('../fixtures/' + migrationVersion),
|
||||||
|
errors = require('../../errorHandling'),
|
||||||
|
up,
|
||||||
|
down;
|
||||||
|
|
||||||
|
up = function () {
|
||||||
|
|
||||||
|
return when.all([
|
||||||
|
|
||||||
|
// TODO: Create tables or modify tables in this general area
|
||||||
|
|
||||||
|
]).then(function () {
|
||||||
|
|
||||||
|
// Once we create all of the initial tables, bootstrap any of the data
|
||||||
|
|
||||||
|
return when.all([
|
||||||
|
//knex('posts').insert(fixtures.posts),
|
||||||
|
//knex('roles').insert(fixtures.roles),
|
||||||
|
//knex('permissions').insert(fixtures.permissions),
|
||||||
|
//knex('permissions_roles').insert(fixtures.permissions_roles),
|
||||||
|
knex('settings').insert(fixtures.settings)
|
||||||
|
]);
|
||||||
|
|
||||||
|
}).then(function () {
|
||||||
|
|
||||||
|
// Lastly, update the current version settings to reflect this version
|
||||||
|
return knex('settings')
|
||||||
|
.where('key', 'currentVersion')
|
||||||
|
.update({ 'value': migrationVersion });
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
down = function () {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
|
||||||
|
exports.up = up;
|
||||||
|
exports.down = down;
|
90
core/server/data/migration/index.js
Normal file
90
core/server/data/migration/index.js
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
|
||||||
|
var _ = require('underscore'),
|
||||||
|
when = require('when'),
|
||||||
|
series = require('when/sequence'),
|
||||||
|
errors = require('../../errorHandling'),
|
||||||
|
knex = require('../../models/base').Knex,
|
||||||
|
initialVersion = "001",
|
||||||
|
// This currentVersion string should always be the current version of Ghost,
|
||||||
|
// we could probably load it from the config file.
|
||||||
|
currentVersion = "002";
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
// Check for whether data is needed to be bootstrapped or not
|
||||||
|
init: function () {
|
||||||
|
var that = this;
|
||||||
|
|
||||||
|
return knex.Schema.hasTable('settings').then(function () {
|
||||||
|
// Check for the current version from the settings table
|
||||||
|
return knex('settings')
|
||||||
|
.where('key', 'currentVersion')
|
||||||
|
.select('value')
|
||||||
|
.then(function (currentVersionSetting) {
|
||||||
|
// We are assuming here that the currentVersionSetting will
|
||||||
|
// always be less than the currentVersion value.
|
||||||
|
if (currentVersionSetting === currentVersion) {
|
||||||
|
return when.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Bring the data up to the latest version
|
||||||
|
return that.migrateFromVersion(currentVersion);
|
||||||
|
}, errors.logAndThrowError);
|
||||||
|
|
||||||
|
}, function () {
|
||||||
|
// If the settings table doesn't exist, bring everything up from initial version.
|
||||||
|
return that.migrateFromVersion(initialVersion);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
// Migrate from a specific version to the latest
|
||||||
|
migrateFromVersion: function (version) {
|
||||||
|
var versions = [],
|
||||||
|
maxVersion = this.getVersionAfter(currentVersion),
|
||||||
|
currVersion = version,
|
||||||
|
tasks = [];
|
||||||
|
|
||||||
|
// Aggregate all the versions we need to do migrations for
|
||||||
|
while (currVersion !== maxVersion) {
|
||||||
|
versions.push(currVersion);
|
||||||
|
currVersion = this.getVersionAfter(currVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Aggregate all the individual up calls to use in the series(...) below
|
||||||
|
tasks = _.map(versions, function (taskVersion) {
|
||||||
|
return function () {
|
||||||
|
try {
|
||||||
|
var migration = require('./' + taskVersion);
|
||||||
|
return migration.up();
|
||||||
|
} catch (e) {
|
||||||
|
errors.logError(e);
|
||||||
|
return when.reject(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
// Run each migration in series
|
||||||
|
return series(tasks);
|
||||||
|
},
|
||||||
|
|
||||||
|
// Get the following version based on the current
|
||||||
|
getVersionAfter: function (currVersion) {
|
||||||
|
|
||||||
|
var currVersionNum = parseInt(currVersion, 10),
|
||||||
|
nextVersion;
|
||||||
|
|
||||||
|
// Default to initialVersion if not parsed
|
||||||
|
if (isNaN(currVersionNum)) {
|
||||||
|
currVersionNum = parseInt(initialVersion, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
currVersionNum += 1;
|
||||||
|
|
||||||
|
nextVersion = String(currVersionNum);
|
||||||
|
// Pad with 0's until 3 digits
|
||||||
|
while (nextVersion.length < 3) {
|
||||||
|
nextVersion = "0" + nextVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nextVersion;
|
||||||
|
}
|
||||||
|
};
|
|
@ -1,6 +1,4 @@
|
||||||
var GhostBookshelf = require('./base'),
|
var migrations = require('../data/migration');
|
||||||
errors = require('../errorHandling'),
|
|
||||||
knex = GhostBookshelf.Knex;
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
Post: require('./post').Post,
|
Post: require('./post').Post,
|
||||||
|
@ -9,12 +7,6 @@ module.exports = {
|
||||||
Permission: require('./permission').Permission,
|
Permission: require('./permission').Permission,
|
||||||
Settings: require('./settings').Settings,
|
Settings: require('./settings').Settings,
|
||||||
init: function () {
|
init: function () {
|
||||||
return knex.Schema.hasTable('posts').then(null, function () {
|
return migrations.init();
|
||||||
// Simple bootstraping of the data model for now.
|
|
||||||
var migration = require('../data/migration/001');
|
|
||||||
return migration.down().then(function () {
|
|
||||||
return migration.up();
|
|
||||||
}, errors.logAndThrowError);
|
|
||||||
}, errors.logAndThrowError);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue