Skip to content

Commit c5d1f64

Browse files
committed
Refactors and prepares for testing
1 parent 5bb9f07 commit c5d1f64

File tree

6 files changed

+287
-212
lines changed

6 files changed

+287
-212
lines changed

auth.js

+9
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,13 @@ exports.isAuthenticated = function(req, res, next) {
9090
req.user = user;
9191
next();
9292
});
93+
}
94+
95+
exports.isSuperUser = function(req, res, next) {
96+
var key = req.body.superUserKey;
97+
if(key !== config.SUPER_USER_API_KEY) {
98+
console.log('An error occured. Not authorized.');
99+
return res.status(400).send({message: 'An error occured. Not authorized.'});
100+
}
101+
next();
93102
}

controllers/tasks.js

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
var Task = require('../models/Task');
2+
3+
module.exports = {
4+
5+
saveTask: function(task, callback) {
6+
var task = new Task(task);
7+
task.save(function(err, task) {
8+
if(err) console.log('mongodb error: ' + err);
9+
callback(err, task);
10+
});
11+
},
12+
13+
getTasks: function(callback) {
14+
Task.find(null, function(err, tasks) {
15+
if(err) console.log('mongodb error: ' + err);
16+
callback(err, tasks);
17+
});
18+
},
19+
20+
getTasksForUser: function(userId, callback) {
21+
Task.find({manager: userId}, function(err, tasks) {
22+
if(err) console.log('mongodb error: ' + err);
23+
callback(err, tasks);
24+
});
25+
},
26+
27+
updateTask: function(id, userId, isDone, callback) {
28+
Task.update({_id: id, manager: userId}, {isDone: isDone}, function(err, nbUpdated) {
29+
if(err) console.log('mongodb error: ' + err);
30+
callback(err, nbUpdated);
31+
});
32+
},
33+
34+
deleteTask: function(id, userId, callback) {
35+
Task.findOneAndRemove({_id: id, manager: userId}, function(err, task) {
36+
if(err) console.log('mongodb error: ' + err);
37+
callback(err, task);
38+
});
39+
},
40+
41+
deleteCompletedTasks: function(userId, callback) {
42+
Task.remove({manager: userId, isDone: true}, function(err) {
43+
if(err) console.log('mongodb error: ' + err);
44+
callback(err);
45+
});
46+
},
47+
48+
deleteTasks: function(callback) {
49+
Task.remove(function(err, nbRemoved) {
50+
if(err) console.log('mongodb error: ' + err);
51+
callback(err, nbRemoved);
52+
});
53+
}
54+
55+
};

controllers/users.js

+55
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
var User = require('../models/User');
2+
3+
module.exports = {
4+
5+
saveUser: function(user, callback) {
6+
var user = new User(user);
7+
user.save(function(err, user) {
8+
if(err) console.log('mongodb error: ' + err);
9+
callback(err, user);
10+
});
11+
},
12+
13+
getUsers: function(callback) {
14+
User.find(null, '+password', function(err, users) {
15+
if(err) console.log('mongodb error: ' + err);
16+
callback(err, users);
17+
});
18+
},
19+
20+
getUser: function(id, callback) {
21+
User.findById(id, '+password', function(err, user) {
22+
if(err) console.log('mongodb error: ' + err);
23+
callback(err, user);
24+
});
25+
},
26+
27+
getUserByEmail: function(email, callback) {
28+
User.findOne({email: email}, '+password', function(err, user) {
29+
if(err) console.log('mongodb error: ' + err);
30+
callback(err, user);
31+
});
32+
},
33+
34+
getUserByFacebookProfileId: function(id, callback) {
35+
User.findOne({'facebook.profileId': id}, function(err, user) {
36+
if(err) console.log('mongodb error: ' + err);
37+
callback(err, user);
38+
});
39+
},
40+
41+
getUserByTwitterProfileId: function(id, callback) {
42+
User.findOne({'twitter.profileId': id}, function(err, user) {
43+
if(err) console.log('mongodb error: ' + err);
44+
callback(err, user);
45+
});
46+
},
47+
48+
deleteUser: function(id, callback) {
49+
User.findOneAndRemove({_id: id}, function(err, user) {
50+
if(err) console.log('mongodb error: ' + err);
51+
callback(err, user);
52+
});
53+
}
54+
55+
};

models/User.js

+9-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ var BCRYPT_LOG_ROUNDS = 10;
44

55
var userSchema = mongoose.Schema({
66
email: {type: String, unique: true, lowercase: true, sparse: true},
7-
username: {type: String, unique: true, lowercase: true, spare: true},
7+
username: {type: String, unique: true, lowercase: true, sparse: true},
88
displayName: String,
99
password: {type: String, select: false},
1010
createdOn: {type: Date, default: Date.now()},
@@ -28,6 +28,14 @@ userSchema.methods.comparePassword = function(password, done) {
2828
});
2929
};
3030

31+
userSchema.pre('validate', function(next) {
32+
var isLocal = !this.facebook.profileId && !this.twitter.profileId;
33+
if(isLocal && !(this.email && this.username && this.password)) {
34+
next(Error('Email, username and password are required.'));
35+
}
36+
next();
37+
});
38+
3139
userSchema.pre('save', function(next) {
3240
genHash(next, this);
3341
});

routes/tasks.js

+51-55
Original file line numberDiff line numberDiff line change
@@ -1,99 +1,95 @@
1-
/* Tasks API */
21
var express = require('express');
32
var router = express.Router();
4-
var mongoose = require('mongoose');
5-
var Task = require('../models/Task');
63
var isAuthenticated = require('../auth').isAuthenticated;
7-
var config = require('../config');
4+
var isSuperUser = require('../auth').isSuperUser;
5+
var tasks = require('../controllers/tasks');
86

