Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/develop' into ft-user-make-reque…
Browse files Browse the repository at this point in the history
…st-168781684
  • Loading branch information
Cheza-Dzabala committed Oct 29, 2019
2 parents ea9d147 + 9b88d11 commit 3878c4d
Show file tree
Hide file tree
Showing 51 changed files with 1,365 additions and 170 deletions.
3 changes: 3 additions & 0 deletions .codeclimate.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
exclude_patterns:
- "src/tests/"
- "src/database/"
17 changes: 11 additions & 6 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,15 @@
"request-suite": "NODE_ENV=test nyc --reporter=html --reporter=text mocha src/tests/requestTests/index.spec.js --require @babel/register --timeout 20000 --exit",
"test-suite": "NODE_ENV=test nyc --reporter=html --reporter=text mocha src/tests/index.spec.js --require @babel/register --timeout 20000 --exit",
"coveralls": "nyc report --reporter=text-lcov| coveralls",
"build": "babel ./src --out-dir dist --source-maps --watch"
"localbuild": "babel ./src --out-dir dist --source-maps --watch"
},
"nyc": {
"exclude": [
"**/**/**/tests",
"**/**/**/index.js",
"**/**/**/swagger-doc.js",
"**/**/**/**/passport"
"**/**/**/**/passport",
"**/**/**/**/config"
]
},
"husky": {
Expand Down Expand Up @@ -84,8 +85,9 @@
"pg-hstore": "^2.3.3",
"regenerator-runtime": "^0.13.3",
"request": "^2.87.0",
"sequelize": "^5.19.1",
"sequelize": "^5.21.1",
"sequelize-cli": "^5.5.1",
"slugify": "^1.3.5",
"swagger-jsdoc": "^3.4.0",
"swagger-ui-express": "^4.1.1",
"underscore": "^1.9.1"
Expand Down
87 changes: 85 additions & 2 deletions src/controllers/accommodationController.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
/* eslint-disable radix */
import cloudinary from 'cloudinary';
import slugify from 'slugify';
import sequelize from 'sequelize';
import models from '../database/models';
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 bookingHelper from '../helpers/bookingHelper';

cloudinary.config({ CLOUDINARY_URL: process.env.CLOUDINARY_URL });

const {
CREATED, NO_INFO_YET, RETRIEVED, NO_ACCOMMODATION
CREATED, NO_INFO_YET, RETRIEVED, NO_ACCOMMODATION, FOUND, BOOKED_FOUND
} = strings.accommodation.success;

export default class AccommodationController {
Expand All @@ -29,7 +34,8 @@ export default class AccommodationController {
highlights,
amenities,
owner: req.user.payload.id,
images
images,
slug: slugify(name.toLowerCase())
};
try {
const newAccommodation = await models.accommodations.create(accommodation);
Expand Down Expand Up @@ -107,4 +113,81 @@ export default class AccommodationController {
responseUtil(res, 200, strings.accommodations.success.ACCOMMODATION_DELETED);
});
}

static availableAccommdation(req, res) {
const { Op } = sequelize;
models.accommodations.findAll({
where: {
availableSpace: {
[Op.gt]: 0,
}
},
attributes: { exclude: ['locationId', 'owner'] },
include: [{
model: models.locations,
as: 'accommodationLocation',
attributes: ['id', 'name']
}, {
model: models.users,
as: 'ownerUser',
attributes: ['id', 'username', 'email']
}]
}).then(accommodation => responseUtil(res, 200, FOUND, accommodation));
}

static viewBookings(req, res) {
models.booking.findAll({
where: {
userId: req.user.payload.id
},
attributes: { exclude: ['accommodationId', 'userId'] },
include: [{ association: 'accommodation', attributes: ['id', 'name', 'description', 'cost', 'currency', 'owner', 'images'] },
{ association: 'user', attributes: ['id', 'username', 'email'] }],
}).then(book => responseUtil(res, 200, BOOKED_FOUND, book));
}

static bookAccommdation(req, res) {
const {
checkInDate, checkOutDate, accomodationId, roomsNumber
} = req.body;

bookingHelper.findAccomodation(req).then(bookings => {
if (!bookings) {
return responseUtil(res, 404, strings.accommodations.error.ACCOMMODATION_NOT_FOUND);
}
bookingHelper.availableAccommodation(req).then(accommodation => {
if (accommodation.length === 0) {

return responseUtil(res, 400, strings.accommodation.error.NOT_AVAILABLE);
}

checkDate(res, checkInDate, checkOutDate);
const bookingData = {
userId: req.user.payload.id,
accommodationId: accomodationId,
bookedSpace: roomsNumber,
checkIn: checkInDate,
checkOut: checkOutDate,
};
bookingHelper.findBooked(req, accommodation[0].id).then(booked => {
if (booked.length === 0) {

if (accommodation[0].availableSpace < roomsNumber) {

return responseUtil(res, 400, strings.accommodation.error.EXCEED_NUMBER);
}
models.booking.create(bookingData);

const remainingSpace = parseInt(accommodation[0].availableSpace) - roomsNumber;

bookingHelper.updateAccomodation(req, remainingSpace);

return responseUtil(res, 200, strings.accommodation.success.SUCCESSFUL_BOOKED);
}
return responseUtil(res, 409, strings.accommodation.error.ALREADY_BOOKED);
});
});
});
}

}
78 changes: 76 additions & 2 deletions src/controllers/requestController.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,88 @@
import models from '../database/models';
import strings from '../utils/stringsUtil';
import text from '../utils/strings';
import responseHelper from '../utils/responseHelper';
import responseUtil from '../utils/responseUtil';
import userServices from '../services/userServices';
import requestServices from '../services/requestServices/requestServices';
import destinationController from './destinationController';
import searchRequestsServices from '../services/searchRequestsServices';
import Utilities from '../utils/index';
import findRequests from '../helpers/findRequests';

