Skip to content

Commit

Permalink
Merge 628abc9 into 1faf5a6
Browse files Browse the repository at this point in the history
  • Loading branch information
tobslob committed Sep 9, 2019
2 parents 1faf5a6 + 628abc9 commit e9062a6
Show file tree
Hide file tree
Showing 13 changed files with 103 additions and 24 deletions.
7 changes: 6 additions & 1 deletion src/controllers/accommodationController.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,12 @@ const { serverError } = messages;
*/
const createAccommodation = async (req, res) => {
try {
const { body } = req;
const { decoded: { id: userId }, body } = req;
const user = await getById(User, userId, {});
const { verified } = user;
if (verified === false) {
return response(res, 403, 'error', { message: messages.unAuthorized });
}
const {
country, city, address, accommodation, accommodationType, roomType, numOfRooms,
description, facilities
Expand Down
2 changes: 1 addition & 1 deletion src/database/migrations/20190813040158-create-role.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ module.exports = {
type: {
allowNull: false,
type: Sequelize.ENUM,
values: ['requester', 'super-admin', 'manager', 'travel-admin', 'travel-team-member'],
values: ['requester', 'super-admin', 'manager', 'travel-admin', 'travel-team-member', 'accommodation-supplier'],
},
createdAt: {
allowNull: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ module.exports = {
allowNull: false,
},
accommodationType: {
type: Sequelize.ARRAY(Sequelize.STRING),
type: Sequelize.STRING,
allowNull: false,
},
roomType: {
Expand Down
4 changes: 4 additions & 0 deletions src/database/seeders/20190801105352-role.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ export default {
id: roles.TRAVEL_TEAM_MEMBER,
type: 'travel-team-member',
},
{
id: roles.ACCOMMODATION_SUPPLIER,
type: 'accommodation-supplier',
},
], {});
},

Expand Down
26 changes: 25 additions & 1 deletion src/database/seeders/20190819153902-user.js
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,31 @@ export default {
lineManager: '0ce36391-2c08-4703-bddb-a4ea8cccbbc5',
verified: true,
roleId: roles.REQUESTER,
}
},

{
id: '98686f96-3452-4420-a093-8f2fbba1ff05',
firstName: 'Kazeem',
lastName: 'Odutola',
email: 'kazmobileapp@gmail.com',
password: hashPassword('Kazeem27'),
phoneNo: '2347039387595',
lineManager: '0ce36391-2c08-4703-bddb-a4ea8cccbbc5',
verified: true,
roleId: roles.TRAVEL_ADMIN,
},

{
id: 'a2ff3c34-4b2b-449e-aa35-6587f56fdff3',
firstName: 'Kazeem',
lastName: 'Odutola',
email: 'odutolak@gmail.com',
password: hashPassword('Kazeem27'),
phoneNo: '2347032123522',
verified: true,
lineManager: '0ce36391-2c08-4703-bddb-a4ea8cccbbc5',
roleId: roles.ACCOMMODATION_SUPPLIER,
},
], {});
},
down: (queryInterface, Sequelize) => {
Expand Down
2 changes: 1 addition & 1 deletion src/models/accommodation.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ module.exports = (sequelize, DataTypes) => {
allowNull: false,
},
accommodationType: {
type: DataTypes.ARRAY(DataTypes.STRING),
type: DataTypes.STRING,
allowNull: false,
},
roomType: {
Expand Down
15 changes: 12 additions & 3 deletions src/routes/api/accommodation.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@ import { createAccommodation, bookAccommodation } from '../../controllers/accomm
import { checkToken } from '../../middlewares/userMiddlewares';
import validate from '../../middlewares/validator';
import { accommodationSchema, bookAccommodationSchema } from '../../validation/accommodationSchema';
import authorize from '../../middlewares/authorizer';
import roles from '../../utils/roles';

const { TRAVEL_ADMIN, SUPER_ADMIN, ACCOMMODATION_SUPPLIER } = roles;

const accommodationRoute = (router) => {
router.route('/accommodation')
Expand All @@ -25,13 +29,17 @@ const accommodationRoute = (router) => {
* accommodationType:
* type: string
* roomType:
* type: string
* type: array
* items:
* type: string
* numOfRooms:
* type: integer
* description:
* type: string
* facilities:
* type: string
* type: array
* items:
* type: string
* createdAt:
* type: string
* format: date-time
Expand Down Expand Up @@ -92,7 +100,8 @@ const accommodationRoute = (router) => {
* security:
* - bearerAuth: []
*/
.post(checkToken, validate(accommodationSchema), createAccommodation);
.post(checkToken, authorize([TRAVEL_ADMIN, SUPER_ADMIN, ACCOMMODATION_SUPPLIER]),
validate(accommodationSchema), createAccommodation);
};


Expand Down
22 changes: 18 additions & 4 deletions src/test/mockData/accommodationMock.js
Original file line number Diff line number Diff line change
@@ -1,24 +1,37 @@
const userId = '122a0d86-8b78-4bb8-b28f-8e5f7811c456';
const travelAdmin = {
email: 'kazmobileapp@gmail.com',
password: 'Kazeem27'
};

const validAccommodationDetail = {
country: 'Nigeria',
city: 'lagos',
address: '2, Alausa Ikeja',
accommodation: 'OrientalHotel',
accommodationType: ['Hotel', 'Motel'],
accommodationType: 'Hotel',
roomType: ['single', 'double'],
numOfRooms: 50,
description: 'The best hotel in lagos state',
facilities: ['Free-Wifi', 'Television', 'Parking space'],
images: '/home/oluwatobi/Pictures/jpeg2000-home.jpg'
};

const inValidRoomType = {
tripRequestId: '122a0d86-8b78-4bb8-b28f-8e5f7811c456',
typeOfRoom: ['master'],
numOfRooms: 1,
adults: 2,
children: 0,
checkIn: '2019-09-03',
checkOut: '2019-09-06'
};

const inValidAccommodationDetail = {
country: 'Nigeri',
city: 'lagos',
address: '2, Alausa Ikeja',
accommodation: 'OrientalHotel',
accommodationType: ['Hotel', 'Motel'],
accommodationType: 'Hotel',
roomType: ['single', 'double'],
numOfRooms: 50,
description: 'The best hotel in lagos state',
Expand Down Expand Up @@ -62,5 +75,6 @@ export {
validBookingDetails,
inValidBookingDetails,
inValidBookingDate,
userId
travelAdmin,
inValidRoomType,
};
39 changes: 30 additions & 9 deletions src/test/routes/accommodation.spec..js
Original file line number Diff line number Diff line change
@@ -1,25 +1,32 @@
import {
app, chai, expect, BACKEND_BASE_URL, messages,
} from '../testHelpers/config';
import { generateToken } from '../../utils/authHelper';
import {
validAccommodationDetail, inValidAccommodationDetail, userId,
validAccommodationDetail, inValidAccommodationDetail, travelAdmin, inValidRoomType,
validBookingDetails, inValidBookingDetails, inValidBookingDate
} from '../mockData/accommodationMock';

let id;


describe('Create Accommodation', () => {
const accommodationEndpoint = `${BACKEND_BASE_URL}/accommodation`;
const bookAccommodationEndpoint = `${BACKEND_BASE_URL}/book/accommodation`;
const signinEndpoint = `${BACKEND_BASE_URL}/user/signin`;
let token;

before(async () => {
token = generateToken({ id: userId });
});
let id;

describe('POST /accommodation', () => {
it('should generate travel admin token', (done) => {
chai
.request(app)
.post(signinEndpoint)
.send(travelAdmin)
.end((err, res) => {
const { data } = res.body;
token = data.token;
expect(data).to.have.property('token');
done(err);
});
});

it('should post accommodation successfully', (done) => {
chai.request(app)
.post(accommodationEndpoint)
Expand Down Expand Up @@ -92,6 +99,20 @@ describe('Create Accommodation', () => {
});
});

it('should return error if room specify is not in accommodation', (done) => {
chai.request(app)
.post(`${bookAccommodationEndpoint}/${id}`)
.set('authorization', token)
.set('Authorization', `Bearer ${token}`)
.send(inValidRoomType)
.end((err, res) => {
const { data } = res.body;
expect(res.status).to.equal(400);
expect(data).to.have.property('message');
done(err);
});
});

it('should not book unavailable accommodation', (done) => {
chai.request(app)
.post(`${bookAccommodationEndpoint}/bf4d0b97-2e80-44cc-bc0e-bafafdb8c9bb`)
Expand Down
2 changes: 1 addition & 1 deletion src/utils/cloudinaryStorage.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ const storage = cloudinaryStorage({
transformation: [{
width: 500, height: 250, crop: 'scale', quality: 'auto'
}],
allowedFormats: ['jpg', 'jpeg', 'png', 'gif'],
allowedFormats: ['jpg', 'jpeg', 'png', 'gif', 'svg'],
});

export default storage;
1 change: 1 addition & 0 deletions src/utils/messages.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ const messages = {
forgotPassword: 'Check your mail to reset your password.',
updatePassword: 'Password updated successfully',
confirmation: 'Please confirm this action by passing confirmation as true as query parameter in your request',
unAuthorized: 'You are not authorized to create accommodation',
};

export default messages;
1 change: 1 addition & 0 deletions src/utils/roles.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const roles = {
MANAGER: '7254a9e7-2e1b-4f83-ad73-78b90dd3df77',
TRAVEL_ADMIN: '4fd084a0-cdd6-47a5-aaf5-5fdc8b5629dd',
TRAVEL_TEAM_MEMBER: '47e327b8-0073-4443-968b-ef8849ddfb49',
ACCOMMODATION_SUPPLIER: '29df247e-c86e-4fc7-b2fd-26b57f975b88',
};

export default roles;
4 changes: 2 additions & 2 deletions src/validation/accommodationSchema.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ const err = () => messages.lowercase;

const validRoomType = JoiValidator.validArray().items(Joi.string()
.regex(/^[a-z]+$/).required().error(err)).error(err);
const validRoomNumber = JoiValidator.validateNumber().required();
const validRoomNumber = JoiValidator.validateNumber().min(1).required();
const isValidId = JoiValidator.validateUuidV4().required();

const accommodationSchema = Joi.object({
Expand Down Expand Up @@ -37,7 +37,7 @@ const accommodationSchema = Joi.object({
city: JoiValidator.validateString().required(),
address: JoiValidator.validateString().required(),
accommodation: JoiValidator.validateString().required(),
accommodationType: JoiValidator.validArray(JoiValidator.validateString()).required(),
accommodationType: JoiValidator.validateString().required(),
roomType: validRoomType,
numOfRooms: validRoomNumber,
description: JoiValidator.validateString().required(),
Expand Down

0 comments on commit e9062a6

Please sign in to comment.