mirror of https://github.com/wekan/wekan
The Open Source kanban (built with Meteor). Keep variable/table/field names camelCase. For translations, only add Pull Request changes to wekan/i18n/en.i18n.json , other translations are done at https://transifex.com/wekan/wekan only.
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
298 lines
6.8 KiB
298 lines
6.8 KiB
Meteor.publish('card', cardId => {
|
|
check(cardId, String);
|
|
return Cards.find({ _id: cardId });
|
|
});
|
|
|
|
Meteor.publish('myCards', function() {
|
|
const userId = Meteor.userId();
|
|
|
|
const archivedBoards = [];
|
|
Boards.find({ archived: true }).forEach(board => {
|
|
archivedBoards.push(board._id);
|
|
});
|
|
|
|
const archivedSwimlanes = [];
|
|
Swimlanes.find({ archived: true }).forEach(swimlane => {
|
|
archivedSwimlanes.push(swimlane._id);
|
|
});
|
|
|
|
const archivedLists = [];
|
|
Lists.find({ archived: true }).forEach(list => {
|
|
archivedLists.push(list._id);
|
|
});
|
|
|
|
selector = {
|
|
archived: false,
|
|
boardId: { $nin: archivedBoards },
|
|
swimlaneId: { $nin: archivedSwimlanes },
|
|
listId: { $nin: archivedLists },
|
|
$or: [{ members: userId }, { assignees: userId }],
|
|
};
|
|
|
|
const cards = Cards.find(selector, {
|
|
fields: {
|
|
_id: 1,
|
|
archived: 1,
|
|
boardId: 1,
|
|
swimlaneId: 1,
|
|
listId: 1,
|
|
title: 1,
|
|
type: 1,
|
|
sort: 1,
|
|
members: 1,
|
|
assignees: 1,
|
|
colors: 1,
|
|
dueAt: 1,
|
|
},
|
|
});
|
|
|
|
const boards = [];
|
|
const swimlanes = [];
|
|
const lists = [];
|
|
const users = [];
|
|
|
|
cards.forEach(card => {
|
|
if (card.boardId) boards.push(card.boardId);
|
|
if (card.swimlaneId) swimlanes.push(card.swimlaneId);
|
|
if (card.listId) lists.push(card.listId);
|
|
if (card.members) {
|
|
card.members.forEach(userId => {
|
|
users.push(userId);
|
|
});
|
|
}
|
|
if (card.assignees) {
|
|
card.assignees.forEach(userId => {
|
|
users.push(userId);
|
|
});
|
|
}
|
|
});
|
|
|
|
return [
|
|
cards,
|
|
Boards.find({ _id: { $in: boards } }),
|
|
Swimlanes.find({ _id: { $in: swimlanes } }),
|
|
Lists.find({ _id: { $in: lists } }),
|
|
Users.find({ _id: { $in: users } }),
|
|
];
|
|
});
|
|
|
|
Meteor.publish('dueCards', function(allUsers = false) {
|
|
check(allUsers, Boolean);
|
|
|
|
// eslint-disable-next-line no-console
|
|
// console.log('all users:', allUsers);
|
|
|
|
const user = Users.findOne(this.userId);
|
|
|
|
const archivedBoards = [];
|
|
Boards.find({ archived: true }).forEach(board => {
|
|
archivedBoards.push(board._id);
|
|
});
|
|
|
|
const permiitedBoards = [];
|
|
let selector = {
|
|
archived: false,
|
|
};
|
|
// if user is not an admin allow her to see cards only from boards where
|
|
// she is a member
|
|
if (!user.isAdmin) {
|
|
selector.$or = [
|
|
{ permission: 'public' },
|
|
{ members: { $elemMatch: { userId: user._id, isActive: true } } },
|
|
];
|
|
}
|
|
Boards.find(selector).forEach(board => {
|
|
permiitedBoards.push(board._id);
|
|
});
|
|
|
|
const archivedSwimlanes = [];
|
|
Swimlanes.find({ archived: true }).forEach(swimlane => {
|
|
archivedSwimlanes.push(swimlane._id);
|
|
});
|
|
|
|
const archivedLists = [];
|
|
Lists.find({ archived: true }).forEach(list => {
|
|
archivedLists.push(list._id);
|
|
});
|
|
|
|
selector = {
|
|
archived: false,
|
|
boardId: { $nin: archivedBoards, $in: permiitedBoards },
|
|
swimlaneId: { $nin: archivedSwimlanes },
|
|
listId: { $nin: archivedLists },
|
|
dueAt: { $ne: null },
|
|
endAt: null,
|
|
};
|
|
|
|
if (!allUsers) {
|
|
selector.$or = [{ members: user._id }, { assignees: user._id }];
|
|
}
|
|
|
|
const cards = Cards.find(selector, {
|
|
fields: {
|
|
_id: 1,
|
|
archived: 1,
|
|
boardId: 1,
|
|
swimlaneId: 1,
|
|
listId: 1,
|
|
title: 1,
|
|
type: 1,
|
|
sort: 1,
|
|
members: 1,
|
|
assignees: 1,
|
|
colors: 1,
|
|
dueAt: 1,
|
|
},
|
|
});
|
|
|
|
const boards = [];
|
|
const swimlanes = [];
|
|
const lists = [];
|
|
const users = [];
|
|
|
|
cards.forEach(card => {
|
|
if (card.boardId) boards.push(card.boardId);
|
|
if (card.swimlaneId) swimlanes.push(card.swimlaneId);
|
|
if (card.listId) lists.push(card.listId);
|
|
if (card.members) {
|
|
card.members.forEach(userId => {
|
|
users.push(userId);
|
|
});
|
|
}
|
|
if (card.assignees) {
|
|
card.assignees.forEach(userId => {
|
|
users.push(userId);
|
|
});
|
|
}
|
|
});
|
|
|
|
return [
|
|
cards,
|
|
Boards.find({ _id: { $in: boards } }),
|
|
Swimlanes.find({ _id: { $in: swimlanes } }),
|
|
Lists.find({ _id: { $in: lists } }),
|
|
Users.find({ _id: { $in: users } }),
|
|
];
|
|
});
|
|
|
|
Meteor.publish('globalSearch', function(queryParams) {
|
|
check(queryParams, Object);
|
|
|
|
// eslint-disable-next-line no-console
|
|
console.log('selector:', queryParams);
|
|
|
|
const user = Users.findOne(this.userId);
|
|
|
|
const archivedBoards = [];
|
|
Boards.find({ archived: true }).forEach(board => {
|
|
archivedBoards.push(board._id);
|
|
});
|
|
|
|
const archivedSwimlanes = [];
|
|
Swimlanes.find({ archived: true }).forEach(swimlane => {
|
|
archivedSwimlanes.push(swimlane._id);
|
|
});
|
|
|
|
const archivedLists = [];
|
|
Lists.find({ archived: true }).forEach(list => {
|
|
archivedLists.push(list._id);
|
|
});
|
|
|
|
const permiitedBoards = [];
|
|
let selector = {
|
|
archived: false,
|
|
};
|
|
// if user is not an admin allow her to see cards only from boards where
|
|
// she is a member
|
|
if (!user.isAdmin) {
|
|
selector.$or = [
|
|
{ permission: 'public' },
|
|
{ members: { $elemMatch: { userId: user._id, isActive: true } } },
|
|
];
|
|
}
|
|
if (queryParams.boards.length) {
|
|
selector.title = { $in: [] };
|
|
queryParams.boards.forEach(term => {
|
|
selector.title.$in.push(term);
|
|
});
|
|
}
|
|
Boards.find(selector).forEach(board => {
|
|
permiitedBoards.push(board._id);
|
|
});
|
|
|
|
const searchLists = [];
|
|
if (queryParams.lists.length) {
|
|
selector = {
|
|
archived: false,
|
|
title: { $in: [] },
|
|
};
|
|
queryParams.lists.forEach(term => {
|
|
selector.title.$in.push(term);
|
|
});
|
|
|
|
// eslint-disable-next-line no-console
|
|
console.log('search list selector:', selector);
|
|
Lists.find(selector).forEach(list => {
|
|
searchLists.push(list._id);
|
|
});
|
|
// eslint-disable-next-line no-console
|
|
console.log('search lists:', searchLists);
|
|
}
|
|
|
|
selector = {
|
|
archived: false,
|
|
boardId: { $nin: archivedBoards, $in: permiitedBoards },
|
|
swimlaneId: { $nin: archivedSwimlanes },
|
|
listId: { $nin: archivedLists },
|
|
};
|
|
|
|
if (searchLists.length) {
|
|
selector.listId.$in = searchLists;
|
|
}
|
|
|
|
const cards = Cards.find(selector, {
|
|
fields: {
|
|
_id: 1,
|
|
archived: 1,
|
|
boardId: 1,
|
|
swimlaneId: 1,
|
|
listId: 1,
|
|
title: 1,
|
|
type: 1,
|
|
sort: 1,
|
|
members: 1,
|
|
assignees: 1,
|
|
colors: 1,
|
|
dueAt: 1,
|
|
},
|
|
});
|
|
|
|
const boards = [];
|
|
const swimlanes = [];
|
|
const lists = [];
|
|
const users = [];
|
|
|
|
cards.forEach(card => {
|
|
if (card.boardId) boards.push(card.boardId);
|
|
if (card.swimlaneId) swimlanes.push(card.swimlaneId);
|
|
if (card.listId) lists.push(card.listId);
|
|
if (card.members) {
|
|
card.members.forEach(userId => {
|
|
users.push(userId);
|
|
});
|
|
}
|
|
if (card.assignees) {
|
|
card.assignees.forEach(userId => {
|
|
users.push(userId);
|
|
});
|
|
}
|
|
});
|
|
|
|
return [
|
|
cards,
|
|
Boards.find({ _id: { $in: boards } }),
|
|
Swimlanes.find({ _id: { $in: swimlanes } }),
|
|
Lists.find({ _id: { $in: lists } }),
|
|
Users.find({ _id: { $in: users } }),
|
|
];
|
|
});
|
|
|