mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-07-28 22:05:38 +00:00
Separate out logic for tasks plus specs
This commit is contained in:
parent
26de70c17c
commit
c080ddc683
2 changed files with 78 additions and 24 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue