merge into develop

This commit is contained in:
Matteo Pagliazzi
2015-09-06 21:21:39 +02:00
123 changed files with 4005 additions and 2132 deletions
+64 -20
View File
@@ -8,6 +8,7 @@ function clone(a) {
var _ = require('lodash');
var nconf = require('nconf');
var async = require('async');
var Q = require('q');
var utils = require('./../utils');
var shared = require('../../../common');
var User = require('./../models/user').model;
@@ -504,6 +505,10 @@ api.leave = function(req, res, next) {
var user = res.locals.user;
var group = res.locals.group;
if (group.type === 'party' && user.party.quest && user.party.quest.key) {
return res.json(403, 'You cannot leave party during an active quest. Please leave the quest first');
}
// When removing the user from challenges, should we keep the tasks?
var keep = (/^remove-all/i).test(req.query.keep) ? 'remove-all' : 'keep-all';
@@ -522,17 +527,18 @@ var inviteByUUIDs = function(uuids, group, req, res, next){
return cb({code:400,err:'User with id "' + uuid + '" not found'});
if (group.type == 'guild') {
if (_.contains(group.members,uuid))
return cb({code:400,err: "User already in that group"});
return cb({code:400, err: "User already in that group"});
if (invite.invitations && invite.invitations.guilds && _.find(invite.invitations.guilds, {id:group._id}))
return cb({code:400,err:"User already invited to that group"});
return cb({code:400, err:"User already invited to that group"});
sendInvite();
} else if (group.type == 'party') {
if (invite.invitations && !_.isEmpty(invite.invitations.party))
return cb({code:400,err:"User already pending invitation."});
Group.find({type:'party', members:{$in:[uuid]}}, function(err, groups){
return cb({code: 400,err:"User already pending invitation."});
Group.find({type: 'party', members: {$in: [uuid]}}, function(err, groups){
if (err) return cb(err);
if (!_.isEmpty(groups))
return cb({code:400,err:"User already in a party."})
if (!_.isEmpty(groups) && groups[0].members.length > 1) {
return cb({code: 400, err: "User already in a party."})
}
sendInvite();
});
}
@@ -554,9 +560,6 @@ var inviteByUUIDs = function(uuids, group, req, res, next){
async.series([
function(cb){
invite.save(cb);
},
function(cb){
group.save(cb);
}
], function(err, results){
if (err) return cb(err);
@@ -590,14 +593,20 @@ var inviteByUUIDs = function(uuids, group, req, res, next){
}, function(err){
if(err) return err.code ? res.json(err.code, {err: err.err}) : next(err);
// TODO pass group from save above don't find it again, or you have to find it again in order to run populate?
populateQuery(group.type, Group.findById(group._id)).exec(function(err, populatedGroup){
if(err) return next(err);
async.series([
function(cb) {
group.save(cb);
},
function(cb) {
// TODO pass group from save above don't find it again, or you have to find it again in order to run populate?
populateQuery(group.type, Group.findById(group._id)).exec(function(err, populatedGroup){
if(err) return next(err);
res.json(populatedGroup);
});
res.json(populatedGroup);
});
}
]);
});
};
var inviteByEmails = function(invites, group, req, res, next){
@@ -618,6 +627,7 @@ var inviteByEmails = function(invites, group, req, res, next){
}
// yeah, it supports guild too but for backward compatibility we'll use partyInvite as query
var link = '?partyInvite='+ utils.encrypt(JSON.stringify({id:group._id, inviter:res.locals.user._id, name:group.name}));
var inviterVars = utils.getUserInfo(res.locals.user, ['name', 'email']);
@@ -648,9 +658,9 @@ var inviteByEmails = function(invites, group, req, res, next){
}, function(err){
if(err) return err.code ? res.json(err.code, {err: err.err}) : next(err);
if(usersAlreadyRegistered.length > 0){
if (usersAlreadyRegistered.length > 0){
inviteByUUIDs(usersAlreadyRegistered, group, req, res, next);
}else{
} else{
// Send only status code down the line because it doesn't need
// info on invited users since they are not yet registered
@@ -662,11 +672,11 @@ var inviteByEmails = function(invites, group, req, res, next){
api.invite = function(req, res, next){
var group = res.locals.group;
if(req.body.uuids){
if (req.body.uuids) {
inviteByUUIDs(req.body.uuids, group, req, res, next);
}else if(req.body.emails){
} else if (req.body.emails) {
inviteByEmails(req.body.emails, group, req, res, next)
}else{
} else {
return res.json(400,{err: "Can invite only by email or uuid"});
}
}
@@ -1026,3 +1036,37 @@ api.questAbort = function(req, res, next){
group = null;
})
}
api.questLeave = function(req, res, next) {
// Non-member leave quest while still in progress
var group = res.locals.group;
var user = res.locals.user;
if (!(group.quest && group.quest.active)) {
return res.json(404, { err: 'No active quest to leave' });
}
if (!(group.quest.members && group.quest.members[user._id])) {
return res.json(403, { err: 'You are not part of the quest' });
}
if (group.quest.leader === user._id) {
return res.json(403, { err: 'Quest leader cannot leave quest' });
}
delete group.quest.members[user._id];
group.markModified('quest.members');
user.party.quest = Group.cleanQuestProgress();
user.markModified('party.quest');
var groupSavePromise = Q.nbind(group.save, group);
var userSavePromise = Q.nbind(user.save, user);
Q.all([groupSavePromise(), userSavePromise()])
.done(function(values) {
return res.send(204);
}, function(error) {
return next(error);
});
}