wekan/server/rulesHelper.js

176 lines
6.1 KiB
JavaScript
Raw Normal View History

2018-08-16 00:32:31 +02:00
RulesHelper = {
2018-09-16 01:50:36 +03:00
executeRules(activity){
const matchingRules = this.findMatchingRules(activity);
for(let i = 0; i< matchingRules.length; i++){
const action = matchingRules[i].getAction();
if(action !== undefined){
2018-10-07 18:10:01 +02:00
this.performAction(activity, action);
}
2018-09-16 01:50:36 +03:00
}
},
findMatchingRules(activity){
const activityType = activity.activityType;
if(TriggersDef[activityType] === undefined){
return [];
}
const matchingFields = TriggersDef[activityType].matchingFields;
const matchingMap = this.buildMatchingFieldsMap(activity, matchingFields);
const matchingTriggers = Triggers.find(matchingMap);
const matchingRules = [];
matchingTriggers.forEach(function(trigger){
2018-10-07 18:10:01 +02:00
const rule = trigger.getRule();
// Check that for some unknown reason there are some leftover triggers
// not connected to any rules
if(rule !== undefined){
2018-10-07 18:10:01 +02:00
matchingRules.push(trigger.getRule());
}
2018-09-16 01:50:36 +03:00
});
return matchingRules;
},
buildMatchingFieldsMap(activity, matchingFields){
const matchingMap = {'activityType':activity.activityType};
for(let i = 0; i< matchingFields.length; i++){
// Creating a matching map with the actual field of the activity
// and with the wildcard (for example: trigger when a card is added
// in any [*] board
matchingMap[matchingFields[i]] = { $in: [activity[matchingFields[i]], '*']};
}
return matchingMap;
},
performAction(activity, action){
const card = Cards.findOne({_id:activity.cardId});
const boardId = activity.boardId;
if(action.actionType === 'moveCardToTop'){
let listId;
let list;
2018-09-21 14:22:00 +02:00
if(action.listTitle === '*'){
listId = card.listId;
2018-09-16 01:50:36 +03:00
list = card.list();
}else{
list = Lists.findOne({title: action.listTitle, boardId });
listId = list._id;
}
2018-09-21 17:06:22 +02:00
const minOrder = _.min(list.cardsUnfiltered(card.swimlaneId).map((c) => c.sort));
2018-09-16 01:50:36 +03:00
card.move(card.swimlaneId, listId, minOrder - 1);
}
if(action.actionType === 'moveCardToBottom'){
let listId;
let list;
2018-09-21 14:22:00 +02:00
if(action.listTitle === '*'){
listId = card.listId;
2018-09-16 01:50:36 +03:00
list = card.list();
}else{
list = Lists.findOne({title: action.listTitle, boardId});
listId = list._id;
}
2018-09-21 17:06:22 +02:00
const maxOrder = _.max(list.cardsUnfiltered(card.swimlaneId).map((c) => c.sort));
2018-09-16 01:50:36 +03:00
card.move(card.swimlaneId, listId, maxOrder + 1);
}
if(action.actionType === 'sendEmail'){
2019-03-21 10:22:57 -05:00
const to = action.emailTo;
const text = action.emailMsg || '';
const subject = action.emailSubject || '';
2018-09-16 01:50:36 +03:00
try {
Email.send({
2019-03-21 10:22:57 -05:00
to,
2018-09-16 01:50:36 +03:00
from: Accounts.emailTemplates.from,
2019-03-21 10:22:57 -05:00
subject,
text,
2018-09-16 01:50:36 +03:00
});
} catch (e) {
2019-03-18 23:50:15 -05:00
// eslint-disable-next-line no-console
2019-03-18 23:06:18 -05:00
console.error(e);
2018-09-16 01:50:36 +03:00
return;
}
}
if(action.actionType === 'archive'){
card.archive();
}
if(action.actionType === 'unarchive'){
card.restore();
}
2019-01-22 10:39:30 +01:00
if(action.actionType === 'setColor'){
card.setColor(action.selectedColor);
}
2018-09-16 01:50:36 +03:00
if(action.actionType === 'addLabel'){
card.addLabel(action.labelId);
}
if(action.actionType === 'removeLabel'){
card.removeLabel(action.labelId);
}
if(action.actionType === 'addMember'){
const memberId = Users.findOne({username:action.username})._id;
2018-09-16 01:50:36 +03:00
card.assignMember(memberId);
}
if(action.actionType === 'removeMember'){
if(action.username === '*'){
2018-09-16 01:50:36 +03:00
const members = card.members;
for(let i = 0; i< members.length; i++){
card.unassignMember(members[i]);
}
}else{
const memberId = Users.findOne({username:action.username})._id;
2018-09-16 01:50:36 +03:00
card.unassignMember(memberId);
}
}
if(action.actionType === 'checkAll'){
const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
checkList.checkAllItems();
}
if(action.actionType === 'uncheckAll'){
const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
checkList.uncheckAllItems();
}
if(action.actionType === 'checkItem'){
const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
const checkItem = ChecklistItems.findOne({'title':action.checkItemName, 'checkListId':checkList._id});
checkItem.check();
}
if(action.actionType === 'uncheckItem'){
const checkList = Checklists.findOne({'title':action.checklistName, 'cardId':card._id});
const checkItem = ChecklistItems.findOne({'title':action.checkItemName, 'checkListId':checkList._id});
checkItem.uncheck();
}
if(action.actionType === 'addChecklist'){
Checklists.insert({'title':action.checklistName, 'cardId':card._id, 'sort':0});
}
if(action.actionType === 'removeChecklist'){
Checklists.remove({'title':action.checklistName, 'cardId':card._id, 'sort':0});
}
if(action.actionType === 'addSwimlane'){
Swimlanes.insert({
title: action.swimlaneName,
2019-01-02 22:51:00 +01:00
boardId,
2019-02-12 23:40:12 +01:00
sort: 0
});
}
if(action.actionType === 'addChecklistWithItems'){
2019-01-02 22:51:00 +01:00
const checkListId = Checklists.insert({'title':action.checklistName, 'cardId':card._id, 'sort':0});
const itemsArray = action.checklistItems.split(',');
2019-02-12 23:40:12 +01:00
const checkList = Checklists.findOne({_id:checkListId});
2019-01-02 22:51:00 +01:00
for(let i = 0; i <itemsArray.length; i++){
2019-02-12 23:40:12 +01:00
ChecklistItems.insert({title:itemsArray[i], checklistId:checkListId, cardId:card._id, 'sort':checkList.itemCount()});
2019-01-02 22:51:00 +01:00
}
}
2019-01-02 22:32:08 +01:00
if(action.actionType === 'createCard'){
2019-01-02 22:51:00 +01:00
const list = Lists.findOne({title:action.listName, boardId});
2019-01-02 22:32:08 +01:00
let listId = '';
let swimlaneId = '';
2019-01-02 22:51:00 +01:00
const swimlane = Swimlanes.findOne({title:action.swimlaneName, boardId});
2019-01-04 11:00:33 +02:00
if(list === undefined){
2019-01-02 22:32:08 +01:00
listId = '';
}else{
listId = list._id;
}
2019-01-04 11:00:33 +02:00
if(swimlane === undefined){
2019-01-02 22:51:00 +01:00
swimlaneId = Swimlanes.findOne({title:'Default', boardId})._id;
2019-01-02 22:32:08 +01:00
}else{
swimlaneId = swimlane._id;
}
2019-01-02 22:51:00 +01:00
Cards.insert({title:action.cardName, listId, swimlaneId, sort:0, boardId});
2019-01-02 22:32:08 +01:00
}
2018-08-19 18:53:50 +02:00
2018-09-16 01:50:36 +03:00
},
2018-08-16 00:32:31 +02:00
2018-09-16 01:50:36 +03:00
};