9-
router.get('/', isAuthenticated, function(req, res, next) {
10-
Task.find({manager: req.user._id}, function(err, tasks) {
11-
if(err) {
12-
console.log('mongodb error: ' + err);
13-
return res.send('An error occured when retrieving the tasks.');
14-
}
157

8+
/*
9+
* GET /tasks - Retrieves all the tasks for the signed in user
10+
*/
11+
router.get('/', isAuthenticated, function(req, res, next) {
12+
tasks.getTasksForUser(req.user._id, function(err, tasks) {
13+
if(err) return res.send('An error occured when retrieving the tasks.');
1614
res.setHeader('cache-control', 'no-cache');
1715
res.send(tasks);
1816
});
1917
});
2018

21-
router.post('/all', function(req, res, next) {
22-
var key = req.body.superUserKey;
23-
Task.find(null, function(err, tasks) {
24-
if(err || key !== config.SUPER_USER_API_KEY) {
25-
console.log('mongodb error: ' + err);
26-
return res.send('An error occured when retrieving all the tasks.');
27-
}
2819

20+
/*
21+
* POST /tasks/all - Retrieves all the tasks of all the users
22+
*/
23+
router.post('/all', isSuperUser, function(req, res, next) {
24+
tasks.getTasks(function(err, tasks) {
25+
if(err) return res.send('An error occured when retrieving the tasks.');
2926
res.setHeader('cache-control', 'no-cache');
3027
res.json(tasks);
3128
});
3229
});
3330

31+
32+
/*
33+
* POST /tasks/add - Saves the tasks for the user
34+
*/
3435
router.post('/add', isAuthenticated, function(req, res, next) {
3536
if(!req.body.label) {
3637
return res.status(401).send({message: 'Please name your task.'});
3738
}
3839

39-
var task = new Task({
40+
var task = {
4041
manager: req.user._id,
4142
label: req.body.label
42-
});
43-
44-
task.save(function(err, task) {
45-
if(err) {
46-
console.log('mongodb error: ' + err);
47-
return res.send('An error occured when adding a task.');
48-
}
43+
};
4944

45+
tasks.saveTask(task, function(err, task) {
46+
if(err) return res.send('An error occured when adding a task.');
5047
res.send('Task successfully added: ' + task.label);
5148
});
5249
});
5350

54-
router.put('/:id', isAuthenticated, function(req, res, next) {
55-
Task.update({_id: req.params.id}, {isDone: req.body.isDone},
56-
function(err, updated) {
57-
if(err) {
58-
console.log('mongodb error: ' + err);
59-
return res.send('An error occured while updating the task.');
60-
}
6151

62-
res.send(updated + ' task successfully updated.');
63-
});
52+
/*
53+
* PUT /tasks/:id - Updates the task status for the user
54+
*/
55+
router.put('/:id', isAuthenticated, function(req, res, next) {
56+
tasks.updateTask(req.params.id, req.user._id, req.body.isDone, function(err, nbUpdated) {
57+
if(err) return res.send('An error occured while updating the task.');
58+
res.send(nbUpdated + ' task updated.');
59+
});
6460
});
6561

66-
router.delete('/completed', isAuthenticated, function(req, res, next) {
67-
Task.remove({isDone: true}, function(err, tasks) {
68-
if(err) {
69-
console.log('mongodb error: ' + err);
70-
return res.send('An error occured when deleting a task.');
71-
}
7262

73-
res.send('Task successfully deleted: ' + tasks.label);
63+
/*
64+
* DELETE /tasks/completed - Deletes the completed tasks for the user
65+
*/
66+
router.delete('/completed', isAuthenticated, function(req, res, next) {
67+
tasks.deleteCompletedTasks(req.user._id, function(err) {
68+
if(err) return res.send('An error occured when deleting the completed tasks.');
69+
res.send('Completed tasks successfully deleted.');
7470
});
7571
});
7672

77-
router.delete('/:id', isAuthenticated, function(req, res) {
78-
Task.findOneAndRemove({_id: req.params.id}, function(err, tasks) {
79-
if(err) {
80-
console.log('mongodb error: ' + err);
81-
return res.send('An error occured when deleting a task.');
82-
}
8373

74+
/*
75+
* DELETE /tasks/:id - Deletes a specific task for the user
76+
*/
77+
router.delete('/:id', isAuthenticated, function(req, res) {
78+
tasks.deleteTask(req.params.id, req.user._id, function(err, task) {
79+
if(err) return res.send('An error occured when deleting a task.');
80+
if(!task) return res.send('Task not found.');
8481
res.send('Task successfully deleted: ' + tasks.label);
8582
});
8683
});
8784

88-
router.delete('/', function(req, res, next) {
89-
var key = req.body.superUserKey;
90-
Task.remove(function(err, nbRemoved) {
91-
if(err || key !== config.SUPER_USER_API_KEY) {
92-
console.log('mongodb error: ' + err);
93-
return res.send('An error occured.');
94-
}
9585

96-
res.send('All the tasks were successfully deleted.');
86+
/*
87+
* DELETE /tasks - Deletes all the tasks of all the users
88+
*/
89+
router.delete('/', isSuperUser, function(req, res, next) {
90+
tasks.deleteTasks(function(err, nbRemoved) {
91+
if(err) return res.send('An error occured when removing all the tasks.');
92+
res.send(nbRemoved + ' tasks were deleted.');
9793
});
9894
});
9995

0 commit comments

Comments
 (0)