Skip to content

Commit

Permalink
feat(avail request): approve pending requests
Browse files Browse the repository at this point in the history
* PATCH /trips/approve

[Starts #167891588]
  • Loading branch information
meetKazuki committed Sep 9, 2019
1 parent b686fa0 commit 3a80d44
Show file tree
Hide file tree
Showing 7 changed files with 375 additions and 6 deletions.
93 changes: 93 additions & 0 deletions src/controllers/Trip.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,99 @@ class TripController {
}
}

/**
* Get pending requests
* Route: GET: /trips
* @param {object} req - HTTP Request object
* @param {object} res - HTTP Response object
* @return {res} res - HTTP Response object
* @memberof TripsController
*/
static async getPendingRequests(req, res) {
const { payload: { companyId } } = req.payload;
try {
const pendingRequests = await Trip.findAll({
where: { status: 'pending' },
include: [{
model: User,
as: 'user',
attributes: {
exclude: [
'id',
'firstName',
'lastName',
'dob',
'gender',
'email',
'password',
'role',
'status',
'companyId',
'favorites',
'createdAt',
'updatedAt'
]
},
where: { companyId }
}],
});
if (!pendingRequests.length) {
const response = new Response(
false, 404, 'No pending requests'
);
return res.status(response.code).json(response);
}

const response = new Response(
true, 200, 'Requests retrieved', pendingRequests
);
return res.status(response.code).json(response);
} catch (error) {
const response = new Response(
false, 500, 'Server error, Please try again later'
);
return res.status(response.code).json(response);
}
}

/**
* Approve pending requests
* Route: PATCH: /trips
* @param {object} req - HTTP Request object
* @param {object} res - HTTP Response object
* @return {res} res - HTTP Response object
* @memberof TripsController
*/
static async approveRequest(req, res) {
const { tripId } = req.body;
try {
const pendingRequest = await Trip.findOne({
where: { id: tripId, status: 'pending' },
});
if (!pendingRequest) {
const response = new Response(
false, 404, 'No pending request/request has already been approved'
);
return res.status(response.code).json(response);
}

const requestApproved = await pendingRequest.update({
status: 'approved' || pendingRequest.status
}, { hooks: false });

const response = new Response(
true,
200,
'Request approved successfully',
requestApproved
);
return res.status(response.code).json(response);
} catch (error) {
const response = new Response(false, 500, error.message);
return res.status(response.code).json(response);
}
}

