Skip to content

Commit

Permalink
ft(update trip request): user should be able update trip request
Browse files Browse the repository at this point in the history
        - squash commit

        [finishes #168781705]
  • Loading branch information
ngireric123 committed Oct 30, 2019
1 parent 2cde6f6 commit 66706f4
Show file tree
Hide file tree
Showing 16 changed files with 242 additions and 215 deletions.
4 changes: 0 additions & 4 deletions src/controllers/commentsController.js
Original file line number Diff line number Diff line change
@@ -1,4 +0,0 @@
import models from '../database/models';

export default class CommentsController {
}
20 changes: 1 addition & 19 deletions src/controllers/requestController.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import Utilities from '../utils/index';
import findRequests from '../helpers/findRequests';

const { Op } = Sequelize;
const { requests } = models;

const {
APPROVED, REJECTED, SUCCESSFULLY_RETRIEVED_REQUESTS
Expand Down Expand Up @@ -99,24 +98,7 @@ export default class requestController {
},
});
});
const request = await requests.findOne({
where: { id },
include: [{
model: models.tripTypes, attribute: ['name'], as: 'type', attributes: ['id', 'name']
},
{
model: models.destinations,
attributes: ['arrivalDate', 'departureDate', 'reasons', 'isFinal', 'bookingId'],
include: [{
model: models.locations,
as: 'location',
attributes: ['id', 'name', 'country']
},
],
required: true
}
],
});
const request = await allSearch({ id });
return responseUtil(res, 200, strings.request.success.SUCCESS_UPDATE_REQUEST, request);
} catch (error) {
return res.status(500).json({ error: 'Something wrong' });
Expand Down
2 changes: 1 addition & 1 deletion src/database/seeders/20191016143026-requestTableSeeder.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ module.exports = {
typeId: 3,
userId: 3,
locationId: 2,
statusId: 2,
statusId: 1,
departureDate: '10-25-2019',
returnDate: '11-25-2019',
createdAt: new Date(),
Expand Down
23 changes: 23 additions & 0 deletions src/database/seeders/20191016143055-destinationsTableSeeder.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,29 @@ module.exports = {
createdAt: new Date(),
updatedAt: new Date()
},
{
locationId: 5,
bookingId: 2,
arrivalDate: '10-29-2019',
departureDate: null,
requestId: 2,
reasons: 'Partner Company Meeting',
isFinal: true,
createdAt: new Date(),
updatedAt: new Date()
},
{
locationId: 5,
bookingId: 2,
arrivalDate: '10-29-2019',
departureDate: null,
requestId: 6,
reasons: 'Partner Company Meeting',
isFinal: true,
createdAt: new Date(),
updatedAt: new Date()
},

])
]),

Expand Down
12 changes: 12 additions & 0 deletions src/helpers/requestHelper.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import models from '../database/models';


const findOneRequest = properties => {
const request = models.requests.findOne({
where: properties,
raw: true
});
return request;
};

