diff --git a/src/controllers/userController.js b/src/controllers/userController.js index 43b1168a..b53cb567 100644 --- a/src/controllers/userController.js +++ b/src/controllers/userController.js @@ -153,4 +153,10 @@ export default class UserController { const status = (user[1][0].dataValues[propertyToGet]) ? 'Activated' : 'Deactivated'; return responseUtil(res, 200, `${message} Notifcation ${status}`); } + + static async logoutUser(req, res) { + const { id } = req.user.payload; + await updateUser({ logoutTime: new Date() }, id); + return responseUtil(res, 200, strings.users.success.LOGOUT); + } } diff --git a/src/database/migrations/20191114065731-add-logoutTime-to-user.js b/src/database/migrations/20191114065731-add-logoutTime-to-user.js new file mode 100644 index 00000000..187e8754 --- /dev/null +++ b/src/database/migrations/20191114065731-add-logoutTime-to-user.js @@ -0,0 +1,14 @@ +'use strict'; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addColumn('users','logoutTime',{ + type: Sequelize.DATE, + allowNull: true + },'') + }, + + down: (queryInterface, Sequelize) => { + return queryInterface.removeColumn('users','logoutTime'); + } +}; diff --git a/src/database/models/users.js b/src/database/models/users.js index 7597c683..7d289b57 100644 --- a/src/database/models/users.js +++ b/src/database/models/users.js @@ -16,6 +16,7 @@ module.exports = (sequelize, Datatypes) => { currency: Datatypes.STRING, company: Datatypes.STRING, department: Datatypes.STRING, + logoutTime: Datatypes.DATE, isVerified: { type: Datatypes.BOOLEAN, defaultValue: false, diff --git a/src/database/seeders/20191002153158-usersTableSeeder.js b/src/database/seeders/20191002153158-usersTableSeeder.js index 4992d8e5..2e6cc42f 100644 --- a/src/database/seeders/20191002153158-usersTableSeeder.js +++ b/src/database/seeders/20191002153158-usersTableSeeder.js @@ -12,6 +12,7 @@ module.exports = { role: 6, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -34,6 +35,7 @@ module.exports = { updatedAt: new Date(), password: '$2b$10$vQp2ahUwAnRS.HHxNLK0pOQ/E41TRnxtlDJL.5vVRHsvL7DC9svNm', isVerified: false, + logoutTime: null, createdAt: new Date(), updatedAt: new Date(), }, @@ -46,6 +48,7 @@ module.exports = { role: 6, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -58,6 +61,7 @@ module.exports = { role: 5, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -71,6 +75,7 @@ module.exports = { role: 1, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -83,6 +88,7 @@ module.exports = { role: 6, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -95,6 +101,7 @@ module.exports = { role: 5, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -107,6 +114,7 @@ module.exports = { role: 4, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -119,6 +127,7 @@ module.exports = { role: 4, emailNotif: true, appNotif: true, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -131,6 +140,7 @@ module.exports = { appNotif: true, lineManager: 8, role: 2, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, @@ -143,6 +153,7 @@ module.exports = { appNotif: true, lineManager: 8, role: 5, + logoutTime: null, createdAt: new Date(), updatedAt: new Date() }, diff --git a/src/routes/api/users.js b/src/routes/api/users.js index 208faff2..9965fe1a 100755 --- a/src/routes/api/users.js +++ b/src/routes/api/users.js @@ -9,7 +9,9 @@ import confirmPassword from '../../middlewares/confirmPassword'; import user from '../../middlewares/users'; import wrongSwitch from '../../middlewares/wrongSwitch'; -const { signup, signIn, switchNotif } = UserController; +const { + signup, signIn, switchNotif, logoutUser +} = UserController; const { updateProfile, getProfile } = profile; const { validateProfile, validateLogin, validateSignup, validateEmail, validateResetpassword @@ -272,7 +274,7 @@ const router = express.Router(); * '401': * description: Please Login */ - +router.patch('/logout', validateToken, logoutUser); router.post('/register', validateSignup, verifyExist, confirmPassword, signup); router.get('/verify/:token', UserController.userVerify); router.post('/forgotpassword', validateEmail, UserController.Providelink); @@ -282,4 +284,5 @@ router.post('/login', validateLogin, signIn); router.get('/profile/:email', validateToken, user.compareData, getProfile); router.patch('/:switchParam', validateToken, wrongSwitch, switchNotif); + export default router; diff --git a/src/tests/RequestStats.spec.js b/src/tests/RequestStats.spec.js index 56a97165..dba94ad4 100644 --- a/src/tests/RequestStats.spec.js +++ b/src/tests/RequestStats.spec.js @@ -62,7 +62,6 @@ describe('stats Requests Tests', () => { .get('/api/v1/requests/stats?startDate=2019-12-07&endDate=2020-11-03') .set('Authorization', `Bearer ${userToken}`) .end((err, res) => { - res.should.have.property('status').eql(400); res.body.should.have.property('message').eql('Either startDate or endDate must not be greater than today\'s date'); done(); diff --git a/src/tests/index.spec.js b/src/tests/index.spec.js index 4d298599..ed878194 100644 --- a/src/tests/index.spec.js +++ b/src/tests/index.spec.js @@ -21,6 +21,7 @@ import accommodationSearchTests from './accommodationSearchTests.spec' import bookmarkTests from './bookmarkTests.spec'; import unitTests from './unitTests.spec'; import likeTests from './likeTests.spec'; +import logoutTests from './logoutTests.spec'; describe('Default Tests', defaultTests); describe('Edit Request Tests', editRequest); @@ -49,3 +50,4 @@ describe('Accommodation Search Tests', accommodationSearchTests); describe('Bookmarks Tests', bookmarkTests); describe('Unit Tests', unitTests); describe('Likes Tests', likeTests); +describe('Logout Tests', logoutTests); diff --git a/src/tests/logoutTests.spec.js b/src/tests/logoutTests.spec.js new file mode 100644 index 00000000..49030854 --- /dev/null +++ b/src/tests/logoutTests.spec.js @@ -0,0 +1,23 @@ +import chai from 'chai'; +import chaiHttp from 'chai-http'; +import { describe, it } from 'mocha'; +import app from '../index'; +import mockData from './mockData/mockData'; +import generateToken from '../utils/generateToken'; + +const token = generateToken(mockData.verifiedUser1); + +chai.should(); +chai.use(chaiHttp); + +describe('User Logout Test', () => { + it('check for successfull logout', (done) => { + chai.request(app) + .patch('/api/v1/users/logout') + .set('Authorization', `Bearer ${token}`) + .end((err, res) => { + res.should.have.status(200); + done(); + }); + }); +}); diff --git a/src/utils/stringsUtil.js b/src/utils/stringsUtil.js index 811cc473..61255502 100644 --- a/src/utils/stringsUtil.js +++ b/src/utils/stringsUtil.js @@ -10,7 +10,8 @@ const strings = { SUCCESS_UPDATE: 'User Updated', SUCCESSFUL_LOGIN: 'User logged in successfully!', SUCCESSFUL_ASSIGN: 'you have assigned the role to this user', - ROLE_ADDED: 'role added successfully' + ROLE_ADDED: 'role added successfully', + LOGOUT: 'You have been logged out successfully!' }, error: { BAD_SIGNUP_REQUEST: 'Input Error please check error!',