ChecklistItems = new Mongo.Collection('checklistItems'); ChecklistItems.attachSchema(new SimpleSchema({ title: { type: String, }, sort: { type: Number, decimal: true, }, isFinished: { type: Boolean, defaultValue: false, }, checklistId: { type: String, }, cardId: { type: String, }, })); ChecklistItems.allow({ insert(userId, doc) { return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); }, update(userId, doc) { return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); }, remove(userId, doc) { return allowIsBoardMemberByCard(userId, Cards.findOne(doc.cardId)); }, fetch: ['userId', 'cardId'], }); ChecklistItems.before.insert((userId, doc) => { if (!doc.userId) { doc.userId = userId; } }); // Mutations ChecklistItems.mutations({ setTitle(title) { return { $set: { title } }; }, toggleItem() { return { $set: { isFinished: !this.isFinished } }; }, }); // Activities helper function itemCreation(userId, doc) { const card = Cards.findOne(doc.cardId); const boardId = card.boardId; Activities.insert({ userId, activityType: 'addChecklistItem', cardId: doc.cardId, boardId, checklistId: doc.checklistId, checklistItemId: doc._id, }); } function itemRemover(userId, doc) { Activities.remove({ checklistItemId: doc._id, }); } // Activities if (Meteor.isServer) { Meteor.startup(() => { ChecklistItems._collection._ensureIndex({ checklistId: 1 }); }); ChecklistItems.after.insert((userId, doc) => { itemCreation(userId, doc); }); ChecklistItems.after.remove((userId, doc) => { itemRemover(userId, doc); }); }