v3 adapt v2: misc fixes

This commit is contained in:
Matteo Pagliazzi
2016-04-12 12:59:30 +02:00
parent fa32dabc92
commit 40c9366a47
6 changed files with 40 additions and 24 deletions

View File

@@ -132,6 +132,7 @@ api.registerUser = function(req, res, next) {
analytics.track('register', analyticsData) analytics.track('register', analyticsData)
user.save(function(err, savedUser){ user.save(function(err, savedUser){
if (err) return cb(err);
// Clean previous email preferences // Clean previous email preferences
// TODO when emails added to EmailUnsubcription they should use lowercase version // TODO when emails added to EmailUnsubcription they should use lowercase version
EmailUnsubscription.remove({email: savedUser.auth.local.email}, function(){ EmailUnsubscription.remove({email: savedUser.auth.local.email}, function(){

View File

@@ -9,6 +9,7 @@ import {
} from '../../models/user'; } from '../../models/user';
import { import {
model as Group, model as Group,
basicFields as basicGroupFields,
} from '../../models/group'; } from '../../models/group';
import { import {
model as Challenge, model as Challenge,
@@ -27,6 +28,8 @@ import v3MembersController from '../api-v3/members';
------------------------------------------------------------------------ ------------------------------------------------------------------------
*/ */
var nameFields = 'profile.name';
api.list = async function(req, res, next) { api.list = async function(req, res, next) {
try { try {
var user = res.locals.user; var user = res.locals.user;
@@ -195,7 +198,7 @@ api.create = async function(req, res, next){
chalTasks = chalTasks.map(function(task) { chalTasks = chalTasks.map(function(task) {
var newTask = new Tasks[task.type](Tasks.Task.sanitizeCreate(task)); var newTask = new Tasks[task.type](Tasks.Task.sanitizeCreate(task));
newTask.challenge.id = chal._id; newTask.challenge.id = challenge._id;
return newTask.save(); return newTask.save();
}); });
@@ -251,9 +254,7 @@ api.update = function(req, res, next){
}, },
tasks: function(cb1) { tasks: function(cb1) {
// Convert to map of {id: task} so we can easily match them // Convert to map of {id: task} so we can easily match them
var _beforeClonedTasks = _.cloneDeep(_before.tasks.map(function(t) { var _beforeClonedTasks = _before.tasks;
return t.toObject();
}));
updatedTasks = _.object(_.pluck(_beforeClonedTasks, '_id'), _beforeClonedTasks); updatedTasks = _.object(_.pluck(_beforeClonedTasks, '_id'), _beforeClonedTasks);
var newTasks = req.body.habits.concat(req.body.dailys) var newTasks = req.body.habits.concat(req.body.dailys)
.concat(req.body.todos).concat(req.body.rewards); .concat(req.body.todos).concat(req.body.rewards);
@@ -261,11 +262,11 @@ api.update = function(req, res, next){
var newTasksObj = _.object(_.pluck(newTasks, '_id'), newTasks); var newTasksObj = _.object(_.pluck(newTasks, '_id'), newTasks);
async.forEachOf(newTasksObj, function(newTask, taskId, cb2){ async.forEachOf(newTasksObj, function(newTask, taskId, cb2){
// some properties can't be changed // some properties can't be changed
Tasks.Task.sanitize(newTask); newTask = Tasks.Task.sanitize(newTask);
// TODO we have to convert task to an object because otherwise things don't get merged correctly. Bad for performances? // TODO we have to convert task to an object because otherwise things don't get merged correctly. Bad for performances?
// TODO regarding comment above, make sure other models with nested fields are using this trick too // TODO regarding comment above, make sure other models with nested fields are using this trick too
_.assign(updatedTasks[taskId], common.ops.updateTask(task.toObject(), {body: newTask})); _.assign(updatedTasks[taskId], shared.ops.updateTask(updatedTasks[taskId].toObject(), {body: newTask}));
challenge.updateTask(updatedTasks[taskId]); _before.chal.updateTask(updatedTasks[taskId]).then(cb2).catch(cb2);
}, cb1); }, cb1);
} }
}, cb); }, cb);
@@ -313,8 +314,8 @@ api.selectWinner = async function(req, res, next) {
if (!req.query.uid) return res.status(401).json({err: 'Must select a winner'}); if (!req.query.uid) return res.status(401).json({err: 'Must select a winner'});
let challenge = await Challenge.findOne({_id: req.params.cid}).exec(); let challenge = await Challenge.findOne({_id: req.params.cid}).exec();
if (!challenge) return next('Challenge ' + cid + ' not found'); if (!challenge) return next('Challenge ' + req.params.cid + ' not found');
if (!challenge.canModify(user)) return next(shared.i18n.t('noPermissionCloseChallenge')); if (!challenge.canModify(res.locals.user)) return next(shared.i18n.t('noPermissionCloseChallenge'));
let winner = await User.findOne({_id: req.params.uid}).exec(); let winner = await User.findOne({_id: req.params.uid}).exec();
if (!winner || winner.challenges.indexOf(challenge._id) === -1) return next('Winner ' + req.query.uid + ' not found.'); if (!winner || winner.challenges.indexOf(challenge._id) === -1) return next('Winner ' + req.query.uid + ' not found.');
@@ -386,29 +387,32 @@ api.leave = async function(req, res, next){
} }
} }
import { removeFromArray } from '../../libs/api-v3/collectionManipulators';
api.unlink = async function(req, res, next) { api.unlink = async function(req, res, next) {
try { try {
var user = res.locals.user; var user = res.locals.user;
var tid = req.params.id; var tid = req.params.id;
var cid = user.tasks[tid].challenge.id; var cid;
if (!req.query.keep) if (!req.query.keep)
return res.status(400).json({err: 'Provide unlink method as ?keep=keep-all (keep, keep-all, remove, remove-all)'}); return res.status(400).json({err: 'Provide unlink method as ?keep=keep-all (keep, keep-all, remove, remove-all)'});
let keep = req.query.keep; let keep = req.query.keep;
let task = await Tasks.Task.findOne({ let task = await Tasks.Task.findOne({
_id: taskId, _id: tid,
userId: user._id, userId: user._id,
}).exec(); }).exec();
if (!task) return next(shared.i18n.t('taskNotFound')); if (!task) return next(shared.i18n.t('taskNotFound'));
if (!task.challenge.id) return next(shared.i18n.t('cantOnlyUnlinkChalTask')); if (!task.challenge.id) return next(shared.i18n.t('cantOnlyUnlinkChalTask'));
cid = task.challenge.id;
if (keep === 'keep') { if (keep === 'keep') {
task.challenge = {}; task.challenge = {};
await task.save(); await task.save();
} else { // remove } else { // remove
if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if if (task.type !== 'todo' || !task.completed) { // eslint-disable-line no-lonely-if
removeFromArray(user.tasksOrder[`${task.type}s`], taskId); removeFromArray(user.tasksOrder[`${task.type}s`], tid);
await Q.all([user.save(), task.remove()]); await Q.all([user.save(), task.remove()]);
} else { } else {
await task.remove(); await task.remove();

View File

@@ -838,7 +838,7 @@ api.removeMember = function(req, res, next){
// Sending an empty 204 because Group.update doesn't return the group // Sending an empty 204 because Group.update doesn't return the group
// see http://mongoosejs.com/docs/api.html#model_Model.update // see http://mongoosejs.com/docs/api.html#model_Model.update
sendMessage(invited); sendMessage(removedUser);
group = uuid = null; group = uuid = null;
return res.sendStatus(204); return res.sendStatus(204);
}); });
@@ -973,19 +973,23 @@ api.questAccept = function(req, res, next) {
if (group.quest.key) return res.status(400).json({err: 'Your party is already on a quest. Try again when the current quest has ended.'}); if (group.quest.key) return res.status(400).json({err: 'Your party is already on a quest. Try again when the current quest has ended.'});
if (!user.items.quests[key]) return res.status(400).json({err: "You don't own that quest scroll"}); if (!user.items.quests[key]) return res.status(400).json({err: "You don't own that quest scroll"});
let members;
User.find({ User.find({
'party._id': group._id, 'party._id': group._id,
_id: {$ne: user._id}, _id: {$ne: user._id},
}).select('auth.facebook auth.local preferences.emailNotifications profile.name pushDevices') }).select('auth.facebook auth.local preferences.emailNotifications profile.name pushDevices')
.exec().then(members => { .exec().then(membersF => {
members = membersF;
group.markModified('quest'); group.markModified('quest');
group.quest.key = questKey; group.quest.key = key;
group.quest.leader = user._id; group.quest.leader = user._id;
group.quest.members = {}; group.quest.members = {};
group.quest.members[user._id] = true; group.quest.members[user._id] = true;
user.party.quest.RSVPNeeded = false; user.party.quest.RSVPNeeded = false;
user.party.quest.key = questKey; user.party.quest.key = key;
return User.update({ return User.update({
'party._id': group._id, 'party._id': group._id,
@@ -993,7 +997,7 @@ api.questAccept = function(req, res, next) {
}, { }, {
$set: { $set: {
'party.quest.RSVPNeeded': true, 'party.quest.RSVPNeeded': true,
'party.quest.key': questKey, 'party.quest.key': key,
}, },
}, {multi: true}).exec(); }, {multi: true}).exec();
}).then(() => { }).then(() => {
@@ -1117,7 +1121,7 @@ api.questCancel = function(req, res, next){
Q.all([ Q.all([
group.save(), group.save(),
User.update( User.update(
{'party._id': groupId}, {'party._id': group._id},
{$set: {'party.quest': Group.cleanQuestProgress()}}, {$set: {'party.quest': Group.cleanQuestProgress()}},
{multi: true} {multi: true}
), ),

View File

@@ -7,6 +7,9 @@ var shared = require('../../../../common');
import { import {
model as User, model as User,
} from '../../models/user'; } from '../../models/user';
import {
NotFound,
} from '../../libs/api-v3/errors';
import { model as Tag } from '../../models/tag'; import { model as Tag } from '../../models/tag';
import * as Tasks from '../../models/task'; import * as Tasks from '../../models/task';
import Q from 'q'; import Q from 'q';
@@ -32,6 +35,8 @@ var api = module.exports;
var firebase = require('../../libs/api-v2/firebase'); var firebase = require('../../libs/api-v2/firebase');
var webhook = require('../../libs/api-v2/webhook'); var webhook = require('../../libs/api-v2/webhook');
const partyMembersFields = 'profile.name stats achievements items.special';
// api.purchase // Shared.ops // api.purchase // Shared.ops
api.getContent = function(req, res, next) { api.getContent = function(req, res, next) {
@@ -610,8 +615,8 @@ api.cast = async function(req, res, next) {
let spellId = req.params.spellId; let spellId = req.params.spellId;
let targetId = req.query.targetId; let targetId = req.query.targetId;
let klass = common.content.spells.special[spellId] ? 'special' : user.stats.class; let klass = shared.content.spells.special[spellId] ? 'special' : user.stats.class;
let spell = common.content.spells[klass][spellId]; let spell = shared.content.spells[klass][spellId];
if (!spell) return res.status(404).json({err: 'Spell "' + req.params.spell + '" not found.'}); if (!spell) return res.status(404).json({err: 'Spell "' + req.params.spell + '" not found.'});
if (spell.mana > user.stats.mp) return res.status(400).json({err: 'Not enough mana to cast spell'}); if (spell.mana > user.stats.mp) return res.status(400).json({err: 'Not enough mana to cast spell'});
@@ -893,13 +898,13 @@ _.each(shared.ops, function(op,k){
// If we want to send something other than 500, pass err as {code: 200, message: "Not enough GP"} // If we want to send something other than 500, pass err as {code: 200, message: "Not enough GP"}
res.locals.user.save(function(err){ res.locals.user.save(function(err){
if (err) return next(err); if (err) return next(err);
if (response === user) { // add tasks if (opResponse === res.locals.user) { // add tasks
user.getTransformedData(function (err, transformedUser) { res.locals.user.getTransformedData(function (err, transformedUser) {
if (err) return next(err); if (err) return next(err);
res.status(200).json(transformedUser); res.status(200).json(transformedUser);
}); });
} else { } else {
res.status(200).json(response); res.status(200).json(opResponse);
} }
}); });
} }

View File

@@ -26,7 +26,7 @@ let env = {
mods, mods,
Content: shared.content, Content: shared.content,
siteVersion: forceRefresh.siteVersion, siteVersion: forceRefresh.siteVersion,
availableLanguages: i18n.available, availableLanguages: i18n.availableLanguages,
AMAZON_PAYMENTS: { AMAZON_PAYMENTS: {
SELLER_ID: nconf.get('AMAZON_PAYMENTS:SELLER_ID'), SELLER_ID: nconf.get('AMAZON_PAYMENTS:SELLER_ID'),
CLIENT_ID: nconf.get('AMAZON_PAYMENTS:CLIENT_ID'), CLIENT_ID: nconf.get('AMAZON_PAYMENTS:CLIENT_ID'),

View File

@@ -753,6 +753,8 @@ schema.methods.getTasks = function getUserTasks () {
// Given user and an array of tasks, return an API compatible user + tasks obj // Given user and an array of tasks, return an API compatible user + tasks obj
schema.methods.addTasksToUser = function addTasksToUser (tasks) { schema.methods.addTasksToUser = function addTasksToUser (tasks) {
let obj = this.toJSON(); let obj = this.toJSON();
obj.id = obj._id;
obj.filters = {}; obj.filters = {};
obj.tags = obj.tags.map(tag => { obj.tags = obj.tags.map(tag => {