export default { findOneRequest };
12 changes: 4 additions & 8 deletions src/middlewares/inputValidation.js
Original file line number Diff line number Diff line change
Expand Up @@ -168,19 +168,15 @@ export default class InputValidation {
if (data.typeId === 1 || data.typeId === 2) {
maximumItems = 1;
}

if (data.typeId === 3) {
minimumItems = 2;
}

const schema = Joi.object({
locationId: Joi.number().required(),
typeId: Joi.number()
.required(),
locationId: Joi.number(),
departureDate: Joi.date().greater('now'),
returnDate: Joi.date()
.when('typeId', {
is: 2,
then: Joi.required()
}).greater(Joi.ref('departureDate')),
returnDate: Joi.date().greater(Joi.ref('departureDate')),
destinations: Joi.array()
.items(Joi.object({
arrivalDate: Joi.date().greater(Joi.ref('....departureDate')),
Expand Down
71 changes: 45 additions & 26 deletions src/middlewares/request.js
Original file line number Diff line number Diff line change
@@ -1,38 +1,57 @@
/* eslint-disable no-irregular-whitespace */
import responseError from '../utils/responseError';
import string from '../utils/stringsUtil';
import models from '../database/models';

const { requests } = models;
/* eslint-disable no-irregular-whitespace */
import responseError from '../utils/responseError';
import string from '../utils/stringsUtil';
import models from '../database/models';
import requestHelper from '../helpers/requestHelper';

const request = {
async selectPending(req, res, next) {
const userId = req.user.payload.id;
const id = parseInt(req.params.id, 10);
const requester = await requests.findOne({
where: { id, userId },
raw: true
});
if (requester.statusId !== 1) {
return responseError(res, 400, string.users.error.NO_PENDED_REQUEST);
const { requests } = models;
const { findOneRequest } = requestHelper;

const request = {
async selectPending(req, res, next) {
const id = parseInt(req.params.id, 10);
const reques = await findOneRequest({ id });

if (reques.statusId !== 1) {
return responseError(res, 400, string.users.error.NO_PENDED_REQUEST);
}
next();
},

async requestOwner(req, res, next) {
const { id } = req.params;
const request = await requests.findOne({
where: { id },
});
if (!request) {
return responseError(res, 400, 'string.request.error.EDIT_YOUR_REQUEST');
async requestOwner(req, res, next) {
const { id } = req.params;
const request = await findOneRequest({ id });
if (!request) {
return responseError(res, 400, string.request.error.NO_REQUEST);
}
if (request.userId !== req.user.payload.id) {
return responseError(res, 400, string.request.error.EDIT_YOUR_REQUEST);
if (request.userId !== req.user.payload.id) {
return responseError(res, 400, string.request.error.EDIT_YOUR_REQUEST);
}
req.request = request;
req.request = request;
next();
},

async validateBody(req, res, next) {
const { id } = req.params;
const destination = req.body;
await requests.findOne({
where{ id },
});
const destinationArray = destination.destinations;
destinationArray.forEach(async element => {
await models.destinations.findOne({
where{
requestIdid, idelement.id
},
}).then(destination => {
if (!destination) {
return responseError(res, 403, `Destination of id ${element.id} does not belong to this request`);
}
});
});
next();
}
};

export default request;
export default request;
1 change: 1 addition & 0 deletions src/middlewares/requests/relationVerification.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import validationErrorFormatter from '../../utils/validationErrorFormatter';
import Utilities from '../../utils/index';

export default async (req, res, next) => {

const { body, user } = req;
const {
locationId, typeId, departureDate, returnDate, destinations
Expand Down
40 changes: 8 additions & 32 deletions src/routes/api/requests.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,31 +11,17 @@ import catchSearchQueries from '../../middlewares/catchSearchQueries';
import pendingRequest from '../../middlewares/request';

const router = new Router();
// const {
// viewMyRequests, approveRequest, rejectRequest, viewManagerRequests, searchRequests

// import pendingRequest from '../../middlewares/request';
// import checkUserIdField from '../../middlewares/checkUserIdField';
// import managerUserIdField from '../../middlewares/managerUserIdField';
// import catchSearchQueries from '../../middlewares/catchSearchQueries';
// import InputValidation from '../../middlewares/inputValidation';

// const { validateRequest } = InputValidation;

// const router = new Router();
const {
viewMyRequests, approveRequest, rejectRequest, viewManagerRequests, searchRequests, updateRequest
} = requestController;

const { validateSearchRequestUser, validateSearchRequestManager, validateRequest } = InputValidation;
const {
validateSearchRequestUser,
validateSearchRequestManager,
validateRequest,
} = InputValidation;
const { checkManagerRole, supplierNotAllowed } = checkRole;


// router.get('/', validateToken, viewMyRequests);
// router.get('/manager', validateToken, checkManagerRole, viewManagerRequests);
// router.patch('/manager/approve/:id', validateToken, checkManagerRole, checkId, approveRequest);
// router.patch('/manager/reject/:id', validateToken, checkManagerRole, checkId, rejectRequest);

/**
* @swagger
* /requests/search:
Expand Down Expand Up @@ -154,26 +140,16 @@ const { checkManagerRole, supplierNotAllowed } = checkRole;
* description: No Requests Registered!
*/

router.use(validateToken);

// router.get('/', validateToken, (req, res) => requestController.viewRequests(req, res));
// router.get('/search', validateToken, catchSearchQueries, supplierNotAllowed, validateSearchRequestUser, checkUserIdField, searchRequests);

// eslint-disable-next-line max-len

// router.get('/manager/search', validateToken, catchSearchQueries, supplierNotAllowed, checkManagerRole, validateSearchRequestManager, managerUserIdField, searchRequests);

router.post('/', verifyRelationships, (req, res) => requestController.storeRequest(req, res));
router.get('/search', validateToken, catchSearchQueries, supplierNotAllowed, validateSearchRequestUser, checkUserIdField, searchRequests);
// eslint-disable-next-line max-len
router.get('/manager/search', validateToken, catchSearchQueries, supplierNotAllowed, checkManagerRole, validateSearchRequestManager, managerUserIdField, searchRequests);
router.get('/', validateToken, viewMyRequests);
router.get('/manager', validateToken, checkManagerRole, viewManagerRequests);
router.patch('/manager/approve/:id', validateToken, checkManagerRole, checkId, approveRequest);
router.patch('/manager/reject/:id', validateToken, checkManagerRole, checkId, rejectRequest);
router.patch('/:id',
validateToken,
pendingRequest.requestOwner,
pendingRequest.selectPending,
validateRequest,
updateRequest);
router.patch('/:id', validateToken, pendingRequest.requestOwner, pendingRequest.selectPending, validateRequest, pendingRequest.validateBody, updateRequest);

export default router;
14 changes: 2 additions & 12 deletions src/tests/accommodationTest.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ let adminToken;
let supplierToken;

let invalidToken = 'wdsfwsadwsadsadsqa';

// it should not book an accommodation with supplier Token:
describe('Accommodation Test', () => {
before((done) => {
chai.request(app)
Expand Down Expand Up @@ -307,17 +307,7 @@ describe('Accommodation Test', () => {
done();
});
});
it('it should not book an accommodation with supplier Token', done => {
chai.request(app)
.patch('/api/v1/accommodations/book')
.set('Authorization', `Bearer ${supplierToken}`)
.send(mockData.bookingdata)
.end((err, res) => {
res.should.have.status(403);
res.body.should.have.property('message').eql('Access denied! a supplier can not access this part of the system!')
done();
});
});

it('it should get all bookings', done => {
chai.request(app)
.get('/api/v1/accommodations/bookings')
Expand Down
58 changes: 52 additions & 6 deletions src/tests/editRequest.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,28 +12,74 @@ chai.use(chaiHttp);

const id = mockdata.verifiedUser1.id;
const newRequest = {
typeId: 1,
locationId: 1,

destinations: [
{
id: 1,
id: 8,
reasons: 'visit andela'
}

]
}
const newRequest1 = {
locationId: 1,
destinations: [
{
id: 82222,
reasons: 'visit andela'
}
]
}
const newRequest2 = {
locationId: 1,
destinations: [
]
}

describe('update trip request', () =>{
it('should edit his/her trip request', (done) => {
chai.request(app)
.patch('/api/v1/requests/2')
.patch('/api/v1/requests/6')
.set('Authorization', `Bearer ${token}`)
.send(newRequest)
.end((err, res) => {
res.should.have.property('status').eql(200);
res.body.should.have.property('message').eql('Request Updated');
done();
});

});
it('destinations must contain at least 1 items', (done) => {
chai.request(app)
.patch('/api/v1/requests/6')
.set('Authorization', `Bearer ${token}`)
.send(newRequest2)
.end((err, res) => {
res.should.have.property('status').eql(400);
done();
});

});
it('should edit not edit others trip request', (done) => {
chai.request(app)
.patch('/api/v1/requests/4')
.set('Authorization', `Bearer ${token}`)
.send(newRequest)
.end((err, res) => {
res.should.have.property('status').eql(400);
done();
});

});
it('should not edit trip request with wrong destination', (done) => {
chai.request(app)
.patch('/api/v1/requests/6')
.set('Authorization', `Bearer ${token}`)
.send(newRequest1)


.end((err, res) => {
res.should.have.property('status').eql(403);
done();
});

});
});
Loading

0 comments on commit 66706f4

Please sign in to comment.