diff options
Diffstat (limited to 'models/wekanCreator.js')
-rw-r--r-- | models/wekanCreator.js | 205 |
1 files changed, 159 insertions, 46 deletions
diff --git a/models/wekanCreator.js b/models/wekanCreator.js index d144821f..59d0cfd5 100644 --- a/models/wekanCreator.js +++ b/models/wekanCreator.js @@ -1,4 +1,4 @@ -const DateString = Match.Where(function (dateAsString) { +const DateString = Match.Where(function(dateAsString) { check(dateAsString, String); return moment(dateAsString, moment.ISO_8601).isValid(); }); @@ -42,6 +42,10 @@ export class WekanCreator { this.comments = {}; // the members, indexed by Wekan member id => Wekan user ID this.members = data.membersMapping ? data.membersMapping : {}; + // Map of triggers Wekan ID => Wekan ID + this.triggers = {}; + // Map of actions Wekan ID => Wekan ID + this.actions = {}; // maps a wekanCardId to an array of wekanAttachments this.attachments = {}; @@ -57,10 +61,10 @@ export class WekanCreator { * @param {String} dateString a properly formatted Date */ _now(dateString) { - if(dateString) { + if (dateString) { return new Date(dateString); } - if(!this._nowDate) { + if (!this._nowDate) { this._nowDate = new Date(); } return this._nowDate; @@ -72,9 +76,9 @@ export class WekanCreator { * Otherwise return current logged user. * @param wekanUserId * @private - */ + */ _user(wekanUserId) { - if(wekanUserId && this.members[wekanUserId]) { + if (wekanUserId && this.members[wekanUserId]) { return this.members[wekanUserId]; } return Meteor.userId(); @@ -96,7 +100,7 @@ export class WekanCreator { // allowed values (is it worth the maintenance?) color: String, permission: Match.Where((value) => { - return ['private', 'public'].indexOf(value)>= 0; + return ['private', 'public'].indexOf(value) >= 0; }), })); } @@ -147,6 +151,30 @@ export class WekanCreator { })]); } + checkRules(wekanRules) { + check(wekanRules, [Match.ObjectIncluding({ + triggerId: String, + actionId: String, + title: String, + })]); + } + + checkTriggers(wekanTriggers) { + // XXX More check based on trigger type + check(wekanTriggers, [Match.ObjectIncluding({ + activityType: String, + desc: String, + })]); + } + + checkActions(wekanActions) { + // XXX More check based on action type + check(wekanActions, [Match.ObjectIncluding({ + actionType: String, + desc: String, + })]); + } + // You must call parseActions before calling this one. createBoardAndLabels(boardToImport) { const boardToCreate = { @@ -172,12 +200,12 @@ export class WekanCreator { title: boardToImport.title, }; // now add other members - if(boardToImport.members) { + if (boardToImport.members) { boardToImport.members.forEach((wekanMember) => { // do we already have it in our list? - if(!boardToCreate.members.some((member) => member.wekanId === wekanMember.wekanId)) + if (!boardToCreate.members.some((member) => member.wekanId === wekanMember.wekanId)) boardToCreate.members.push({ - ... wekanMember, + ...wekanMember, userId: wekanMember.wekanId, }); }); @@ -194,7 +222,11 @@ export class WekanCreator { boardToCreate.labels.push(labelToCreate); }); const boardId = Boards.direct.insert(boardToCreate); - Boards.direct.update(boardId, {$set: {modifiedAt: this._now()}}); + Boards.direct.update(boardId, { + $set: { + modifiedAt: this._now(), + }, + }); // log activity Activities.direct.insert({ activityType: 'importBoard', @@ -246,21 +278,21 @@ export class WekanCreator { }); } // add members { - if(card.members) { + if (card.members) { const wekanMembers = []; // we can't just map, as some members may not have been mapped card.members.forEach((sourceMemberId) => { - if(this.members[sourceMemberId]) { + if (this.members[sourceMemberId]) { const wekanId = this.members[sourceMemberId]; // we may map multiple Wekan members to the same wekan user // in which case we risk adding the same user multiple times - if(!wekanMembers.find((wId) => wId === wekanId)){ + if (!wekanMembers.find((wId) => wId === wekanId)) { wekanMembers.push(wekanId); } } return true; }); - if(wekanMembers.length>0) { + if (wekanMembers.length > 0) { cardToCreate.members = wekanMembers; } } @@ -321,9 +353,9 @@ export class WekanCreator { // - the template then tries to display the url to the attachment which causes other errors // so we make it server only, and let UI catch up once it is done, forget about latency comp. const self = this; - if(Meteor.isServer) { + if (Meteor.isServer) { if (att.url) { - file.attachData(att.url, function (error) { + file.attachData(att.url, function(error) { file.boardId = boardId; file.cardId = cardId; file.userId = self._user(att.userId); @@ -331,20 +363,26 @@ export class WekanCreator { // attachments' related activities automatically file.source = 'import'; if (error) { - throw(error); + throw (error); } else { const wekanAtt = Attachments.insert(file, () => { // we do nothing }); self.attachmentIds[att._id] = wekanAtt._id; // - if(wekanCoverId === att._id) { - Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}}); + if (wekanCoverId === att._id) { + Cards.direct.update(cardId, { + $set: { + coverId: wekanAtt._id, + }, + }); } } }); } else if (att.file) { - file.attachData(new Buffer(att.file, 'base64'), {type: att.type}, (error) => { + file.attachData(new Buffer(att.file, 'base64'), { + type: att.type, + }, (error) => { file.name(att.name); file.boardId = boardId; file.cardId = cardId; @@ -353,15 +391,19 @@ export class WekanCreator { // attachments' related activities automatically file.source = 'import'; if (error) { - throw(error); + throw (error); } else { const wekanAtt = Attachments.insert(file, () => { // we do nothing }); this.attachmentIds[att._id] = wekanAtt._id; // - if(wekanCoverId === att._id) { - Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}}); + if (wekanCoverId === att._id) { + Cards.direct.update(cardId, { + $set: { + coverId: wekanAtt._id, + }, + }); } } }); @@ -404,7 +446,11 @@ export class WekanCreator { sort: list.sort ? list.sort : listIndex, }; const listId = Lists.direct.insert(listToCreate); - Lists.direct.update(listId, {$set: {'updatedAt': this._now()}}); + Lists.direct.update(listId, { + $set: { + 'updatedAt': this._now(), + }, + }); this.lists[list._id] = listId; // // log activity // Activities.direct.insert({ @@ -437,7 +483,11 @@ export class WekanCreator { sort: swimlane.sort ? swimlane.sort : swimlaneIndex, }; const swimlaneId = Swimlanes.direct.insert(swimlaneToCreate); - Swimlanes.direct.update(swimlaneId, {$set: {'updatedAt': this._now()}}); + Swimlanes.direct.update(swimlaneId, { + $set: { + 'updatedAt': this._now(), + }, + }); this.swimlanes[swimlane._id] = swimlaneId; }); } @@ -459,6 +509,47 @@ export class WekanCreator { return result; } + createTriggers(wekanTriggers, boardId) { + wekanTriggers.forEach((trigger) => { + if (trigger.hasOwnProperty('labelId')) { + trigger.labelId = this.labels[trigger.labelId]; + } + if (trigger.hasOwnProperty('memberId')) { + trigger.memberId = this.members[trigger.memberId]; + } + trigger.boardId = boardId; + const oldId = trigger._id; + delete trigger._id; + this.triggers[oldId] = Triggers.direct.insert(trigger); + }); + } + + createActions(wekanActions, boardId) { + wekanActions.forEach((action) => { + if (action.hasOwnProperty('labelId')) { + action.labelId = this.labels[action.labelId]; + } + if (action.hasOwnProperty('memberId')) { + action.memberId = this.members[action.memberId]; + } + action.boardId = boardId; + const oldId = action._id; + delete action._id; + this.actions[oldId] = Actions.direct.insert(action); + }); + } + + createRules(wekanRules, boardId) { + wekanRules.forEach((rule) => { + // Create the rule + rule.boardId = boardId; + rule.triggerId = this.triggers[rule.triggerId]; + rule.actionId = this.actions[rule.actionId]; + delete rule._id; + Rules.direct.insert(rule); + }); + } + createChecklistItems(wekanChecklistItems) { wekanChecklistItems.forEach((checklistitem, checklistitemIndex) => { // Create the checklistItem @@ -477,7 +568,8 @@ export class WekanCreator { parseActivities(wekanBoard) { wekanBoard.activities.forEach((activity) => { switch (activity.activityType) { - case 'addAttachment': { + case 'addAttachment': + { // We have to be cautious, because the attachment could have been removed later. // In that case Wekan still reports its addition, but removes its 'url' field. // So we test for that @@ -485,12 +577,12 @@ export class WekanCreator { return attachment._id === activity.attachmentId; })[0]; - if ( typeof wekanAttachment !== 'undefined' && wekanAttachment ) { - if(wekanAttachment.url || wekanAttachment.file) { - // we cannot actually create the Wekan attachment, because we don't yet - // have the cards to attach it to, so we store it in the instance variable. + if (typeof wekanAttachment !== 'undefined' && wekanAttachment) { + if (wekanAttachment.url || wekanAttachment.file) { + // we cannot actually create the Wekan attachment, because we don't yet + // have the cards to attach it to, so we store it in the instance variable. const wekanCardId = activity.cardId; - if(!this.attachments[wekanCardId]) { + if (!this.attachments[wekanCardId]) { this.attachments[wekanCardId] = []; } this.attachments[wekanCardId].push(wekanAttachment); @@ -498,7 +590,8 @@ export class WekanCreator { } break; } - case 'addComment': { + case 'addComment': + { const wekanComment = wekanBoard.comments.filter((comment) => { return comment._id === activity.commentId; })[0]; @@ -509,26 +602,31 @@ export class WekanCreator { this.comments[id].push(wekanComment); break; } - case 'createBoard': { + case 'createBoard': + { this.createdAt.board = activity.createdAt; break; } - case 'createCard': { + case 'createCard': + { const cardId = activity.cardId; this.createdAt.cards[cardId] = activity.createdAt; this.createdBy.cards[cardId] = activity.userId; break; } - case 'createList': { + case 'createList': + { const listId = activity.listId; this.createdAt.lists[listId] = activity.createdAt; break; } - case 'createSwimlane': { + case 'createSwimlane': + { const swimlaneId = activity.swimlaneId; this.createdAt.swimlanes[swimlaneId] = activity.createdAt; break; - }} + } + } }); } @@ -537,7 +635,8 @@ export class WekanCreator { switch (activity.activityType) { // Board related activities // TODO: addBoardMember, removeBoardMember - case 'createBoard': { + case 'createBoard': + { Activities.direct.insert({ userId: this._user(activity.userId), type: 'board', @@ -550,7 +649,8 @@ export class WekanCreator { } // List related activities // TODO: removeList, archivedList - case 'createList': { + case 'createList': + { Activities.direct.insert({ userId: this._user(activity.userId), type: 'list', @@ -563,7 +663,8 @@ export class WekanCreator { } // Card related activities // TODO: archivedCard, restoredCard, joinMember, unjoinMember - case 'createCard': { + case 'createCard': + { Activities.direct.insert({ userId: this._user(activity.userId), activityType: activity.activityType, @@ -574,7 +675,8 @@ export class WekanCreator { }); break; } - case 'moveCard': { + case 'moveCard': + { Activities.direct.insert({ userId: this._user(activity.userId), oldListId: this.lists[activity.oldListId], @@ -587,7 +689,8 @@ export class WekanCreator { break; } // Comment related activities - case 'addComment': { + case 'addComment': + { Activities.direct.insert({ userId: this._user(activity.userId), activityType: activity.activityType, @@ -599,7 +702,8 @@ export class WekanCreator { break; } // Attachment related activities - case 'addAttachment': { + case 'addAttachment': + { Activities.direct.insert({ userId: this._user(activity.userId), type: 'card', @@ -612,7 +716,8 @@ export class WekanCreator { break; } // Checklist related activities - case 'addChecklist': { + case 'addChecklist': + { Activities.direct.insert({ userId: this._user(activity.userId), activityType: activity.activityType, @@ -623,7 +728,8 @@ export class WekanCreator { }); break; } - case 'addChecklistItem': { + case 'addChecklistItem': + { Activities.direct.insert({ userId: this._user(activity.userId), activityType: activity.activityType, @@ -636,7 +742,8 @@ export class WekanCreator { createdAt: this._now(activity.createdAt), }); break; - }} + } + } }); } @@ -652,6 +759,9 @@ export class WekanCreator { this.checkSwimlanes(board.swimlanes); this.checkCards(board.cards); this.checkChecklists(board.checklists); + this.checkRules(board.rules); + this.checkActions(board.actions); + this.checkTriggers(board.triggers); this.checkChecklistItems(board.checklistItems); } catch (e) { throw new Meteor.Error('error-json-schema'); @@ -674,6 +784,9 @@ export class WekanCreator { this.createChecklists(board.checklists); this.createChecklistItems(board.checklistItems); this.importActivities(board.activities, boardId); + this.createTriggers(board.triggers, boardId); + this.createActions(board.actions, boardId); + this.createRules(board.rules, boardId); // XXX add members return boardId; } |