Skip to content

Commit

Permalink
ft(stats of trips):Users should get stats of trips made in the last X…
Browse files Browse the repository at this point in the history
… timeframe

add getStast function
add findStats helper
[finishes #168781712]
  • Loading branch information
sabin18 committed Nov 7, 2019
1 parent e8db510 commit d715df6
Show file tree
Hide file tree
Showing 9 changed files with 142 additions and 7 deletions.
4 changes: 2 additions & 2 deletions src/controllers/accommodationController.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import strings from '../utils/stringsUtil';
import responseUtil from '../utils/responseUtil';
import responseError from '../utils/responseError';
import imageUploader from '../helpers/imageUploader';
import checkDate from '../helpers/checkDateHelper';
import checkDateHelper from '../helpers/checkDateHelper';
import bookingHelper from '../helpers/bookingHelper';
import getAccommodation from '../helpers/getAccommodation';
import sendEmail from '../helpers/emailHelper';
Expand Down Expand Up @@ -134,7 +134,7 @@ export default class AccommodationController {
return responseUtil(res, 400, strings.accommodation.error.NOT_AVAILABLE);
}

checkDate(res, checkInDate, checkOutDate);
checkDateHelper.checkDate(res, checkInDate, checkOutDate);
const bookingData = {
userId: req.user.payload.id,
accommodationId: accomodationId,
Expand Down
8 changes: 8 additions & 0 deletions src/controllers/requestController.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import searchRequestsServices from '../services/searchRequestsServices';
import Utilities from '../utils/index';
import findOneRequest from '../helpers/findOneRequest';
import findUser from '../helpers/findUser';
import requestHelper from '../helpers/requestHelper';
import notifSender from '../helpers/notifSender';

const { Op } = Sequelize;
Expand Down Expand Up @@ -146,4 +147,11 @@ export default class requestController {
const request = await createRequest(body, user.payload.id);
return destinationController.storeDestination(req, res, body, user, request);
}

static async getStats(req, res) {
const requestResults = await requestHelper.findStatRequest(req, res);
return responseUtil(res, 200, strings.request.success.RESULT, requestResults.count);

}

}
12 changes: 11 additions & 1 deletion src/helpers/checkDateHelper.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,14 @@ const checkDate = (res, startDate, endDate) => {
responseUtil(res, 400, strings.accommodation.error.DATE_ERROR);
}
};
export default checkDate;

const statsDate = (res, startDate, endDate) => {

if (moment(startDate) < moment(endDate)) {
responseUtil(res, 400, strings.request.error.DATE_ERROR);
}
if (startDate === endDate) {
responseUtil(res, 400, strings.request.error.DATE_EQUAL);
}
};
export default { checkDate, statsDate };
21 changes: 19 additions & 2 deletions src/helpers/requestHelper.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import sequelize from 'sequelize';
import models from '../database/models';

import checkDateHelper from './checkDateHelper';

