rulesHelper.js 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. RulesHelper = {
  2. executeRules(activity){
  3. const matchingRules = this.findMatchingRules(activity);
  4. for(let i = 0; i< matchingRules.length; i++){
  5. const action = matchingRules[i].getAction();
  6. this.performAction(activity, action);
  7. }
  8. },
  9. findMatchingRules(activity){
  10. const activityType = activity.activityType;
  11. if(TriggersDef[activityType] === undefined){
  12. return [];
  13. }
  14. const matchingFields = TriggersDef[activityType].matchingFields;
  15. const matchingMap = this.buildMatchingFieldsMap(activity, matchingFields);
  16. const matchingTriggers = Triggers.find(matchingMap);
  17. const matchingRules = [];
  18. matchingTriggers.forEach(function(trigger){
  19. matchingRules.push(trigger.getRule());
  20. });
  21. return matchingRules;
  22. },
  23. buildMatchingFieldsMap(activity, matchingFields){
  24. const matchingMap = {'activityType':activity.activityType};
  25. for(let i = 0; i< matchingFields.length; i++){
  26. // Creating a matching map with the actual field of the activity
  27. // and with the wildcard (for example: trigger when a card is added
  28. // in any [*] board
  29. matchingMap[matchingFields[i]] = { $in: [activity[matchingFields[i]], '*']};
  30. }
  31. return matchingMap;
  32. },
  33. performAction(activity, action){
  34. const card = Cards.findOne({_id:activity.cardId});
  35. const boardId = activity.boardId;
  36. if(action.actionType === 'moveCardToTop'){
  37. let listId;
  38. let list;
  39. if(activity.listTitle === '*'){
  40. listId = card.swimlaneId;
  41. list = card.list();
  42. }else{
  43. list = Lists.findOne({title: action.listTitle, boardId });
  44. listId = list._id;
  45. }
  46. const minOrder = _.min(list.cards(card.swimlaneId).map((c) => c.sort));
  47. card.move(card.swimlaneId, listId, minOrder - 1);
  48. }
  49. if(action.actionType === 'moveCardToBottom'){
  50. let listId;
  51. let list;
  52. if(activity.listTitle === '*'){
  53. listId = card.swimlaneId;
  54. list = card.list();
  55. }else{
  56. list = Lists.findOne({title: action.listTitle, boardId});
  57. listId = list._id;
  58. }
  59. const maxOrder = _.max(list.cards(card.swimlaneId).map((c) => c.sort));
  60. card.move(card.swimlaneId, listId, maxOrder + 1);
  61. }
  62. if(action.actionType === 'sendEmail'){
  63. const emailTo = action.emailTo;
  64. const emailMsg = action.emailMsg;
  65. const emailSubject = action.emailSubject;
  66. try {
  67. Email.send({
  68. to,
  69. from: Accounts.emailTemplates.from,
  70. subject,
  71. text,
  72. });
  73. } catch (e) {
  74. return;
  75. }
  76. }
  77. if(action.actionType === 'archive'){
  78. card.archive();
  79. }
  80. if(action.actionType === 'unarchive'){
  81. card.restore();
  82. }
  83. if(action.actionType === 'addLabel'){
  84. card.addLabel(action.labelId);
  85. }
  86. if(action.actionType === 'removeLabel'){
  87. card.removeLabel(action.labelId);
  88. }
  89. if(action.actionType === 'addMember'){
  90. const memberId = Users.findOne({username:action.memberName})._id;
  91. card.assignMember(memberId);
  92. }
  93. if(action.actionType === 'removeMember'){
  94. if(action.memberName === '*'){
  95. const members = card.members;
  96. for(let i = 0; i< members.length; i++){
  97. card.unassignMember(members[i]);
  98. }
  99. }else{
  100. const memberId = Users.findOne({username:action.memberName})._id;
  101. card.unassignMember(memberId);
  102. }
  103. }
  104. if(action.actionType === 'checkAll'){
  105. const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
  106. checkList.checkAllItems();
  107. }
  108. if(action.actionType === 'uncheckAll'){
  109. const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
  110. checkList.uncheckAllItems();
  111. }
  112. if(action.actionType === 'checkItem'){
  113. const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
  114. const checkItem = ChecklistItems.findOne({'title':action.checkItemName, 'checkListId':checkList._id});
  115. checkItem.check();
  116. }
  117. if(action.actionType === 'uncheckItem'){
  118. const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
  119. const checkItem = ChecklistItems.findOne({'title':action.checkItemName, 'checkListId':checkList._id});
  120. checkItem.uncheck();
  121. }
  122. if(action.actionType === 'addChecklist'){
  123. Checklists.insert({'title':action.checklistName, 'cardId':card._id, 'sort':0});
  124. }
  125. if(action.actionType === 'removeChecklist'){
  126. Checklists.remove({'title':action.checklistName, 'cardId':card._id, 'sort':0});
  127. }
  128. },
  129. };