Add JSON import and export of mailboxes
This commit is contained in:
@@ -353,6 +353,111 @@ angular.module('Application').controller('EmailController', ['$scope', '$locatio
|
||||
}
|
||||
};
|
||||
|
||||
$scope.mailboxImport = {
|
||||
busy: false,
|
||||
done: false,
|
||||
error: null,
|
||||
percent: 0,
|
||||
success: 0,
|
||||
mailboxes: [],
|
||||
|
||||
reset: function () {
|
||||
$scope.mailboxImport.busy = false;
|
||||
$scope.mailboxImport.error = null;
|
||||
$scope.mailboxImport.mailboxes = [];
|
||||
$scope.mailboxImport.percent = 0;
|
||||
$scope.mailboxImport.success = 0;
|
||||
$scope.mailboxImport.done = false;
|
||||
},
|
||||
|
||||
handleFileChanged: function () {
|
||||
$scope.mailboxImport.reset();
|
||||
|
||||
var fileInput = document.getElementById('mailboxImportFileInput');
|
||||
if (!fileInput.files || !fileInput.files[0]) return;
|
||||
|
||||
var file = fileInput.files[0];
|
||||
if (file.type !== 'application/json') return console.log('Unsupported file type.');
|
||||
|
||||
const reader = new FileReader();
|
||||
reader.addEventListener('load', function () {
|
||||
$scope.$apply(function () {
|
||||
try {
|
||||
$scope.mailboxImport.mailboxes = JSON.parse(reader.result);
|
||||
} catch (e) {
|
||||
console.error('Failed to parse mailboxes.', e);
|
||||
$scope.mailboxImport.error = { file: 'Imported file is not valid JSON' };
|
||||
}
|
||||
|
||||
// TODO check for validity and minium requirements for the mailboxes from JSON
|
||||
// currently supported and required fields are:
|
||||
// domain
|
||||
// name
|
||||
// ownerId
|
||||
// ownerType
|
||||
});
|
||||
}, false);
|
||||
reader.readAsText(file);
|
||||
},
|
||||
|
||||
show: function () {
|
||||
$scope.mailboxImport.reset();
|
||||
|
||||
// named so no duplactes
|
||||
document.getElementById('mailboxImportFileInput').addEventListener('change', $scope.mailboxImport.handleFileChanged);
|
||||
|
||||
$('#mailboxImportModal').modal('show');
|
||||
},
|
||||
|
||||
openFileInput: function () {
|
||||
$('#mailboxImportFileInput').click();
|
||||
},
|
||||
|
||||
import: function () {
|
||||
$scope.mailboxImport.percent = 0;
|
||||
$scope.mailboxImport.success = 0;
|
||||
$scope.mailboxImport.done = false;
|
||||
$scope.mailboxImport.error = { import: [] };
|
||||
$scope.mailboxImport.busy = true;
|
||||
|
||||
var processed = 0;
|
||||
|
||||
async.eachSeries($scope.mailboxImport.mailboxes, function (mailbox, callback) {
|
||||
Client.addMailbox(mailbox.domain, mailbox.name, mailbox.ownerId, mailbox.ownerType, function (error) {
|
||||
if (error) $scope.mailboxImport.error.import.push({ error: error, mailbox: mailbox });
|
||||
else ++$scope.mailboxImport.success;
|
||||
|
||||
++processed;
|
||||
$scope.mailboxImport.percent = 100 * processed / $scope.mailboxImport.mailboxes.length;
|
||||
|
||||
callback();
|
||||
});
|
||||
}, function (error) {
|
||||
if (error) return console.error(error);
|
||||
|
||||
$scope.mailboxImport.busy = false;
|
||||
$scope.mailboxImport.done = true;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
$scope.mailboxExport = function () {
|
||||
// FIXME only does first 10k mailboxes
|
||||
Client.listMailboxes($scope.domain.domain, '', 1, 10000, function (error, result) {
|
||||
if (error) {
|
||||
Client.error('Failed to list mailboxes. Full error in the webinspector.');
|
||||
return console.error('Failed to list mailboxes.', error);
|
||||
}
|
||||
|
||||
var file = new Blob([ JSON.stringify(result, null, 2) ], { type: 'application/json' });
|
||||
var a = document.createElement('a');
|
||||
a.href = URL.createObjectURL(file);
|
||||
a.download = $scope.domain.domain.replaceAll('.','_') + '-mailboxes.json';
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
});
|
||||
};
|
||||
|
||||
$scope.mailboxes = {
|
||||
mailboxes: [],
|
||||
search: '',
|
||||
|
||||
Reference in New Issue
Block a user