Skip to content

Commit

Permalink
Merge 8e28a9a into 97c54d9
Browse files Browse the repository at this point in the history
  • Loading branch information
olusoladavid committed Aug 2, 2018
2 parents 97c54d9 + 8e28a9a commit 3acd755
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 1 deletion.
36 changes: 36 additions & 0 deletions server/controllers/entryController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import { query } from '../db/index';
import validate from '../utils/validate';

class entryController {
/**
* Get all of a user's diary entries
* Requires auth token to be passed in authorization header
* @static
* @param {*} req - Client request object
* @param {*} res - Server response object
* @returns {object} token
* @memberof userController
*/
static getAllEntries(req, res) {
let { limit, page } = req.query;
// validate queries
limit = validate.isNumber(limit) ? limit : 20;
page = validate.isNumber(page) ? page : 0;
// get entries
query(
`SELECT entries.id, entries.title, entries.content, entries.created_on, entries.updated_on,
entries.is_favorite FROM entries INNER JOIN users ON entries.user_id=users.id WHERE users.email=$1
LIMIT $2 OFFSET $3`,
[req.authorizedUser.email, limit, page * limit],
(err, result) => {
if (err) {
console.log(err);
return res.status(500).json({ error: { message: 'An error occurred on the server' } });
}
return res.status(200).json({ entries: result.rows, meta: { limit, page } });
},
);
}
}

export default entryController;
5 changes: 5 additions & 0 deletions server/routes/index.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import express from 'express';
import userController from '../controllers/userController';
import entryController from '../controllers/entryController';
import verifyToken from '../utils/verifyToken';
import validate from '../utils/validate';

const router = express.Router();
Expand All @@ -17,4 +19,7 @@ router.post('/auth/login',
validate.loginInputs,
userController.loginUser);

/* GET all user entries */
router.get('/entries', verifyToken, entryController.getAllEntries);

export default router;
1 change: 1 addition & 0 deletions server/utils/validate.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ const validate = {
.isString()
.withMessage('Your password is invalid'),
],
isNumber: number => !Number.isNaN(Number(number)),
};

export default validate;
24 changes: 24 additions & 0 deletions server/utils/verifyToken.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import jwt from 'jsonwebtoken';
import dotenv from 'dotenv';

dotenv.config();

const verifyToken = (req, res, next) => {
try {
if (!req.headers.authorization) {
return res
.status(401)
.json({ error: { message: 'Authorization failed. Please provide a token' } });
}
const token = req.headers.authorization.split(' ')[1];
const authorizedUser = jwt.verify(token, process.env.SECRET_KEY);
req.authorizedUser = authorizedUser;
next();
} catch (error) {
res
.status(401)
.json({ error: { message: 'Authorization failed. Your token is invalid or expired' } });
}
};

export default verifyToken;
44 changes: 43 additions & 1 deletion test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ describe('/POST /auth/login', () => {
expect(res).to.have.status(200);
expect(res.body).to.be.an('object');
expect(res.body).to.have.property('token');
({ token } = res.body.token);
token = res.body.token;
done();
});
});
Expand Down Expand Up @@ -124,3 +124,45 @@ describe('/POST /auth/login', () => {
});
});
});

describe('/GET entries', () => {
it('should return all user entries when passed a valid token', (done) => {
chai
.request(app)
// Set the Authorization header
.get('/api/v1/entries')
.set('Authorization', makeAuthHeader(token))
.end((err, res) => {
expect(res).to.have.status(200);
expect(res.body).to.be.an('object');
expect(res.body).to.have.property('entries');
done();
});
});

it('should return 401 unauthorized error along with error object when passed an invalid or expired token', (done) => {
chai
.request(app)
.get('/api/v1/entries')
.set('Authorization', makeAuthHeader(sampleData.invalidToken))
.end((err, res) => {
expect(res).to.have.status(401);
expect(res.body).to.be.an('object');
expect(res.body).to.be.have.property('error');
done();
});
});

it('should return 401 unauthorized error along with error object when passed no token', (done) => {
chai
.request(app)
.get('/api/v1/entries')
.set('Authorization', makeAuthHeader(''))
.end((err, res) => {
expect(res).to.have.status(401);
expect(res.body).to.be.an('object');
expect(res.body).to.be.have.property('error');
done();
});
});
});

0 comments on commit 3acd755

Please sign in to comment.