diff options
author | Angelo Gallarello <angelo.gallarell@gmail.com> | 2018-09-14 19:20:24 +0200 |
---|---|---|
committer | Angelo Gallarello <angelo.gallarell@gmail.com> | 2018-09-14 19:20:24 +0200 |
commit | 8cb132f492d3e4eb41b9f6766a59312942e345fa (patch) | |
tree | 7ca01a45a0ec56b121dad55d4ba3adb3d00b8d93 /models/export.js | |
parent | a57806b054e076c5e5a94263b67125e0340c0e2f (diff) | |
download | wekan-8cb132f492d3e4eb41b9f6766a59312942e345fa.tar.gz wekan-8cb132f492d3e4eb41b9f6766a59312942e345fa.tar.bz2 wekan-8cb132f492d3e4eb41b9f6766a59312942e345fa.zip |
Export/Import done for rules
Diffstat (limited to 'models/export.js')
-rw-r--r-- | models/export.js | 80 |
1 files changed, 63 insertions, 17 deletions
diff --git a/models/export.js b/models/export.js index 8c4c29d4..f4ea6789 100644 --- a/models/export.js +++ b/models/export.js @@ -14,7 +14,7 @@ if (Meteor.isServer) { * See https://blog.kayla.com.au/server-side-route-authentication-in-meteor/ * for detailed explanations */ - JsonRoutes.add('get', '/api/boards/:boardId/export', function (req, res) { + JsonRoutes.add('get', '/api/boards/:boardId/export', function(req, res) { const boardId = req.params.boardId; let user = null; // todo XXX for real API, first look for token in Authentication: header @@ -28,8 +28,11 @@ if (Meteor.isServer) { } const exporter = new Exporter(boardId); - if(exporter.canExport(user)) { - JsonRoutes.sendResult(res, { code: 200, data: exporter.build() }); + if (exporter.canExport(user)) { + JsonRoutes.sendResult(res, { + code: 200, + data: exporter.build() + }); } else { // we could send an explicit error message, but on the other hand the only // way to get there is by hacking the UI so let's keep it raw. @@ -44,25 +47,52 @@ class Exporter { } build() { - const byBoard = { boardId: this._boardId }; + const byBoard = { + boardId: this._boardId + }; // we do not want to retrieve boardId in related elements - const noBoardId = { fields: { boardId: 0 } }; + const noBoardId = { + fields: { + boardId: 0 + } + }; const result = { _format: 'wekan-board-1.0.0', }; - _.extend(result, Boards.findOne(this._boardId, { fields: { stars: 0 } })); + _.extend(result, Boards.findOne(this._boardId, { + fields: { + stars: 0 + } + })); result.lists = Lists.find(byBoard, noBoardId).fetch(); result.cards = Cards.find(byBoard, noBoardId).fetch(); result.swimlanes = Swimlanes.find(byBoard, noBoardId).fetch(); result.comments = CardComments.find(byBoard, noBoardId).fetch(); result.activities = Activities.find(byBoard, noBoardId).fetch(); + result.rules = Rules.find(byBoard, noBoardId).fetch(); result.checklists = []; result.checklistItems = []; result.subtaskItems = []; + result.triggers = []; + result.actions = []; result.cards.forEach((card) => { - result.checklists.push(...Checklists.find({ cardId: card._id }).fetch()); - result.checklistItems.push(...ChecklistItems.find({ cardId: card._id }).fetch()); - result.subtaskItems.push(...Cards.find({ parentid: card._id }).fetch()); + result.checklists.push(...Checklists.find({ + cardId: card._id + }).fetch()); + result.checklistItems.push(...ChecklistItems.find({ + cardId: card._id + }).fetch()); + result.subtaskItems.push(...Cards.find({ + parentid: card._id + }).fetch()); + }); + result.rules.forEach((rule) => { + result.triggers.push(...Triggers.find({ + _id: rule.triggerId + }, noBoardId).fetch()); + result.actions.push(...Actions.find({ + _id: rule.actionId + }, noBoardId).fetch()); }); // [Old] for attachments we only export IDs and absolute url to original doc @@ -99,18 +129,34 @@ class Exporter { // 1- only exports users that are linked somehow to that board // 2- do not export any sensitive information const users = {}; - result.members.forEach((member) => { users[member.userId] = true; }); - result.lists.forEach((list) => { users[list.userId] = true; }); + result.members.forEach((member) => { + users[member.userId] = true; + }); + result.lists.forEach((list) => { + users[list.userId] = true; + }); result.cards.forEach((card) => { users[card.userId] = true; if (card.members) { - card.members.forEach((memberId) => { users[memberId] = true; }); + card.members.forEach((memberId) => { + users[memberId] = true; + }); } }); - result.comments.forEach((comment) => { users[comment.userId] = true; }); - result.activities.forEach((activity) => { users[activity.userId] = true; }); - result.checklists.forEach((checklist) => { users[checklist.userId] = true; }); - const byUserIds = { _id: { $in: Object.getOwnPropertyNames(users) } }; + result.comments.forEach((comment) => { + users[comment.userId] = true; + }); + result.activities.forEach((activity) => { + users[activity.userId] = true; + }); + result.checklists.forEach((checklist) => { + users[checklist.userId] = true; + }); + const byUserIds = { + _id: { + $in: Object.getOwnPropertyNames(users) + } + }; // we use whitelist to be sure we do not expose inadvertently // some secret fields that gets added to User later. const userFields = { @@ -136,4 +182,4 @@ class Exporter { const board = Boards.findOne(this._boardId); return board && board.isVisibleBy(user); } -} +}
\ No newline at end of file |