Forráskód Böngészése

Import board: now proper createdAt dates

Xavier Priour 9 éve
szülő
commit
595d5f97ac
2 módosított fájl, 82 hozzáadás és 1 törlés
  1. 9 1
      client/components/import/import.js
  2. 73 0
      models/import.js

+ 9 - 1
client/components/import/import.js

@@ -28,7 +28,7 @@ const ImportPopup = BlazeComponent.extendComponent({
               this.setError(error.error);
             } else {
               Filter.addException(response);
-              Popup.close();
+              this.onFinish(response);
             }
           }
         );
@@ -43,6 +43,10 @@ const ImportPopup = BlazeComponent.extendComponent({
   setError(error) {
     this.error.set(error);
   },
+
+  onFinish() {
+    Popup.close();
+  }
 });
 
 ImportPopup.extendComponent({
@@ -76,5 +80,9 @@ ImportPopup.extendComponent({
   getLabel() {
     return 'import-board-trello-instruction';
   },
+
+  onFinish(response) {
+    Utils.goBoardId(response);
+  },
 }).register('boardImportBoardPopup');
 

+ 73 - 0
models/import.js

@@ -1,3 +1,72 @@
+const trelloCreator = {
+  // the object creation dates, indexed by Trello id (so we only parse actions once!)
+  createdAt: {
+    board: null,
+    cards: {},
+    lists: {},
+  },
+
+  // the labels we created, indexed by Trello id (to map when importing cards)
+  labels: {},
+
+  /**
+   * must call parseActions before calling this one
+   */
+  createBoard(trelloBoard, dateOfImport) {
+    const createdAt = this.createdAt.board;
+    const boardToCreate = {
+      archived: trelloBoard.closed,
+      // XXX map from Trello colors
+      color: Boards.simpleSchema()._schema.color.allowedValues[0],
+      createdAt,
+      labels: [],
+      members: [{
+        userId: Meteor.userId(),
+        isAdmin: true,
+        isActive: true,
+      }],
+      // XXX make a more robust mapping algorithm?
+      permission: trelloBoard.prefs.permissionLevel,
+      slug: getSlug(trelloBoard.name) || 'board',
+      stars: 0,
+      title: trelloBoard.name,
+    };
+    trelloBoard.labels.forEach((label) => {
+      labelToCreate = {
+        _id: Random.id(6),
+        color: label.color,
+        name: label.name,
+      };
+      // we need to remember them by Trello ID, as this is the only ref we have when importing cards
+      this.labels[label.id] = labelToCreate;
+      boardToCreate.labels.push(labelToCreate);
+    });
+    const boardId = Boards.direct.insert(boardToCreate);
+    return boardId;
+  },
+
+  parseActions(trelloActions) {
+    trelloActions.forEach((action) =>{
+      switch (action.type) {
+        case 'createBoard':
+          this.createdAt.board = action.date;
+          break;
+        case 'createCard':
+          const cardId = action.data.card.id;
+          this.createdAt.cards[cardId] = action.date;
+          break;
+        case 'createList':
+          const listId = action.data.list.id;
+          this.createdAt.lists[listId] = action.date;
+          break;
+        default:
+          // do nothing
+          break;
+      }
+    });
+  }
+}
+
 Meteor.methods({
   importTrelloCard(trelloCard, data) {
     // 1. check parameters are ok from a syntax point of view
@@ -141,5 +210,9 @@ Meteor.methods({
     // 2. check parameters are ok from a business point of view (exist & authorized)
     // XXX check we are allowed
     // 3. create all elements
+    const dateOfImport = new Date();
+    trelloCreator.parseActions(trelloBoard.actions);
+    const boardId = trelloCreator.createBoard(trelloBoard, dateOfImport);
+    return boardId;
   },
 });