summaryrefslogtreecommitdiffstats
path: root/models/export.js
diff options
context:
space:
mode:
authorAngelo Gallarello <angelo.gallarell@gmail.com>2018-09-14 19:20:24 +0200
committerAngelo Gallarello <angelo.gallarell@gmail.com>2018-09-14 19:20:24 +0200
commit8cb132f492d3e4eb41b9f6766a59312942e345fa (patch)
tree7ca01a45a0ec56b121dad55d4ba3adb3d00b8d93 /models/export.js
parenta57806b054e076c5e5a94263b67125e0340c0e2f (diff)
downloadwekan-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.js80
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