/**
* @description - this method update the status of a travel request
* @param {object} req - the request sent to the router
Expand Down
26 changes: 25 additions & 1 deletion src/database/seeders/20190821112700-users.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,18 @@ module.exports = {
status: 'active',
role: 'super admin'
},
{
id: '91542e6f-94bc-4e80-a667-586fb3752f26',
companyId: 'a6e35eb9-8c59-5c7d-b8d4-ae724aa7fb62',
firstName: 'Emperor',
lastName: 'Ghadaffi',
email: 'ghaddafi@gmail.com',
password: hashHelper.hashPassword('password2019'),
gender: 'male',
dob: '2012-09-10',
status: 'active',
role: 'manager'
},
{
id: '91542e6f-94bc-4e80-a667-586fb3752f65',
companyId: 'a6e35eb9-8c59-4c7d-b8d4-ae724aa7fb61',
Expand All @@ -85,7 +97,19 @@ module.exports = {
dob: '2012-09-10',
status: 'unverified',
role: 'staff'
}
},
{
id: 'ffe25dbe-29ea-4759-8464-ed116f6739dd',
companyId: 'a6e35eb9-8c59-4c7d-b8d4-ae724aa7fb61',
firstName: 'Robert',
lastName: 'Mugabe',
email: 'thaRealMugabe@gmail.com',
password: hashHelper.hashPassword('password2019'),
gender: 'male',
dob: '2012-09-12',
status: 'active',
role: 'manager'
},
]),
down: queryInterface => queryInterface.bulkDelete('Users', null, {})
};
12 changes: 11 additions & 1 deletion src/database/seeders/20190829125546-create-trips.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,16 @@ module.exports = {
reason: 'for holiday',
status: 'pending'
},
{
id: 'ffe25dbe-29ea-4759-8468-ed116f6739df',
type: 'multiple',
startBranchId: 'ffe35dbe-29ea-4759-8461-ed116f6739dd',
userId: '91542e6f-94bc-4e80-a667-586fb0752f23',
tripDate: '2019-02-17',
returnDate: '2019-02-23',
reason: 'for holiday',
status: 'pending'
},
{
id: 'ffe25dbe-29ea-4759-8462-ed116f6739df',
type: 'return',
Expand Down Expand Up @@ -38,7 +48,7 @@ module.exports = {
tripDate: '2019-10-01',
returnDate: null,
reason: 'to meet with clients',
status: 'approved'
status: 'pending'
}
]),
down: queryInterface => queryInterface.bulkDelete('Trips', null, {})
Expand Down
19 changes: 18 additions & 1 deletion src/routes/trip.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,21 @@ import Token from '../helpers/Token';
import validator from '../middlewares/validator';
import permit from '../middlewares/permission';
import verify from '../middlewares/AuthMiddlewares';
import { tripRequestSchema, tripRequestStatusSchema } from '../validation/tripSchema';
import {
tripRequestSchema, approvalSchema, tripRequestStatusSchema
} from '../validation/tripSchema';

const tripRoutes = Router();

tripRoutes.get('/user', Token.verifyToken, TripController.getUserTrips);

tripRoutes.get(
'/',
Token.verifyToken,
permit('manager'),
TripController.getPendingRequests
);

tripRoutes.post(
'/',
Token.verifyToken,
Expand All @@ -18,6 +27,14 @@ tripRoutes.post(
TripController.createTripRequest
);

tripRoutes.patch(
'/approve',
Token.verifyToken,
permit('manager'),
validator(approvalSchema),
TripController.approveRequest
);

tripRoutes.patch(
'/:id',
Token.verifyToken,
Expand Down
12 changes: 11 additions & 1 deletion src/validation/tripSchema.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,16 @@ const tripRequestSchema = [
}),
];

const approvalSchema = [
check('tripId')
.exists()
.withMessage('Trip ID is required')
.trim()
.isUUID(4)
.withMessage('Invalid trip ID')
];


const tripRequestStatusSchema = [
check('status')
.exists()
Expand All @@ -102,4 +112,4 @@ const tripRequestStatusSchema = [
.withMessage('Invalid trip status')
];

export { tripRequestStatusSchema, tripRequestSchema };
export { tripRequestStatusSchema, approvalSchema, tripRequestSchema };
23 changes: 22 additions & 1 deletion test/mockData/mockAuth.js
Original file line number Diff line number Diff line change
Expand Up @@ -360,12 +360,30 @@ const credentialsForServerError2 = {
companyCode: '4RHJHJJKSK'
};

const manager = {
email: 'thaRealMugabe@gmail.com',
password: 'password2019',
code: '4RHJHJJKSK'
};

const unverifiedLogin = {
email: 'john.doe@gmail.com',
password: 'password2019',
code: '4RHJHJJKSK'
};

const nonManager = {
email: 'tjhakeemus1@gmail.com',
password: '12345678',
code: '4RHJHJJKSK'
};

const nonManage = {
email: 'ghaddafi@gmail.com',
password: 'password2019',
code: 'BAREFOOT'
};

const users = {
user1,
user2,
Expand Down Expand Up @@ -411,7 +429,10 @@ const users = {
credentialsForServerError2,
staffAuth,
adminAuth,
unverifiedLogin
unverifiedLogin,
manager,
nonManager,
nonManage
};

export default users;
Loading

0 comments on commit 3a80d44

Please sign in to comment.