const findOneRequest = properties => {
const request = models.requests.findOne({
Expand All @@ -9,4 +10,20 @@ const findOneRequest = properties => {
return request;
};

export default { findOneRequest };
const findStatRequest = async (req, res) => {
const { startDate, endDate } = req.query;
const { Op } = sequelize;
checkDateHelper.statsDate(res, startDate, endDate);
const requestResult = await models.requests.findAndCountAll({
where: {
userId: req.user.payload.id,
statusId: 3,
departureDate: {
[Op.between]: [endDate, startDate],
}
}
});
return requestResult;
};

export default { findOneRequest, findStatRequest };
8 changes: 8 additions & 0 deletions src/middlewares/inputValidation.js
Original file line number Diff line number Diff line change
Expand Up @@ -221,4 +221,12 @@ export default class InputValidation {
validation(req, res, schema, next);
}

static validateRequestStas(req, res, next) {
const schema = Joi.object().keys({
startDate: Joi.string().regex(/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/).message('startDate format must be YYYY-MM-DD').required(),
endDate: Joi.string().regex(/([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))/).message('endDate format must be YYYY-MM-DD').required(),
});
validation(req, res, schema, next);
}

}
7 changes: 5 additions & 2 deletions src/routes/api/requests.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,13 @@ import catchOriginDestination from '../../middlewares/catchOriginDestination';

const router = new Router();
const {
viewMyRequests, changeStatus, viewManagerRequests, searchRequests, updateRequest
viewMyRequests, changeStatus, viewManagerRequests, searchRequests, updateRequest,
getStats,
} = requestController;

const {
validateSearchRequestUser, validateSearchRequestManager,
validateComment, validateRequest,
validateComment, validateRequest, validateRequestStas
} = InputValidation;
const { checkManagerRole, supplierNotAllowed } = checkRole;
const { editComment, deleteComment } = commentsController;
Expand Down Expand Up @@ -156,4 +157,6 @@ router.patch('/manager/:action/:id', validateToken, checkManagerRole, checkId, w
router.patch('/:id', validateToken, pendingRequest.requestOwner, pendingRequest.selectPending, validateRequest, pendingRequest.validateBody, updateRequest);
router.put('/comments/:id', validateToken, checkId, validateComment, editComment);
router.delete('/comments/:id', validateToken, checkId, deleteComment);
router.get('/stats/', validateToken, supplierNotAllowed, catchSearchQueries, validateRequestStas, getStats);
router.get('/:id', (req, res) => requestController.findOne(req, res));
export default router;
83 changes: 83 additions & 0 deletions src/tests/RequestStats.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import chai from 'chai';
import chaiHttp from 'chai-http';
import { describe, it, before } from 'mocha';
import app from '../index';
import mockData from './mockData/mockData';

chai.should();
chai.use(chaiHttp);

let userToken;
let supplierToken;

describe('stats Requests Tests', () => {
before(done => {
chai.request(app)
.post('/api/v1/users/login')
.send(mockData.registeredUser)
.end((err, res) => {
userToken = res.body.data.token;
});
chai.request(app)
.post('/api/v1/users/login')
.send(mockData.supplier)
.end((err, res) => {
supplierToken = res.body.data.token;
done();
});
});


it('Should return stats ', done => {
chai.request(app)
.get('/api/v1/requests/stats?startDate=2019-11-07&endDate=2019-01-03')
.set('Authorization', `Bearer ${userToken}`)
.end((err, res) => {
res.should.have.property('status').eql(200);
res.body.should.have.property('message').eql('Your number of trips are:');
done();
});
});

it('Should return stats with invalid date', done => {
chai.request(app)
.get('/api/v1/requests/stats?startDate=2019-11-07&endDate=2019-12-03')
.set('Authorization', `Bearer ${userToken}`)
.end((err, res) => {
res.should.have.property('status').eql(400);
res.body.should.have.property('message').eql('endDate must not be greater than startDate');
done();
});
});

it('Should return stats with invalid date', done => {
chai.request(app)
.get('/api/v1/requests/stats?startDate=2019-11-07&endDate=2019-11-07')
.set('Authorization', `Bearer ${userToken}`)
.end((err, res) => {
res.should.have.property('status').eql(400);
res.body.should.have.property('message').eql('Dates are similar use different dates');
done();
});
});

it('Should return 403 status, Supplier not allowed', done => {
chai.request(app)
.get('/api/v1/requests/stats?startDate=2019-11-07&endDate=2019-01-03')
.set('Authorization', `Bearer ${supplierToken}`)
.end((err, res) => {
res.should.have.property('status').eql(403);
done();
});
});

it('Should return 400 status, with invalid input', done => {
chai.request(app)
.get('/api/v1/requests/stats?days=-23')
.set('Authorization', `Bearer ${userToken}`)
.end((err, res) => {
res.should.have.property('status').eql(400);
done();
});
});
});
2 changes: 2 additions & 0 deletions src/tests/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import notificationsTests from './notificationsTests.spec';
import ratingsTest from './ratingsTests.spec';
import commentsTests from './comment.spec';
import destinationTests from './destinationTests.spec';
import RequestStats from './RequestStats.spec'

describe('Default Tests', defaultTests);
describe('Edit Request Tests', editRequest);
Expand All @@ -35,4 +36,5 @@ describe('Notifications Tests', notificationsTests);
describe('Ratings Tests', ratingsTest);
describe('Comments Tests', commentsTests);
describe('Destination Tests', destinationTests);
describe('RequestStats Tests', RequestStats);

4 changes: 4 additions & 0 deletions src/utils/stringsUtil.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,12 @@ const strings = {
success: {
SUCCESS_UPDATE_REQUEST: 'Request Updated',
SUCCESS_ADD_COMMENT: 'Comment Added',
RESULT: 'Your number of trips are:',
},

error: {
DATE_EQUAL: 'Dates are similar use different dates',
DATE_ERROR: 'endDate must not be greater than startDate',
INTERNAL_ERROR: 'Internal server error',
NO_REQUEST_REQUEST: 'This Id request does not exist',
EDIT_YOUR_REQUEST: 'Access denied! you are not the owner of this request',
Expand Down

0 comments on commit d715df6

Please sign in to comment.