add endpoint to add spells

This commit is contained in:
Andrew Zhu
2019-02-05 13:59:55 -08:00
parent 612575d0e6
commit fedda62c7c
3 changed files with 32 additions and 6 deletions

View File

@@ -71,8 +71,30 @@ Router.map(function () {
where: "server" where: "server"
}).post( }).post(
function () { function () {
ifPostOK(this, "addSpellsToCharacter", () => { ifPostOK(this, "addSpellsToList", () => {
const spells = this.request.body;
const charId = this.params._id;
const listId = this.params.listId;
let spellIds = [];
let error;
for (let spell of spells) {
spell.parent = {id: listId, collection: "SpellLists"};
spell.charId = charId;
let id = Spells.insert(spell, (err, _id) => {
if (err) {
error = err.message;
}
});
if (error)
break;
spellIds.push(id);
}
if (error) {
this.response.writeHead(400, "Failed to insert one or more spells");
this.response.end(JSON.stringify({err: error, inserted: spellIds}));
} else {
this.response.end(JSON.stringify(spellIds));
}
}); });
} }
); );
@@ -147,7 +169,7 @@ Router.map(function () {
var ifPostOK = function (router, endpoint, callback) { var ifPostOK = function (router, endpoint, callback) {
router.response.setHeader("Content-Type", "application/json"); router.response.setHeader("Content-Type", "application/json");
var header = router.request.headers; var header = router.request.headers;
var key = header && header['Authorization']; var key = header && header['authorization'];
ifKeyValid(key, router.response, endpoint, () => { ifKeyValid(key, router.response, endpoint, () => {
if (canEditCharacter(router.params._id, userIdFromKey(key))) { if (canEditCharacter(router.params._id, userIdFromKey(key))) {
callback(); callback();

View File

@@ -12,19 +12,20 @@ Meteor.methods({
CHARACTER_SUBSCHEMA_ALLOW = { CHARACTER_SUBSCHEMA_ALLOW = {
// the user must be logged in, and the user must be a writer of the character // the user must be logged in, and the user must be a writer of the character
// or we must be the server
insert: function(userId, doc) { insert: function(userId, doc) {
var char = Characters.findOne( var char = Characters.findOne(
doc.charId, doc.charId,
{fields: {owner: 1, writers: 1}} {fields: {owner: 1, writers: 1}}
); );
return (userId && char.owner === userId || _.contains(char.writers, userId)); return (userId && char.owner === userId || _.contains(char.writers, userId) || Meteor.isServer);
}, },
update: function(userId, doc, fields, modifier) { update: function(userId, doc, fields, modifier) {
var char = Characters.findOne( var char = Characters.findOne(
doc.charId, doc.charId,
{fields: {owner: 1, writers: 1}} {fields: {owner: 1, writers: 1}}
); );
return (userId && char.owner === userId || _.contains(char.writers, userId)); return (userId && char.owner === userId || _.contains(char.writers, userId) || Meteor.isServer);
}, },
remove: function(userId, doc) { remove: function(userId, doc) {
var char = Characters.findOne( var char = Characters.findOne(
@@ -32,7 +33,7 @@ CHARACTER_SUBSCHEMA_ALLOW = {
{fields: {owner: 1, writers: 1}} {fields: {owner: 1, writers: 1}}
); );
if (!char) return true; if (!char) return true;
return userId && char.owner === userId || _.contains(char.writers, userId); return userId && char.owner === userId || _.contains(char.writers, userId) || Meteor.isServer;
}, },
fetch: ["charId"], fetch: ["charId"],
}; };

View File

@@ -132,6 +132,9 @@ makeParent = function(collection, donatedKeys){
}; };
var checkPermission = function(userId, charId){ var checkPermission = function(userId, charId){
if (Meteor.isServer) { // we always trust server
return true;
}
var char = Characters.findOne(charId, {fields: {owner: 1, writers: 1}}); var char = Characters.findOne(charId, {fields: {owner: 1, writers: 1}});
if (!char) if (!char)
throw new Meteor.Error("Access Denied, no charId", throw new Meteor.Error("Access Denied, no charId",