diff --git a/migrations/20160921205726-mailboxes-add-ownerId.js b/migrations/20160921205726-mailboxes-add-ownerId.js new file mode 100644 index 000000000..427477aad --- /dev/null +++ b/migrations/20160921205726-mailboxes-add-ownerId.js @@ -0,0 +1,65 @@ +'use strict'; + +var dbm = dbm || require('db-migrate'); + +exports.up = function(db, callback) { + async.series([ + db.runSql.bind(db, 'ALTER TABLE mailboxes ADD COLUMN ownerId VARCHAR(128)'), + db.runSql.bind(db, 'ALTER TABLE mailboxes ADD COLUMN ownerType VARCHAR(16)'), + db.runSql.bind(db, 'START TRANSACTION;'), + function addGroupMailboxes(done) { + console.log('Importing group mailboxes'); + + db.all('SELECT id, name FROM groups', function (error, results) { + if (error) return done(error); + + async.eachSeries(results, function (g, next) { + db.runSql('INSERT INTO mailboxes (ownerId, ownerType, name) VALUES (?, ?, ?)', [ g.id, 'group', g.name ], next); + }, done); + }); + }, + function addAppMailboxes(done) { + console.log('Importing app mail boxes'); + + db.all('SELECT id, location, manifestJson FROM apps', function (error, results) { + if (error) return done(error); + + async.eachSeries(results, function (a, next) { + var manifest = JSON.parse(a.manifestJson); + if (!manifest.addons['sendmail'] && !manifest.addons['recvmail']) return next(); + + var mailboxName = (a.location ? a.location : manifest.title.replace(/[^a-zA-Z0-9]/g, '')) + '.app'; + db.runSql('INSERT INTO mailboxes (ownerId, ownerType, name) VALUES (?, ?, ?)', [ a.id, 'app', mailboxName ], next); + }, done); + }); + }, + function setUserMailboxOwnerIds(done) { + console.log('Setting owner id of user mailboxes and aliases'); + + db.all('SELECT id, username FROM users', function (error, results) { + if (error) return done(error); + + async.eachSeries(results, function (u, next) { + if (!u.username) return next(); + + db.runSql('UPDATE mailboxes SET ownerId = ?, ownerType = ? WHERE name = ? OR targetAlias = ?', [ u.id, 'user', u.username, u.username ], done); + }, done); + }); + }, + db.runSql.bind(db, 'COMMIT'), + db.runSql.bind(db, 'ALTER TABLE mailboxes MODIFY ownerId VARCHAR(128) NOT NULL'), + db.runSql.bind(db, 'ALTER TABLE mailboxes MODIFY ownerType VARCHAR(128) NOT NULL'), + ], callback); +}; + +exports.down = function(db, callback) { + db.runSql('ALTER TABLE mailboxes DROP COLUMN ownerId', function (error) { + if (error) console.error(error); + + db.runSql('ALTER TABLE mailboxes DROP COLUMN ownerType', function (error) { + if (error) console.error(error); + callback(error); + }); + }); +}; + diff --git a/migrations/schema.sql b/migrations/schema.sql index 693724450..686bc9e50 100644 --- a/migrations/schema.sql +++ b/migrations/schema.sql @@ -125,6 +125,8 @@ CREATE TABLE IF NOT EXISTS eventlog( */ CREATE TABLE IF NOT EXISTS mailboxes( name VARCHAR(128) NOT NULL, + ownerId VARCHAR(128) NOT NULL, /* app id or user id or group id */ + ownerType VARCHAR(16) NOT NULL, /* 'app' or 'user' or 'group' */ aliasTarget VARCHAR(128), /* the target name type is an alias */ creationTime TIMESTAMP,