Centralize all mutations at the model level

This commit uses a new package that I need to document. It tries to
solve the long-standing debate in the Meteor community about
allow/deny rules versus methods (RPC).

This approach gives us both the centralized security rules of
allow/deny and the white-list of allowed mutations similarly to Meteor
methods. The idea to have static mutation descriptions is also
inspired by Facebook's Relay/GraphQL.

This will allow the development of a REST API using the high-level
methods instead of the MongoDB queries to do the mapping between the
HTTP requests and our collections.
This commit is contained in:
Maxime Quandalle 2015-09-08 20:19:42 +02:00
parent c04341f1ea
commit 45b662a1dd
26 changed files with 395 additions and 377 deletions

View file

@ -73,23 +73,13 @@ BlazeComponent.extendComponent({
$cards.sortable('cancel');
if (MultiSelection.isActive()) {
Cards.find(MultiSelection.getMongoSelector()).forEach((c, i) => {
Cards.update(c._id, {
$set: {
listId,
sort: sortIndex.base + i * sortIndex.increment,
},
});
Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => {
card.move(listId, sortIndex.base + i * sortIndex.increment);
});
} else {
const cardDomElement = ui.item.get(0);
const cardId = Blaze.getData(cardDomElement)._id;
Cards.update(cardId, {
$set: {
listId,
sort: sortIndex.base,
},
});
const card = Blaze.getData(cardDomElement);
card.move(listId, sortIndex.base);
}
boardComponent.setIsDragging(false);
},
@ -107,16 +97,15 @@ BlazeComponent.extendComponent({
accept: '.js-member,.js-label',
drop(event, ui) {
const cardId = Blaze.getData(this)._id;
let addToSet;
const card = Cards.findOne(cardId);
if (ui.draggable.hasClass('js-member')) {
const memberId = Blaze.getData(ui.draggable.get(0)).userId;
addToSet = { members: memberId };
card.assignMember(memberId);
} else {
const labelId = Blaze.getData(ui.draggable.get(0))._id;
addToSet = { labelIds: labelId };
card.addLabel(labelId);
}
Cards.update(cardId, { $addToSet: addToSet });
},
});
});

View file

@ -5,14 +5,10 @@ BlazeComponent.extendComponent({
editTitle(evt) {
evt.preventDefault();
const form = this.componentChildren('inlinedForm')[0];
const newTitle = form.getValue();
const newTitle = this.componentChildren('inlinedForm')[0].getValue();
const list = this.currentData();
if ($.trim(newTitle)) {
Lists.update(this.currentData()._id, {
$set: {
title: newTitle,
},
});
list.rename(newTitle);
}
},
@ -33,45 +29,30 @@ Template.listActionPopup.events({
},
'click .js-list-subscribe'() {},
'click .js-select-cards'() {
const cardIds = Cards.find(
{listId: this._id},
{fields: { _id: 1 }}
).map((card) => card._id);
const cardIds = this.allCards().map((card) => card._id);
MultiSelection.add(cardIds);
Popup.close();
},
'click .js-move-cards': Popup.open('listMoveCards'),
'click .js-archive-cards': Popup.afterConfirm('listArchiveCards', () => {
Cards.find({listId: this._id}).forEach((card) => {
Cards.update(card._id, {
$set: {
archived: true,
},
});
this.allCards().forEach((card) => {
card.archive();
});
Popup.close();
}),
'click .js-close-list'(evt) {
evt.preventDefault();
Lists.update(this._id, {
$set: {
archived: true,
},
});
this.archive();
Popup.close();
},
});
Template.listMoveCardsPopup.events({
'click .js-select-list'() {
const fromList = Template.parentData(2).data._id;
const fromList = Template.parentData(2).data;
const toList = this._id;
Cards.find({ listId: fromList }).forEach((card) => {
Cards.update(card._id, {
$set: {
listId: toList,
},
});
fromList.allCards().forEach((card) => {
card.move(toList);
});
Popup.close();
},