diff --git a/website/server/controllers/api-v2/user.js b/website/server/controllers/api-v2/user.js index fcac86e2e1..52e12d20c3 100644 --- a/website/server/controllers/api-v2/user.js +++ b/website/server/controllers/api-v2/user.js @@ -1,6 +1,7 @@ var url = require('url'); var ipn = require('paypal-ipn'); var _ = require('lodash'); +var validator = require('validator'); var nconf = require('nconf'); var asyncM = require('async'); var shared = require('../../../../common'); @@ -89,6 +90,7 @@ api.score = function(req, res, next) { direction = req.params.direction, user = res.locals.user, body = req.body || {}, + taskQuery = { userId: user._id }, task; // Send error responses for improper API call @@ -98,23 +100,33 @@ api.score = function(req, res, next) { return res.json(400, {err: ":direction must be 'up' or 'down'"}); } - Tasks.Task.findOne({ - _id: id, - userId: user._id - }, function(err, task){ + if (validator.isUUID(id)) { + taskQuery._id = id; + } else { + taskQuery._legacyId = id; + } + + Tasks.Task.findOne(taskQuery, function(err, task){ if(err) return next(err); // If exists already, score it if (!task) { // If it doesn't exist, this is likely a 3rd party up/down - create a new one, then score it // Defaults. Other defaults are handled in user.ops.addTask() - task = new Tasks.Task({ - _id: id, // TODO this might easily lead to conflicts as ids are now unique db-wide + var taskOptions = { type: body.type || 'habit', text: body.text || id, userId: user._id, notes: body.notes || "This task was created by a third-party service. Feel free to edit, it won't harm the connection to that service. Additionally, multiple services may piggy-back off this task." // TODO translate - }); + } + + if (validator.isUUID(id)) { + taskOptions._id = id; // TODO this might easily lead to conflicts as ids are now unique db-wide + } else { + taskOptions._legacyId = id; + } + + task = new Tasks.Task(taskOptions); user.tasksOrder[task.type + 's'].unshift(task._id); } @@ -206,12 +218,17 @@ api.getTasks = function(req, res, next) { * Get Task */ api.getTask = function(req, res, next) { - var user = res.locals.user; + var user = res.locals.user, + id = req.params.id, + taskQuery = { userId: user._id }; - Tasks.Task.findOne({ - userId: user._id, - _id: req.params.id, - }, function (err, task) { + if (validator.isUUID(id)) { + taskQuery._id = id; + } else { + taskQuery._legacyId = id; + } + + Tasks.Task.findOne(taskQuery, function (err, task) { if (err) return next(err); if (!task) return res.status(404).json({err: shared.i18n.t('messageTaskNotFound')}); res.status(200).json(task.toJSONV2()); @@ -830,13 +847,19 @@ api.deleteTask = function(req, res, next) { }; api.updateTask = function(req, res, next) { - var user = res.locals.user; + var user = res.locals.user, + taskQuery = { userId: user._id }, + id = req.params.id; + req.body = Tasks.Task.fromJSONV2(req.body); - Tasks.Task.findOne({ - _id: req.params.id, - userId: user._id - }, function(err, task) { + if (validator.isUUID(id)) { + taskQuery._id = id; + } else { + taskQuery._legacyId = id; + } + + Tasks.Task.findOne(taskQuery, function(err, task) { if(err) return next(err); if(!task) return res.status(404).json({err: 'Task not found.'}) diff --git a/website/server/models/task.js b/website/server/models/task.js index 27f356efa3..0116da2371 100644 --- a/website/server/models/task.js +++ b/website/server/models/task.js @@ -17,6 +17,7 @@ export let tasksTypes = ['habit', 'daily', 'todo', 'reward']; // Important // When something changes here remember to update the client side model at common/script/libs/taskDefaults export let TaskSchema = new Schema({ + _legacyId: String, // TODO Remove when v2 is deprecated type: {type: String, enum: tasksTypes, required: true, default: tasksTypes[0]}, text: {type: String, required: true}, notes: {type: String, default: ''}, @@ -119,7 +120,11 @@ TaskSchema.methods.scoreChallengeTask = async function scoreChallengeTask (delta // toJSON for API v2 TaskSchema.methods.toJSONV2 = function toJSONV2 () { let toJSON = this.toJSON(); - toJSON.id = toJSON._id; + if (toJSON._legacyId) { + toJSON.id = toJSON._legacyId; + } else { + toJSON.id = toJSON._id; + } let v3Tags = this.tags;