const {
APPROVED, REJECTED, SUCCESSFULLY_RETRIEVED_REQUESTS
} = strings.requests;
const { NO_REQUESTS, ASSIGNED_REQUESTS } = text.user.requests;

const { allSearch } = searchRequestsServices;

export default class requestController {

static async viewRequests({ user }, res) {
static async viewManagerRequests(req, res) {
const { id: lineManager } = req.user.payload;

const users = await models.users.findAll({
where: { lineManager },
attributes: ['id', 'username', 'email'],
include: [
{
model: models.requests,
where: { statusId: [1, 2, 3] },
attributes: ['id', 'createdAt'],
include: [
{ model: models.tripTypes, as: 'type', attributes: ['id', 'name'] },
{ model: models.requestStatus, as: 'status', attributes: ['id', 'name'] },
{ model: models.locations, as: 'origin', attributes: ['id', 'name', 'country'] },
{ model: models.destinations, attributes: ['id', 'arrivalDate', 'departureDate', 'reasons'], include: [{ model: models.locations, as: 'location', attributes: ['name'] }] }
]
},
]
});
return responseUtil(res, 200, (!users.length)
? NO_REQUESTS
: ASSIGNED_REQUESTS, users);
}

static async viewMyRequests({ user }, res) {
const query = Utilities.userQueries.userRequests(user.payload);
const { requests } = await userServices.findOne(query, Utilities.queryScopes.responseScope);

return responseUtil(res, 200, (!requests.length)
? NO_REQUESTS
: SUCCESSFULLY_RETRIEVED_REQUESTS, requests);
}

static async approveRequest(req, res) {
const { id } = req.params;

const requestToApprove = findRequests(req);

if (requestToApprove) {
await models.requests.update({ statusId: 3 }, { where: { id } });

return responseHelper(res, APPROVED, null, 200);
}
return responseHelper(res, strings.requests.NOT_FOUND, null, 404);
}

static async rejectRequest(req, res) {
const { id } = req.params;

const requestToReject = findRequests(req);

if (requestToReject) {
await models.requests.update({ statusId: 2 }, { where: { id } });

return responseHelper(res, REJECTED, null, 200);
}
return responseHelper(res, strings.user.requests.NOT_FOUND, null, 404);

}

static async searchRequests(req, res) {
const requests = await allSearch(req.body);

if (!requests.length) {
return Utilities.responseHelper(
res,
Expand All @@ -20,7 +94,7 @@ export default class requestController {

return Utilities.responseHelper(
res,
Utilities.stringsHelper.user.requests.SUCCESSFULLY_RETRIEVED_REQUESTS,
Utilities.stringsHelper.user.requests.SUCCESSFULLY_FOUND_REQUESTS,
requests,
200
);
Expand Down
10 changes: 5 additions & 5 deletions src/database/migrations/20190930143254-User.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

module.exports = {
up: (queryInterface, Sequelize) => queryInterface.createTable('users', {
id: {
Expand Down Expand Up @@ -28,7 +27,7 @@ module.exports = {
allowNull: true
},
dob: {
type: Sequelize.DATE,
type: Sequelize.DATEONLY,
allowNull: true
},
country: {
Expand All @@ -53,7 +52,8 @@ module.exports = {
},
lineManager:{
type: Sequelize.INTEGER,
allowNull: true
allowNull: false,
defaultValue: 8
},
email: {
type: Sequelize.STRING,
Expand All @@ -69,8 +69,8 @@ module.exports = {
}
}
},
createdAt: Sequelize.DATE,
updatedAt: Sequelize.DATE,
createdAt: Sequelize.DATEONLY,
updatedAt: Sequelize.DATEONLY,
}),
down: queryInterface => queryInterface.dropTable('users')
};
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@

module.exports = {
up: (queryInterface, Sequelize) => queryInterface.sequelize.transaction(t => Promise.all([
queryInterface.addColumn('users', 'password', {
Expand All @@ -14,7 +13,7 @@ module.exports = {
type: Sequelize.INTEGER,
allowNull: false,
defaultValue: 6
}, { transaction: t })
}, { transaction: t }),
])),

down: queryInterface => queryInterface.sequelize.transaction(t => Promise.all([
Expand Down
4 changes: 2 additions & 2 deletions src/database/migrations/20191015081627-create-requests.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,11 @@ module.exports = {
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY,
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY,
}
});
},
Expand Down
4 changes: 2 additions & 2 deletions src/database/migrations/20191015081823-create-trip-types.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ module.exports = {
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY
}
});
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,11 @@ module.exports = {
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY
}
});
},
Expand Down
4 changes: 2 additions & 2 deletions src/database/migrations/20191015082308-create-destinations.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,11 @@ module.exports = {
},
createdAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE
type: Sequelize.DATEONLY
}
});
},
Expand Down
Loading

0 comments on commit 3878c4d

Please sign in to comment.