diff --git a/src/server/api.coffee b/src/server/api.coffee index 09824e294c..3672799667 100644 --- a/src/server/api.coffee +++ b/src/server/api.coffee @@ -40,11 +40,11 @@ router.get '/status', (req, res) -> res.json status: 'up' router.get '/user', auth, (req, res) -> - self = req.userObj + user = req.userObj - delete self.apiToken + delete user.apiToken - res.json self + res.json user router.get '/task/:id', auth, (req, res) -> task = req.userObj.tasks[req.params.id] @@ -52,30 +52,41 @@ router.get '/task/:id', auth, (req, res) -> res.json 200, task -router.put '/task/:id', auth, (req, res) -> - task = req.userObj.tasks[req.params.id] - return res.json 400, err: "No task found." if !task || _.isEmpty(task) +validateTask = (req, res, next) -> + task = {} + # If we're updating, get the task from the user + if req.method is 'PUT' + task = req.userObj?.tasks[req.params.id] + return res.json 400, err: "No task found." if !task || _.isEmpty(task) - title = sanitize(req.body.title).xss() - text = sanitize(req.body.text).xss() + newTask = { type, text, notes, value, up, down, completed } = req.body - task.title = title if title - task.text = text if text - #task.type = req.body.type if /^(habit|todo|daily|reward)$/.test req.body.type + text = sanitize(text).xss() + notes = sanitize(notes).xss() + value = sanitize(value).toInt() - req.user.set "tasks.#{task.id}", task + switch type + when 'habit' + newTask.up = true unless typeof up is 'boolean' + newTask.down = true unless typeof down is 'boolean' + when 'daily', 'todo' + newTask.completed = false unless typeof completed is 'boolean' - res.json 200, task + _.extend task, newTask + req.task = task + next() -router.post '/user/task', auth, (req, res) -> - task = { title, text, type, value, note } = req.body - return res.json 400, err: "type must be habit, todo, daily, or reward" unless /^habit|todo|daily|reward$/.test type - return res.json 400, err: "must have a title" unless check(title).notEmpty() - return res.json 400, err: "must have text" unless check(text).notEmpty() +router.put '/task/:id', auth, validateTask, (req, res) -> + req.user.set "tasks.#{req.task.id}", req.task - self = req.userObj + res.json 200, req.task - value ||= 0 +router.post '/user/task', auth, validateTask, (req, res) -> + task = req.task + type = task.type + + unless /^habit|todo|daily|reward$/.test type + return res.json 400, err: 'type must be habit, todo, daily, or reward' model = req.getModel() model.ref '_user', req.user @@ -85,8 +96,8 @@ router.post '/user/task', auth, (req, res) -> res.json 201, task router.get '/user/tasks', auth, (req, res) -> - self = req.userObj - return res.json 400, NO_USER_FOUND if !self || _.isEmpty(self) + user = req.userObj + return res.json 400, NO_USER_FOUND if !user || _.isEmpty(user) model = req.getModel() model.ref '_user', req.user diff --git a/test/api.mocha.coffee b/test/api.mocha.coffee index 145542a525..229603a815 100644 --- a/test/api.mocha.coffee +++ b/test/api.mocha.coffee @@ -132,18 +132,61 @@ describe 'API', -> expect(user.get().tasks[res.body.id]).to.be.an('object') done() + it 'POST /api/v1/user/task (without type)', (done) -> + request.post("#{baseURL}/user/task") + .set('Accept', 'application/json') + .set('X-API-User', currentUser.id) + .set('X-API-Key', currentUser.apiToken) + .send({}) + .end (res) -> + query = model.query('users').withIdAndToken(currentUser.id, currentUser.apiToken) + query.fetch (err, user) -> + expect(res.body.err).to.be 'type must be habit, todo, daily, or reward' + expect(res.statusCode).to.be 400 + done() + + it 'POST /api/v1/user/task (only type)', (done) -> + request.post("#{baseURL}/user/task") + .set('Accept', 'application/json') + .set('X-API-User', currentUser.id) + .set('X-API-Key', currentUser.apiToken) + .send(type: 'habit') + .end (res) -> + query = model.query('users').withIdAndToken(currentUser.id, currentUser.apiToken) + query.fetch (err, user) -> + expect(res.body.err).to.be undefined + expect(res.statusCode).to.be 201 + expect(res.body.id).not.to.be.empty() + # Ensure that user owns the newly created object + expect(user.get().tasks[res.body.id]).to.be.an('object') + done() + it 'PUT /api/v1/task/:id', (done) -> tid = _.pluck(currentUser.tasks, 'id')[0] request.put("#{baseURL}/task/#{tid}") .set('Accept', 'application/json') .set('X-API-User', currentUser.id) .set('X-API-Key', currentUser.apiToken) - .send(title: 'a new title',text: 'hi') + .send(text: 'bye') + .end (res) -> + expect(res.body.err).to.be undefined + expect(res.statusCode).to.be 200 + currentUser.tasks[tid].text = 'bye' + expect(res.body).to.eql currentUser.tasks[tid] + done() + + it 'PUT /api/v1/task/:id (update notes)', (done) -> + tid = _.pluck(currentUser.tasks, 'id')[0] + request.put("#{baseURL}/task/#{tid}") + .set('Accept', 'application/json') + .set('X-API-User', currentUser.id) + .set('X-API-Key', currentUser.apiToken) + .send(text: 'hi',notes:'foobar matey') .end (res) -> expect(res.body.err).to.be undefined expect(res.statusCode).to.be 200 - currentUser.tasks[tid].title = 'a new title' currentUser.tasks[tid].text = 'hi' + currentUser.tasks[tid].notes = 'foobar matey' expect(res.body).to.eql currentUser.tasks[tid] done()