From d8892d640860b77795b1e81d2ba121cf65d35373 Mon Sep 17 00:00:00 2001 From: Xavier Priour Date: Wed, 14 Oct 2015 17:57:58 +0200 Subject: Import single card: refactor to meteor method --- models/import.js | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 models/import.js (limited to 'models') diff --git a/models/import.js b/models/import.js new file mode 100644 index 00000000..83559078 --- /dev/null +++ b/models/import.js @@ -0,0 +1,98 @@ +Meteor.methods({ + /** + * + */ + importTrelloCard(trelloCard, listId, sortIndex) { + DateString = Match.Where(function (dateAsString) { + check(dateAsString, String); + //const date = new Date(dateAsString); + //return (date.toString() !== 'Invalid Date') && !isNan(date); + return moment(dateAsString, moment.ISO_8601).isValid(); + }); + + check(trelloCard, Match.ObjectIncluding({ + name: String, + desc: String, + closed: Boolean, + dateLastActivity: DateString, + labels: [Match.ObjectIncluding({ + name: String, + color: String, + })], + actions: [Match.ObjectIncluding({ + type: String, + date: DateString, + data: Object, + })], + members: [Object], + })); + check(listId, String); + check(sortIndex, Number); + + const list = Lists.findOne(listId); + if(!list) { + throw 'exception-list-doesNotExist'; + } + + // XXX check we are allowed to run method + + // 1. map all fields for the card to create + const dateOfImport = new Date(); + // XXX parse trelloCard.actions to determine creation date + const cardToCreate = { + title: trelloCard.name, + description: trelloCard.desc, + listId: list._id, + boardId: list.boardId, + userId: Meteor.userId(), + sort: sortIndex, + archived: trelloCard.closed, + // XXX dateOfImport + createdAt: dateOfImport, + dateLastActivity: dateOfImport, + }; + // 2. map labels + trelloCard.labels.forEach((currentLabel) => { + const color = currentLabel.color; + const name = currentLabel.name; + const existingLabel = list.board().getLabel(name, color); + let labelId = undefined; + if (existingLabel) { + labelId = existingLabel._id; + } else { + let labelCreated = list.board().addLabel(name, color); + // XXX currently mutations return no value so we have to fetch the label we just created + // waiting on https://github.com/mquandalle/meteor-collection-mutations/issues/1 to remove... + labelCreated = list.board().getLabel(name, color); + labelId = labelCreated._id; + } + if(labelId) { + if (!cardToCreate.labelIds) { + cardToCreate.labelIds = []; + } + cardToCreate.labelIds.push(labelId); + } + }); + // 3. insert new card into list + // XXX replace with direct MongoDB inserts + const _id = Cards.direct.insert(cardToCreate); + // XXX then add import activity + // 4. parse actions and add comments + trelloCard.actions.forEach((currentAction) => { + if(currentAction.type === 'commentCard') { + const commentToCreate = { + boardId: list.boardId, + cardId: _id, + userId: Meteor.userId(), + text: currentAction.data.text, + createdAt: currentAction.date, + }; + // console.log(commentToCreate); + CardComments.direct.insert(commentToCreate); + } + // XXX add other type of activities? + // XXX look for createCard to set create date > no do it BEFORE saving + }); + return _id; + }, +}); -- cgit v1.2.3-1-g7c22