Skip to content

Commit 07d0a3d

Browse files
committed
resolved conflicts
2 parents 63b4184 + 9736a10 commit 07d0a3d

15 files changed

+998
-348
lines changed

package.json

+10-9
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,20 @@
55
"main": "index.js",
66
"scripts": {
77
"build": "babel -d ./build ./src -s",
8-
"prod": "set NODE_ENV=production&& node build/index.js",
9-
"start": "set NODE_ENV=development&& babel-node src/index.js",
10-
"dev": "set DEBUG=web-app && set NODE_ENV=development&& nodemon src/index.js --exec babel-node",
11-
"test": "set NODE_ENV=test&& sequelize db:migrate:undo:all && sequelize db:migrate && sequelize db:seed:all && mocha --timeout 0 ./src/tests/*.js --require @babel/register --reporter spec --exec babel-node --exit",
12-
"generate-lcov": "nyc report --reporter=text-lcov >lcov.info",
13-
"coveralls-coverage": "coveralls < lcov.info",
148
"coverage": "nyc npm test && npm run generate-lcov && npm run coveralls-coverage",
159
"coveralls": "nyc --reporter=lcov --reporter=text-lcov npm test",
10+
"coveralls-coverage": "coveralls < lcov.info",
1611
"create:db": "set NODE_ENV=development&& sequelize db:create",
12+
"create:tables": "set NODE_ENV=development&& npm run migrate:db && npm run seed:db",
13+
"dev": "set DEBUG=web-app && set NODE_ENV=development&& nodemon src/index.js --exec babel-node",
1714
"drop:db": "set NODE_ENV=development&& sequelize db:drop",
18-
"undo:db": "sequelize db:migrate:undo:all",
19-
"create:tables": "set NODE_ENV=development&& sequelize db:migrate && sequelize db:seed:all"
15+
"generate-lcov": "nyc report --reporter=text-lcov >lcov.info",
16+
"migrate:db": "sequelize db:migrate",
17+
"prod": "set NODE_ENV=production&& node build/index.js",
18+
"seed:db": "sequelize db:seed:all",
19+
"start": "set NODE_ENV=development&& babel-node src/index.js",
20+
"test": "set NODE_ENV=test&& npm run undo:db && npm run migrate:db && npm run seed:db && mocha --timeout 0 ./src/tests/*.js --require @babel/register --reporter spec --exec babel-node --exit",
21+
"undo:db": "sequelize db:migrate:undo:all"
2022
},
2123
"author": "Andela Simulations Programme",
2224
"license": "MIT",
@@ -57,7 +59,6 @@
5759
"sequelize": "^5.15.2",
5860
"sequelize-cli": "^5.5.0",
5961
"socket.io": "^2.2.0",
60-
"socket.io-client": "^2.2.0",
6162
"underscore": "^1.9.1"
6263
},
6364
"devDependencies": {

src/controllers/travelControllers.js

+85-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,16 @@
11
import socketEmission from '../services/websocket';
2+
/* eslint-disable no-else-return */
23
import {
34
onewayTripService,
5+
createTripService,
46
showManagerPendingAppr,
57
showUsertravelsStatus,
68
approveTravel,
9+
mostTraveled,
10+
editOpenRequests,
11+
checkApprovalStatus
712
} from '../services/travelServices';
13+
814
import { findUserByEmail } from '../services/authServices';
915
import { successResponseWithData, errorResponse } from '../utils/response';
1016
import sendVerificationEmail from '../utils/email';
@@ -14,7 +20,7 @@ import statusCode from '../utils/statusCode';
1420

1521
const { emission } = socketEmission;
1622

17-
export const createOneWayTrip = async(req, res) => {
23+
const createOneWayTrip = async(req, res) => {
1824
try {
1925
const user = await findUserByEmail(req.userData.email);
2026
const { id, email, dept_id } = user.dataValues;
@@ -46,7 +52,31 @@ export const createOneWayTrip = async(req, res) => {
4652
}
4753
};
4854

49-
export const pendingManagerApproval = async(req, res) => {
55+
const createReturnTrip = async(req, res) => {
56+
try {
57+
const user = await findUserByEmail(req.userData.email);
58+
const { id, dept_id } = user.dataValues;
59+
60+
const travelRequestData = {
61+
user_id: id,
62+
dept_id,
63+
...req.body
64+
};
65+
66+
const createdReturnTripData = await createTripService(travelRequestData);
67+
68+
successResponseWithData(
69+
res,
70+
statusCode.created,
71+
message.returnTripCreated,
72+
createdReturnTripData
73+
);
74+
} catch (err) {
75+
errorResponse(res, err.statusCode || statusCode.serverError, err);
76+
}
77+
};
78+
79+
const pendingManagerApproval = async(req, res) => {
5080
const { role } = req.userData;
5181

5282
const { manager } = req.params;
@@ -73,7 +103,7 @@ export const pendingManagerApproval = async(req, res) => {
73103
}
74104
};
75105

76-
export const getUserTravelStatus = async(req, res) => {
106+
const getUserTravelStatus = async(req, res) => {
77107
const { role, id } = req.userData;
78108

79109
if (role === 'manager') {
@@ -92,7 +122,9 @@ export const getUserTravelStatus = async(req, res) => {
92122
}
93123
};
94124

95-
export const approveTravelRequest = async(req, res) => {
125+
const approveTravelRequest = async(req, res) => {
126+
const { role, id } = req.userData;
127+
96128
try {
97129
const updatedTravel = await approveTravel(req.params.travel_id);
98130

@@ -104,5 +136,54 @@ export const approveTravelRequest = async(req, res) => {
104136
);
105137
} catch (err) {
106138
errorResponse(res, statusCode.serverError, err);
139+
if (role === 'admin') {
140+
return errorResponse(res, statusCode.unauthorized, message.unauthorized);
141+
} else {
142+
try {
143+
const data = await showUsertravelsStatus(id);
144+
return successResponseWithData(res, statusCode.success, message.userApproval, data);
145+
} catch (error) {
146+
errorResponse(res, statusCode.serverError, error);
147+
}
148+
}
107149
}
108150
};
151+
152+
const userCanEditOpenRequest = async(req, res) => {
153+
const { travel_id } = req.params;
154+
155+
const userId = req.userData.id;
156+
157+
try {
158+
const result = await checkApprovalStatus(travel_id, userId);
159+
160+
if (result[0].approval_status !== 'pending') {
161+
errorResponse(res, statusCode.badRequest, message.requestNotOpen);
162+
}
163+
164+
const updatedRequest = await editOpenRequests(req.body, userId, travel_id);
165+
166+
successResponseWithData(res, statusCode.success, message.requestUpdated, updatedRequest[1][0]);
167+
} catch (err) {
168+
errorResponse(res, statusCode.serverError, err);
169+
}
170+
};
171+
172+
const mostTravelledDest = async(req, res) => {
173+
try {
174+
const travelled = await mostTraveled();
175+
successResponseWithData(res, statusCode.success, message.oneWayTripCreated, travelled);
176+
} catch (error) {
177+
errorResponse(res, statusCode.serverError, error);
178+
}
179+
};
180+
181+
export {
182+
createOneWayTrip,
183+
createReturnTrip,
184+
pendingManagerApproval,
185+
getUserTravelStatus,
186+
approveTravelRequest,
187+
userCanEditOpenRequest,
188+
mostTravelledDest
189+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
up: function(queryInterface, Sequelize) {
3+
return Promise.resolve();
4+
},
5+
down: function(queryInterface) {
6+
return Promise.resolve();
7+
}
8+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module.exports = {
2+
up: function(queryInterface, Sequelize) {
3+
return Promise.resolve();
4+
},
5+
down: function(queryInterface) {
6+
return Promise.resolve();
7+
}
8+
};

src/index.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import http from 'http';
1010
import socketIo from 'socket.io';
1111
import { fbStrategy, googleStrategy } from './config/passport';
1212
import message from './utils/messageUtils';
13-
import response from './utils/response';
13+
import { successResponse } from './utils/response';
1414
import statusCode from './utils/statusCode';
1515
import routes from './routes';
1616
import socketEmission from './services/websocket';
@@ -54,14 +54,14 @@ passport.deserializeUser((user, cb) => {
5454
// serve the api endpoints built in routes folder
5555
routes(prefix, app, io);
5656
// handles the api home route...
57-
app.all('/', (req, res) => response.successResponse(res, statusCode.success, message.defaultWelcome));
57+
app.all('/', (req, res) => successResponse(res, statusCode.success, message.defaultWelcome));
5858
// serve the api endpoints built in routes folder
5959
// app.use(routes);
6060
// app.use('/', router);
6161

6262

6363
app.get(`${prefix}/`, (req, res) => {
64-
response.successResponse(res, statusCode.success, message.welcome);
64+
successResponse(res, statusCode.success, message.welcome);
6565
});
6666

6767
const isProduction = process.env.NODE_ENV === 'production';

src/models/travel_request.js

+6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
/* eslint-disable import/no-dynamic-require */
22
module.exports = (sequelize, DataTypes) => {
33
const travel_request = sequelize.define('travel_requests', {
4+
id: {
5+
allowNull: false,
6+
autoIncrement: true,
7+
primaryKey: true,
8+
type: DataTypes.INTEGER
9+
},
410
user_id: DataTypes.INTEGER,
511
travel_type: {
612
type: DataTypes.ENUM,

src/routes/travelRoute.js

+35-2
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,25 @@ import { Router } from 'express';
22

33
import {
44
createOneWayTrip,
5-
pendingManagerApproval,
65
getUserTravelStatus,
76
approveTravelRequest,
7+
createReturnTrip,
8+
mostTravelledDest,
9+
userCanEditOpenRequest,
10+
pendingManagerApproval
811
} from '../controllers/travelControllers';
12+
913
import {
1014
validateTravelRequest,
15+
validateReturnTrip,
1116
validateResult,
1217
} from '../validation/travelValidation';
18+
19+
import {
20+
departureDateValidator,
21+
futureDateValidator
22+
} from '../validation/dateValidator';
23+
1324
import { verifyDeptManagerAndRequestStatus } from '../middlewares/travelsMiddleware';
1425
import { verifyRole } from '../middlewares/userMiddlewares';
1526
import { getToken, verifyToken } from '../middlewares/tokenMiddleware';
@@ -20,8 +31,20 @@ const route = Router();
2031
// handles the api home route...
2132
route.post('/travel/one_way_trip', getToken, verifyToken, validateTravelRequest, validateResult, createOneWayTrip);
2233

34+
// This is the route that will handle the request to create a valid return trip for a user....
35+
route.post(
36+
'/travel/return_trip',
37+
getToken,
38+
verifyToken,
39+
validateReturnTrip,
40+
validateResult,
41+
departureDateValidator,
42+
futureDateValidator,
43+
createReturnTrip
44+
);
45+
2346
// handles manager pending req approvals route
24-
route.get('/requests/pending/:manager', getToken, verifyToken, pendingManagerApproval);
47+
route.get('/travel/pending_request/:manager', getToken, verifyToken, pendingManagerApproval);
2548

2649
// user request status
2750
route.get('/user/status', getToken, verifyToken, getUserTravelStatus);
@@ -35,4 +58,14 @@ route.patch(
3558
approveTravelRequest,
3659
);
3760

61+
// handles editing of user's pending request
62+
route.put(
63+
'/travel/update_request/:travel_id',
64+
getToken,
65+
verifyToken,
66+
validateTravelRequest,
67+
validateResult,
68+
userCanEditOpenRequest
69+
);
70+
3871
export default route;

0 commit comments

Comments
 (0)