Checklists = new Mongo.Collection('checklists'); Checklists.attachSchema(new SimpleSchema({ cardId: { type: String, }, title: { type: String, defaultValue: 'Checklist', }, finishedAt: { type: Date, optional: true, }, createdAt: { type: Date, denyUpdate: false, autoValue() { // eslint-disable-line consistent-return if (this.isInsert) { return new Date(); } else { this.unset(); } }, }, sort: { type: Number, decimal: true, }, })); Checklists.helpers({ itemCount() { return ChecklistItems.find({ checklistId: this._id }).count(); }, items() { return ChecklistItems.find({ checklistId: this._id, }, { sort: ['sort'] }); }, finishedCount() { return ChecklistItems.find({ checklistId: this._id, isFinished: true, }).count(); }, isFinished() { return 0 !== this.itemCount() && this.itemCount() === this.finishedCount(); }, checkAllItems(){ const checkItems = ChecklistItems.find({checklistId: this._id}); checkItems.forEach(function(item){ item.check(); }); }, uncheckAllItems(){ const checkItems = ChecklistItems.find({checklistId: this._id}); checkItems.forEach(function(item){ item.uncheck(); }); }, itemIndex(itemId) { const items = self.findOne({_id : this._id}).items; return _.pluck(items, '_id').indexOf(itemId); }, }); Checklists.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'], }); Checklists.before.insert((userId, doc) => { doc.createdAt = new Date(); if (!doc.userId) { doc.userId = userId; } }); Checklists.mutations({ setTitle(title) { return { $set: { title } }; }, }); if (Meteor.isServer) { Meteor.startup(() => { Checklists._collection._ensureIndex({ cardId: 1, createdAt: 1 }); }); Checklists.after.insert((userId, doc) => { Activities.insert({ userId, activityType: 'addChecklist', cardId: doc.cardId, boardId: Cards.findOne(doc.cardId).boardId, checklistId: doc._id, checklistName:doc.title, }); }); Checklists.before.remove((userId, doc) => { const activities = Activities.find({ checklistId: doc._id }); if (activities) { activities.forEach((activity) => { Activities.remove(activity._id); }); } Activities.insert({ userId, activityType: 'removeChecklist', cardId: doc.cardId, boardId: Cards.findOne(doc.cardId).boardId, checklistId: doc._id, checklistName:doc.title, }); }); } if (Meteor.isServer) { JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) { Authentication.checkUserId( req.userId); const paramCardId = req.params.cardId; const checklists = Checklists.find({ cardId: paramCardId }).map(function (doc) { return { _id: doc._id, title: doc.title, }; }); if (checklists) { JsonRoutes.sendResult(res, { code: 200, data: checklists, }); } else { JsonRoutes.sendResult(res, { code: 500, }); } }); JsonRoutes.add('GET', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) { Authentication.checkUserId( req.userId); const paramChecklistId = req.params.checklistId; const paramCardId = req.params.cardId; const checklist = Checklists.findOne({ _id: paramChecklistId, cardId: paramCardId }); if (checklist) { checklist.items = ChecklistItems.find({checklistId: checklist._id}).map(function (doc) { return { _id: doc._id, title: doc.title, isFinished: doc.isFinished, }; }); JsonRoutes.sendResult(res, { code: 200, data: checklist, }); } else { JsonRoutes.sendResult(res, { code: 500, }); } }); JsonRoutes.add('POST', '/api/boards/:boardId/cards/:cardId/checklists', function (req, res) { Authentication.checkUserId( req.userId); const paramCardId = req.params.cardId; const id = Checklists.insert({ title: req.body.title, cardId: paramCardId, sort: 0, }); if (id) { req.body.items.forEach(function (item, idx) { ChecklistItems.insert({ cardId: paramCardId, checklistId: id, title: item.title, sort: idx, }); }); JsonRoutes.sendResult(res, { code: 200, data: { _id: id, }, }); } else { JsonRoutes.sendResult(res, { code: 400, }); } }); JsonRoutes.add('DELETE', '/api/boards/:boardId/cards/:cardId/checklists/:checklistId', function (req, res) { Authentication.checkUserId( req.userId); const paramChecklistId = req.params.checklistId; Checklists.remove({ _id: paramChecklistId }); JsonRoutes.sendResult(res, { code: 200, data: { _id: paramChecklistId, }, }); }); }