Issues (82)

app/index.js (19 issues)

1
'use strict';
2
const config        = require('./config/config');
0 ignored issues
show
The constant config seems to be never used. Consider removing it.
Loading history...
3
const _             = require('lodash');
4
const app           = require('express')();
5
const bodyParser    = require('body-parser');
6
const cors          = require('cors');
7
const favicon       = require('serve-favicon');
8
9
10
const {ObjectID}        = require('mongodb');
11
const {mongoose}        = require('./db/mongoose');
12
const {Todo}            = require('./models/todo');
13
const {User}            = require('./models/user');
14
const {authenticate}    = require('./middlewares/authenticate');
15
16
17
// the body-parser middleware
18
app.use(bodyParser.json());
19
//app.use(bodyParser.urlencoded({extended : false}));
20
21
app.use(cors());
22
app.use(function(req, res, next){
23
    // Expose the custom headers so that browser can allow to use it
24
    res.setHeader('Access-Control-Expose-Headers','X-Powered-By, X-Auth');
25
    next();
26
});
27
28
// use the favicon
29
app.use(favicon(__dirname + '/_public/img/favicon.png'));
0 ignored issues
show
Consider using the path module for constructing paths since they are otherwise not cross-OS compatible.
Loading history...
30
31
32
app.get('/', (req, res) => {
33
    return res.sendFile(__dirname + '/_public/index.html');
0 ignored issues
show
Consider using the path module for constructing paths since they are otherwise not cross-OS compatible.
Loading history...
34
});
35
36
// create a GET /todos route
37
app.get('/todos', authenticate, (req, res) => {
38
    
39
    Todo.find({
40
        _creator : req.user._id
41
    }).then((data) => {
42
        return res.status(200).json({data});
43
    }, (err) => {
0 ignored issues
show
The parameter err is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
44
        return res.status(500).json({
45
            message : 'something broke'
46
        });
47
    });
48
});
49
50
// create a POST /todos route 
51
app.post('/todos', authenticate, (req, res) => {
52
    // log req body 
53
    //console.log('**Req Body => ', req.body);
54
    // make a todo and save it into the database
55
    let todo = new Todo({
56
        text : req.body.text,
57
        _creator : req.user._id
58
    });
59
60
    //console.log('**Todo =>', todo)
61
62
    todo.save().then((data) => {
63
        // send the todo as a response
64
        return res.status(201).send(data);
65
    }, (err) => {
66
        console.log('Error : ', err._message);
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
67
        // send the error as a response
68
        return res.status(500).json({
69
            message : 'something broke'
70
        });
71
    });
72
});
73
74
// get todos by id GET /todos/id
75
app.get('/todos/:id', authenticate,  (req, res) => {
76
    //get the todo id in todoID
77
    let todoID = req.params.id;
78
79
    // if the ID is valid not valid, send a message
80
    if (!ObjectID.isValid(todoID)) {
81
        //console.log('Invalid todo ID');
82
        //console.log('Error : 422 : Invalid Todo ID');
83
        return res.status(422).json({
84
            message : 'invalid id'
85
        });
86
    }
87
    // search for todo with the todo id and the creator
88
    // do not displa todo if the creator id is different
89
    Todo.findOne({
90
        _id : todoID,
91
        _creator : req.user._id
92
    }).then((data) => {
93
        if (!data) {
94
            //console.log('Error : 404 : Todo ID Not Found');            
95
            return res.status(404).json({
96
                message : 'todo not found'
97
            });
98
        }
99
        
100
        return res.status(200).json({
101
            todo : data
102
        });
103
104
    }).catch((err) => {
105
        console.log(err);
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
106
        //console.log('Error : 500 : Something broke');
107
        return res.status(500).json({
108
            message : 'todo not found'
109
        });
110
        //console.log('todoId not found');
111
    });
0 ignored issues
show
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
112
});
113
114
// create the delete todo by id route 
115
app.delete('/todos/:id', authenticate, (req, res) => {
116
    let todoID = req.params.id;
117
118
    if (!ObjectID.isValid(todoID)) {
119
        return res.status(400).send({
120
            message : 'InvalidID',
121
            status : 400
122
        });
123
    }
124
125
    Todo.findOneAndRemove({
126
        _id : todoID,
127
        _creator : req.user._id
128
    }).then((data) => {
129
        if(!data) {
130
            return res.status(404).send({
131
                message : 'Todo not found',
132
                status : 404
133
            });
134
        }
135
136
        res.status(200).send({
137
            todo : data,
138
            status : 200
139
        });
0 ignored issues
show
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
140
    }).catch((err)=> res.status(400).send({
0 ignored issues
show
The parameter err is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
141
        message : 'Error',
142
        status : 400
143
    }));
0 ignored issues
show
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
144
});
145
146
app.patch('/todos/:id', authenticate, (req, res) => {
147
    let todoID = req.params.id;
148
    let body = _.pick(req.body, ['text', 'completed']);
149
150
    if (!ObjectID.isValid(todoID)) {
151
        console.log('id rejected by isValid()');
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
152
        return res.status(400).send({
153
            message : 'InvalidID',
154
            status : 400
155
        });
156
    }
157
        // check if the completed field is boolena or not 
158
        // and it's value is  true
159
160
    if(_.isBoolean(body.completed) && body.completed) {
161
        // set the completed as true and the timestamp
162
        body.completed = true;
163
        body.completedAt = new Date().getTime();
164
    } else {
165
        body.completed = false;
166
        body.completedAt = null;
167
    }
168
169
    // update the database
170
    Todo.findOneAndUpdate({ 
171
        _id : todoID, 
172
        _creator : req.user._id 
173
    }, { $set : body}, {new : true}).then((data) => {
174
        if (!data) {
175
            return res.status(404).send({
176
                message : 'Todo not found',
177
                status : 404
178
            });
179
        }
180
181
        res.status(200).send({todo : data, status : 200});
0 ignored issues
show
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
182
183
    }).catch((e) => {
0 ignored issues
show
The parameter e is not used and could be removed.

This check looks for parameters in functions that are not used in the function body and are not followed by other parameters which are used inside the function.

Loading history...
184
        res.status(400).send({
185
            message : 'Failed to Update',
186
            status : 400
187
        });
188
    });
0 ignored issues
show
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
189
});
190
191
// user routes here 
192
// POST /users route
193
194
app.post('/users', (req, res) => {
195
    // pick the email name and password using lodash pick method
196
    let userData = _.pick(req.body, ['name', 'email', 'password']);
197
    
198
    // create new instance of the User model
199
    let user = new User(userData);
200
    // save the user data inside the DB
201
    user.save().then(() => {
202
        ///generate token
203
        return user.generateAuthToken();
204
205
    }).then((token) => {
206
        return res.header('x-auth', token).status(201).json({user});
207
        //console.log('User signup successful');
208
209
    }).catch((err) => {
210
        //console.log('error : ', err);        
211
        // send the error
212
        res.status(400).send({
213
            error : 'error occured'
214
        });
215
        return console.log(err._message);        
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
216
    });
217
});
218
219
// GET users/me route, using the token header
220
app.get('/users/me', authenticate, (req, res) => {
221
    res.status(200).json({
222
        user : req.user
223
    });
224
    return console.log(err);    
0 ignored issues
show
The variable err seems to be never declared. If this is a global, consider adding a /** global: err */ comment.

This checks looks for references to variables that have not been declared. This is most likey a typographical error or a variable has been renamed.

To learn more about declaring variables in Javascript, see the MDN.

Loading history...
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
225
});
226
227
// login route
228
229
app.post('/users/login', (req, res) => {
230
    let userData = _.pick(req.body, ['email', 'password']);
231
    // search for the user in using the email
232
    User.findByCredentials(userData.email, userData.password).then((user) => {
233
        return user.generateAuthToken().then((token) => {
234
            return res.header('x-auth', token).status(200).json({user});
235
        });
236
    }).catch((err) => {
237
        res.status(500).json({err});
238
        return console.log(err);        
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
239
    });
240
});
241
242
//logout route
243
244
app.delete('/users/logout', authenticate, (req, res) => {
245
    req.user.removeToken(req.token).then(() => {
246
        return res.status(204).json({message : 'logout successsful'});
247
    }, (err) => {
248
        res.status(500).json({message : 'something broke'});
249
        return console.log(err);        
0 ignored issues
show
console.log looks like debug code. Are you sure you do not want to remove it?
Loading history...
250
    });
251
});
252
253
254
255
module.exports = {app};
256