Merge branch 'feature/import-activities' of https://github.com/GhassenRjab/wekan into GhassenRjab-feature/import-activities

This commit is contained in:
Lauri Ojansivu 2017-08-30 00:24:49 +03:00
commit decb31ffa4
2 changed files with 298 additions and 69 deletions

View file

@ -27,6 +27,10 @@ export class TrelloCreator {
this.lists = {}; this.lists = {};
// Map of cards Trello ID => Wekan ID // Map of cards Trello ID => Wekan ID
this.cards = {}; this.cards = {};
// Map of attachments Wekan ID => Wekan ID
this.attachmentIds = {};
// Map of checklists Wekan ID => Wekan ID
this.checklists = {};
// The comments, indexed by Trello card id (to map when importing cards) // The comments, indexed by Trello card id (to map when importing cards)
this.comments = {}; this.comments = {};
// the members, indexed by Trello member id => Wekan user ID // the members, indexed by Trello member id => Wekan user ID
@ -261,21 +265,21 @@ export class TrelloCreator {
// keep track of Trello id => WeKan id // keep track of Trello id => WeKan id
this.cards[card.id] = cardId; this.cards[card.id] = cardId;
// log activity // log activity
Activities.direct.insert({ // Activities.direct.insert({
activityType: 'importCard', // activityType: 'importCard',
boardId, // boardId,
cardId, // cardId,
createdAt: this._now(), // createdAt: this._now(),
listId: cardToCreate.listId, // listId: cardToCreate.listId,
source: { // source: {
id: card.id, // id: card.id,
system: 'Trello', // system: 'Trello',
url: card.url, // url: card.url,
}, // },
// we attribute the import to current user, // // we attribute the import to current user,
// not the author of the original card // // not the author of the original card
userId: this._user(), // userId: this._user(),
}); // });
// add comments // add comments
const comments = this.comments[card.id]; const comments = this.comments[card.id];
if (comments) { if (comments) {
@ -291,12 +295,14 @@ export class TrelloCreator {
// dateLastActivity will be set from activity insert, no need to // dateLastActivity will be set from activity insert, no need to
// update it ourselves // update it ourselves
const commentId = CardComments.direct.insert(commentToCreate); const commentId = CardComments.direct.insert(commentToCreate);
// We need to keep adding comment activities this way with Trello
// because it doesn't provide a comment ID
Activities.direct.insert({ Activities.direct.insert({
activityType: 'addComment', activityType: 'addComment',
boardId: commentToCreate.boardId, boardId: commentToCreate.boardId,
cardId: commentToCreate.cardId, cardId: commentToCreate.cardId,
commentId, commentId,
createdAt: this._now(commentToCreate.createdAt), createdAt: this._now(comment.date),
// we attribute the addComment (not the import) // we attribute the addComment (not the import)
// to the original author - it is needed by some UI elements. // to the original author - it is needed by some UI elements.
userId: commentToCreate.userId, userId: commentToCreate.userId,
@ -322,6 +328,7 @@ export class TrelloCreator {
const wekanAtt = Attachments.insert(file, () => { const wekanAtt = Attachments.insert(file, () => {
// we do nothing // we do nothing
}); });
this.attachmentIds[att.id] = wekanAtt._id;
// //
if(trelloCoverId === att.id) { if(trelloCoverId === att.id) {
Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}}); Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}});
@ -368,19 +375,19 @@ export class TrelloCreator {
Lists.direct.update(listId, {$set: {'updatedAt': this._now()}}); Lists.direct.update(listId, {$set: {'updatedAt': this._now()}});
this.lists[list.id] = listId; this.lists[list.id] = listId;
// log activity // log activity
Activities.direct.insert({ // Activities.direct.insert({
activityType: 'importList', // activityType: 'importList',
boardId, // boardId,
createdAt: this._now(), // createdAt: this._now(),
listId, // listId,
source: { // source: {
id: list.id, // id: list.id,
system: 'Trello', // system: 'Trello',
}, // },
// We attribute the import to current user, // // We attribute the import to current user,
// not the creator of the original object // // not the creator of the original object
userId: this._user(), // userId: this._user(),
}); // });
}); });
} }
@ -393,6 +400,8 @@ export class TrelloCreator {
createdAt: this._now(), createdAt: this._now(),
}; };
const checklistId = Checklists.direct.insert(checklistToCreate); const checklistId = Checklists.direct.insert(checklistToCreate);
// keep track of Trello id => WeKan id
this.checklists[checklist.id] = checklistId;
// Now add the items to the checklist // Now add the items to the checklist
const itemsToCreate = []; const itemsToCreate = [];
checklist.checkItems.forEach((item) => { checklist.checkItems.forEach((item) => {
@ -472,6 +481,99 @@ export class TrelloCreator {
}); });
} }
importActions(actions, boardId) {
actions.forEach((action) => {
switch (action.type) {
// Board related actions
// TODO: addBoardMember, removeBoardMember
case 'createBoard': {
Activities.direct.insert({
userId: this._user(action.idMemberCreator),
type: 'board',
activityTypeId: boardId,
activityType: 'createBoard',
boardId,
createdAt: this._now(action.date),
});
break;
}
// List related activities
// TODO: removeList, archivedList
case 'createList': {
Activities.direct.insert({
userId: this._user(action.idMemberCreator),
type: 'list',
activityType: 'createList',
listId: this.lists[action.data.list.id],
boardId,
createdAt: this._now(action.date),
});
break;
}
// Card related activities
// TODO: archivedCard, restoredCard, joinMember, unjoinMember
case 'createCard': {
Activities.direct.insert({
userId: this._user(action.idMemberCreator),
activityType: 'createCard',
listId: this.lists[action.data.list.id],
cardId: this.cards[action.data.card.id],
boardId,
createdAt: this._now(action.date),
});
break;
}
case 'updateCard': {
if (action.data.old.idList) {
Activities.direct.insert({
userId: this._user(action.idMemberCreator),
oldListId: this.lists[action.data.old.idList],
activityType: 'moveCard',
listId: this.lists[action.data.listAfter.id],
cardId: this.cards[action.data.card.id],
boardId,
createdAt: this._now(action.date),
});
}
break;
}
// Comment related activities
// Trello doesn't export the comment id
// Attachment related activities
// TODO: We can't add activities related to adding attachments
// because when we import an attachment, an activity is
// autmatically created. We need to directly insert the attachment
// without calling the "Attachments.files.after.insert" hook first,
// then we can uncomment the code below
// case 'addAttachment': {
// console.log(this.attachmentIds);
// Activities.direct.insert({
// userId: this._user(activity.userId),
// type: 'card',
// activityType: activity.activityType,
// attachmentId: this.attachmentIds[activity.attachmentId],
// cardId: this.cards[activity.cardId],
// boardId,
// createdAt: this._now(activity.createdAt),
// });
// break;
// }
// Checklist related activities
case 'addChecklistToCard': {
Activities.direct.insert({
userId: this._user(action.idMemberCreator),
activityType: 'addChecklist',
cardId: this.cards[action.data.card.id],
checklistId: this.checklists[action.data.checklist.id],
boardId,
createdAt: this._now(action.date),
});
break;
}}
// Trello doesn't have an add checklist item action
});
}
check(board) { check(board) {
try { try {
// check(data, { // check(data, {
@ -501,6 +603,7 @@ export class TrelloCreator {
this.createLists(board.lists, boardId); this.createLists(board.lists, boardId);
this.createCards(board.cards, boardId); this.createCards(board.cards, boardId);
this.createChecklists(board.checklists); this.createChecklists(board.checklists);
this.importActions(board.actions, boardId);
// XXX add members // XXX add members
return boardId; return boardId;
} }

View file

@ -27,6 +27,12 @@ export class WekanCreator {
this.lists = {}; this.lists = {};
// Map of cards Wekan ID => Wekan ID // Map of cards Wekan ID => Wekan ID
this.cards = {}; this.cards = {};
// Map of comments Wekan ID => Wekan ID
this.commentIds = {};
// Map of attachments Wekan ID => Wekan ID
this.attachmentIds = {};
// Map of checklists Wekan ID => Wekan ID
this.checklists = {};
// The comments, indexed by Wekan card id (to map when importing cards) // The comments, indexed by Wekan card id (to map when importing cards)
this.comments = {}; this.comments = {};
// the members, indexed by Wekan member id => Wekan user ID // the members, indexed by Wekan member id => Wekan user ID
@ -249,21 +255,21 @@ export class WekanCreator {
const cardId = Cards.direct.insert(cardToCreate); const cardId = Cards.direct.insert(cardToCreate);
// keep track of Wekan id => WeKan id // keep track of Wekan id => WeKan id
this.cards[card._id] = cardId; this.cards[card._id] = cardId;
// log activity // // log activity
Activities.direct.insert({ // Activities.direct.insert({
activityType: 'importCard', // activityType: 'importCard',
boardId, // boardId,
cardId, // cardId,
createdAt: this._now(), // createdAt: this._now(),
listId: cardToCreate.listId, // listId: cardToCreate.listId,
source: { // source: {
id: card._id, // id: card._id,
system: 'Wekan', // system: 'Wekan',
}, // },
// we attribute the import to current user, // // we attribute the import to current user,
// not the author of the original card // // not the author of the original card
userId: this._user(), // userId: this._user(),
}); // });
// add comments // add comments
const comments = this.comments[card._id]; const comments = this.comments[card._id];
if (comments) { if (comments) {
@ -271,7 +277,7 @@ export class WekanCreator {
const commentToCreate = { const commentToCreate = {
boardId, boardId,
cardId, cardId,
createdAt: this._now(comment.date), createdAt: this._now(comment.createdAt),
text: comment.text, text: comment.text,
// we attribute the comment to the original author, default to current user // we attribute the comment to the original author, default to current user
userId: this._user(comment.userId), userId: this._user(comment.userId),
@ -279,16 +285,17 @@ export class WekanCreator {
// dateLastActivity will be set from activity insert, no need to // dateLastActivity will be set from activity insert, no need to
// update it ourselves // update it ourselves
const commentId = CardComments.direct.insert(commentToCreate); const commentId = CardComments.direct.insert(commentToCreate);
Activities.direct.insert({ this.commentIds[comment._id] = commentId;
activityType: 'addComment', // Activities.direct.insert({
boardId: commentToCreate.boardId, // activityType: 'addComment',
cardId: commentToCreate.cardId, // boardId: commentToCreate.boardId,
commentId, // cardId: commentToCreate.cardId,
createdAt: this._now(commentToCreate.createdAt), // commentId,
// we attribute the addComment (not the import) // createdAt: this._now(commentToCreate.createdAt),
// to the original author - it is needed by some UI elements. // // we attribute the addComment (not the import)
userId: commentToCreate.userId, // // to the original author - it is needed by some UI elements.
}); // userId: commentToCreate.userId,
// });
}); });
} }
const attachments = this.attachments[card._id]; const attachments = this.attachments[card._id];
@ -311,6 +318,7 @@ export class WekanCreator {
const wekanAtt = Attachments.insert(file, () => { const wekanAtt = Attachments.insert(file, () => {
// we do nothing // we do nothing
}); });
this.attachmentIds[att._id] = wekanAtt._id;
// //
if(wekanCoverId === att._id) { if(wekanCoverId === att._id) {
Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}}); Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}});
@ -328,6 +336,7 @@ export class WekanCreator {
const wekanAtt = Attachments.insert(file, () => { const wekanAtt = Attachments.insert(file, () => {
// we do nothing // we do nothing
}); });
this.attachmentIds[att._id] = wekanAtt._id;
// //
if(wekanCoverId === att._id) { if(wekanCoverId === att._id) {
Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}}); Cards.direct.update(cardId, { $set: {coverId: wekanAtt._id}});
@ -374,20 +383,20 @@ export class WekanCreator {
const listId = Lists.direct.insert(listToCreate); 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; this.lists[list._id] = listId;
// log activity // // log activity
Activities.direct.insert({ // Activities.direct.insert({
activityType: 'importList', // activityType: 'importList',
boardId, // boardId,
createdAt: this._now(), // createdAt: this._now(),
listId, // listId,
source: { // source: {
id: list._id, // id: list._id,
system: 'Wekan', // system: 'Wekan',
}, // },
// We attribute the import to current user, // // We attribute the import to current user,
// not the creator of the original object // // not the creator of the original object
userId: this._user(), // userId: this._user(),
}); // });
}); });
} }
@ -400,6 +409,8 @@ export class WekanCreator {
createdAt: checklist.createdAt, createdAt: checklist.createdAt,
}; };
const checklistId = Checklists.direct.insert(checklistToCreate); const checklistId = Checklists.direct.insert(checklistToCreate);
// keep track of Wekan id => WeKan id
this.checklists[checklist._id] = checklistId;
// Now add the items to the checklist // Now add the items to the checklist
const itemsToCreate = []; const itemsToCreate = [];
checklist.items.forEach((item) => { checklist.items.forEach((item) => {
@ -463,6 +474,120 @@ export class WekanCreator {
}); });
} }
importActivities(activities, boardId) {
activities.forEach((activity) => {
switch (activity.activityType) {
// Board related activities
// TODO: addBoardMember, removeBoardMember
case 'createBoard': {
Activities.direct.insert({
userId: this._user(activity.userId),
type: 'board',
activityTypeId: boardId,
activityType: activity.activityType,
boardId,
createdAt: this._now(activity.createdAt),
});
break;
}
// List related activities
// TODO: removeList, archivedList
case 'createList': {
Activities.direct.insert({
userId: this._user(activity.userId),
type: 'list',
activityType: activity.activityType,
listId: this.lists[activity.listId],
boardId,
createdAt: this._now(activity.createdAt),
});
break;
}
// Card related activities
// TODO: archivedCard, restoredCard, joinMember, unjoinMember
case 'createCard': {
Activities.direct.insert({
userId: this._user(activity.userId),
activityType: activity.activityType,
listId: this.lists[activity.listId],
cardId: this.cards[activity.cardId],
boardId,
createdAt: this._now(activity.createdAt),
});
break;
}
case 'moveCard': {
Activities.direct.insert({
userId: this._user(activity.userId),
oldListId: this.lists[activity.oldListId],
activityType: activity.activityType,
listId: this.lists[activity.listId],
cardId: this.cards[activity.cardId],
boardId,
createdAt: this._now(activity.createdAt),
});
break;
}
// Comment related activities
case 'addComment': {
Activities.direct.insert({
userId: this._user(activity.userId),
activityType: activity.activityType,
cardId: this.cards[activity.cardId],
commentId: this.commentIds[activity.commentId],
boardId,
createdAt: this._now(activity.createdAt),
});
break;
}
// Attachment related activities
// TODO: We can't add activities related to adding attachments
// because when we import an attachment, an activity is
// autmatically created. We need to directly insert the attachment
// without calling the "Attachments.files.after.insert" hook first,
// then we can uncomment the code below
// case 'addAttachment': {
// console.log(this.attachmentIds);
// Activities.direct.insert({
// userId: this._user(activity.userId),
// type: 'card',
// activityType: activity.activityType,
// attachmentId: this.attachmentIds[activity.attachmentId],
// cardId: this.cards[activity.cardId],
// boardId,
// createdAt: this._now(activity.createdAt),
// });
// break;
// }
// Checklist related activities
case 'addChecklist': {
Activities.direct.insert({
userId: this._user(activity.userId),
activityType: activity.activityType,
cardId: this.cards[activity.cardId],
checklistId: this.checklists[activity.checklistId],
boardId,
createdAt: this._now(activity.createdAt),
});
break;
}
case 'addChecklistItem': {
Activities.direct.insert({
userId: this._user(activity.userId),
activityType: activity.activityType,
cardId: this.cards[activity.cardId],
checklistId: this.checklists[activity.checklistId],
checklistItemId: activity.checklistItemId.replace(
activity.checklistId,
this.checklists[activity.checklistId]),
boardId,
createdAt: this._now(activity.createdAt),
});
break;
}}
});
}
check(board) { check(board) {
try { try {
// check(data, { // check(data, {
@ -492,6 +617,7 @@ export class WekanCreator {
this.createLists(board.lists, boardId); this.createLists(board.lists, boardId);
this.createCards(board.cards, boardId); this.createCards(board.cards, boardId);
this.createChecklists(board.checklists); this.createChecklists(board.checklists);
this.importActivities(board.activities, boardId);
// XXX add members // XXX add members
return boardId; return boardId;
} }