Skip to content

Commit

Permalink
Merge bf5c7e1 into b686fa0
Browse files Browse the repository at this point in the history
  • Loading branch information
tvpeter committed Sep 9, 2019
2 parents b686fa0 + bf5c7e1 commit c3dd483
Show file tree
Hide file tree
Showing 18 changed files with 714 additions and 4 deletions.
3 changes: 3 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@ FACEBOOK_CLIENT_ID=

TOKEN_SECRET=

CLOUDINARY_NAME=
CLOUDINARY_API=
CLOUDINARY_SECRET=

# Test database
DB_TEST_URL=url-to-test-database
Expand Down
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
"@babel/polyfill": "^7.4.4",
"@sendgrid/mail": "^6.4.0",
"bcryptjs": "^2.4.3",
"cloudinary": "1.14.0",
"cors": "^2.8.4",
"date-fns": "^2.0.1",
"dotenv": "^6.2.0",
Expand All @@ -53,6 +54,7 @@
"method-override": "^2.3.10",
"methods": "^1.1.2",
"morgan": "^1.9.1",
"multer": "1.4.2",
"passport": "^0.4.0",
"passport-facebook": "3.0.0",
"passport-google-oauth": "2.0.0",
Expand Down
79 changes: 79 additions & 0 deletions src/controllers/Accomodation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import dotenv from 'dotenv';
import cloudinary from 'cloudinary';
import Response from '../helpers/Response';
import db from '../database/models';

dotenv.config();
const { Accomodation, Room } = db;
cloudinary.v2.config({
cloud_name: process.env.CLOUDINARY_NAME,
api_key: process.env.CLOUDINARY_API,
api_secret: process.env.CLOUDINARY_SECRET
});

/**
* Accomodation class
*/
class AccomodationController {
/**
* @description - create accomodation center
* @param {Object} req - HTTP Request object
* @param {Object} res - HTTP Response object
* @returns {object} objectu
*/
static async createAccomodation(req, res) {
const {
name, branchId, capacity, address
} = req.body;

try {
const image = req.file ? await cloudinary.uploader.upload(req.file.path) : null;
const imgurl = image ? image.public_id : null;
const { dataValues } = await Accomodation.create({
name,
branchId,
capacity,
status: 'available',
imgurl,
address
});
return res.status(200).json(new Response(
true,
200,
'Successfully created acoomodation center',
dataValues
));
} catch (error) {
return res.status(500).json(
new Response(false, 500, error.message)
);
}
}

/**
* @description - Add rooms to accomodation center
* @param {object} req - HTTP Request object
* @param {object} res - HTTP Response object
* @returns {object} -object
*/
static async addRoom(req, res) {
const { name, accomodationId, type } = req.body;

try {
const { dataValues } = await Room.create({
name,
type,
accomodationId
});
return res.status(200).json(
new Response(true, 200, 'Successfully added a room', dataValues)
);
} catch (error) {
return res.status(500).json(
new Response(false, 500, error.message)
);
}
}
}

export default AccomodationController;
23 changes: 23 additions & 0 deletions src/database/migrations/20190904154344-add-fields-accomodation.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
module.exports = {
up: (queryInterface, Sequelize) => Promise.all([
queryInterface.addColumn(
'Accomodations',
'imgurl',
{
type: Sequelize.STRING
}
),
queryInterface.addColumn(
'Accomodations',
'address',
{
type: Sequelize.STRING
}
),
]),

down: queryInterface => Promise.all([
queryInterface.removeColumn('Accomodations', 'imgurl'),
queryInterface.removeColumn('Accomodations', 'address'),
])
};
38 changes: 38 additions & 0 deletions src/database/migrations/20190904175259-create-room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
module.exports = {
up: (queryInterface, Sequelize) => queryInterface.sequelize.query('CREATE EXTENSION IF NOT EXISTS "uuid-ossp";').then(() => queryInterface.createTable('Rooms', {
id: {
allowNull: false,
primaryKey: true,
type: Sequelize.DataTypes.UUID,
defaultValue: Sequelize.literal('uuid_generate_v4()'),
},
name: {
type: Sequelize.STRING,
allowNull: false
},
type: {
type: Sequelize.STRING,
allowNull: false
},
accomodationId: {
type: Sequelize.DataTypes.UUID,
onDelete: 'CASCADE',
onUpdate: 'CASCADE',
references: {
model: 'Accomodations',
key: 'id'
}
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('now')
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: Sequelize.fn('now')
}
})),
down: (queryInterface, Sequelize) => queryInterface.dropTable('Rooms')
};
4 changes: 3 additions & 1 deletion src/database/models/accomodation.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,9 @@ module.exports = (sequelize, DataTypes) => {
name: DataTypes.STRING,
branchId: DataTypes.UUID,
capacity: DataTypes.INTEGER,
status: DataTypes.STRING
status: DataTypes.STRING,
imgurl: DataTypes.STRING,
address: DataTypes.STRING
}, {});
Accomodation.associate = (models) => {
Accomodation.belongsTo(models.Branch, {
Expand Down
16 changes: 16 additions & 0 deletions src/database/models/room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
module.exports = (sequelize, DataTypes) => {
const Room = sequelize.define('Room', {
name: DataTypes.STRING,
type: DataTypes.STRING,
accomodationId: DataTypes.UUID
}, {});
Room.associate = models => {
Room.belongsTo(models.Accomodation, {
foreignKey: 'accomodationId',
as: 'accomodation',
onDelete: 'CASCADE',
onUpdate: 'CASCADE'
});
};
return Room;
};
24 changes: 24 additions & 0 deletions src/database/seeders/20190821112700-users.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,30 @@ module.exports = {
dob: '2012-09-10',
status: 'unverified',
role: 'staff'
},
{
id: '91542e6f-94bc-4e80-a667-586fb3752f69',
companyId: 'a6e35eb9-8c59-4c7d-b8d4-ae724aa7fb61',
firstName: 'Travel',
lastName: 'Admin',
email: 'travel.admin@gmail.com',
password: hashHelper.hashPassword('password2019'),
gender: 'male',
dob: '2012-09-10',
status: 'active',
role: 'travel admin'
},
{
id: '91542e6f-94bc-4e81-a667-586fb0752f25',
companyId: 'a6e35eb9-8c59-4c7d-b8d4-ae724aa7fb62',
firstName: 'Banshee',
lastName: 'Travel',
email: 'banshee.admin@gmail.com',
password: hashHelper.hashPassword('password2019'),
gender: 'male',
dob: '2012-09-10',
status: 'active',
role: 'travel admin'
}
]),
down: queryInterface => queryInterface.bulkDelete('Users', null, {})
Expand Down
5 changes: 5 additions & 0 deletions src/database/seeders/20190829125545-create-branches.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,11 @@ module.exports = {
id: '3dd3b34a-7553-455e-a688-36afda199614',
name: 'Calabar South',
locationId: '0190ae78-d184-4258-add5-0b2c6982efef'
},
{
id: '3dd3b34a-7554-455e-a688-36afda199159',
name: 'Ibadan',
locationId: '0190ae78-d184-4258-add5-0b2c6982efef'
}
]),
down: queryInterface => queryInterface.bulkDelete('Branches', null, {})
Expand Down
17 changes: 15 additions & 2 deletions src/database/seeders/20190829130100-create-accomodations.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,27 @@ module.exports = {
name: 'Johnny Hills Palace',
branchId: '3dd3b34a-7554-425e-a688-36afda199614',
capacity: 40,
status: 'available'
status: 'available',
imgurl: 'https://res.cloudinary.com/tvpeter/image/upload/v1567651493/hotel2_p5ator.jpg',
address: '12 Allen Avenue, Ikeja'
},
{
id: '3dd3b34a-7554-425e-c688-36afda199619',
name: 'Martinez Guest Inn',
branchId: '3dd3b34a-7554-455e-a688-36afda199624',
capacity: 20,
status: 'filled'
status: 'filled',
imgurl: 'https://res.cloudinary.com/tvpeter/image/upload/v1567651493/hotel_onnio1.jpg',
address: '20 Kenny Johns Drive, Gwagwalada'
},
{
id: '3dd4b34a-7554-495e-c688-36afda987837',
name: 'Rocktop Guest House',
branchId: '3dd3b34a-7554-455e-a688-36afda199159',
capacity: 12,
status: 'available',
imgurl: 'https://res.cloudinary.com/tvpeter/image/upload/v1567651493/hotel_onnio1.jpg',
address: '20 Kenny Johns Drive, Abuja'
}
]),
down: queryInterface => queryInterface.bulkDelete('Accomodations', null, {})
Expand Down
29 changes: 29 additions & 0 deletions src/database/seeders/20190905025030-rooms.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
module.exports = {
up: (queryInterface) => queryInterface.bulkInsert('Rooms', [
{
id: '3dd3b34a-1254-495e-a688-36afda199619',
name: 'Room 1',
type: 'Executive Room',
accomodationId: '3dd3b34a-7554-425e-a688-36afda199619',
},
{
id: '3dd3b34a-1254-495e-a688-36afda133619',
name: 'Room 2',
type: 'Single Room',
accomodationId: '3dd3b34a-7554-425e-c688-36afda199619',
},
{
id: '6dd3b34a-1254-495e-a628-36afda133919',
name: 'Room 3',
type: 'King Room',
accomodationId: '3dd3b34a-7554-425e-c688-36afda199619',
},
{
id: '3dd3b34a-4454-495e-a688-36afda903619',
name: 'Room 4',
type: 'Single Room',
accomodationId: '3dd3b34a-7554-425e-a688-36afda199619',
}
]),
down: queryInterface => queryInterface.bulkDelete('Rooms', null, {})
};
17 changes: 17 additions & 0 deletions src/routes/accomodation.routes.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Router } from 'express';
import Token from '../helpers/Token';
import AccomodationController from '../controllers/Accomodation';
import validator from '../middlewares/validator';
import { createAccomodation, addRoom } from '../validation/accomodationSchema';
import upload from '../utils/upload';

const accomodationRoutes = Router();

accomodationRoutes.post('/create',
Token.verifyAdminToken('travel admin'), upload.single('imgurl'), validator(createAccomodation), AccomodationController.createAccomodation);

accomodationRoutes.post('/addroom',
Token.verifyAdminToken('travel admin'), validator(addRoom), AccomodationController.addRoom);


export default accomodationRoutes;
2 changes: 2 additions & 0 deletions src/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import tripRoute from './trip.routes';
import profileRoute from './profile.routes';
import adminRoute from './admin.routes';
import feedbackRoute from './feedback.routes';
import accomodationRoutes from './accomodation.routes';

const router = Router();

Expand All @@ -12,5 +13,6 @@ router.use('/trips', tripRoute);
router.use(profileRoute);
router.use('/user', adminRoute);
router.use('/accomodation', feedbackRoute);
router.use('/admin/accomodation', accomodationRoutes);

export default router;
26 changes: 26 additions & 0 deletions src/utils/upload.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import multer from 'multer';

const storage = multer.diskStorage({
filename: (req, file, cb) => {
cb(null, Date.now() + file.originalname);
}
});

const fileFilter = (req, file, cb) => {
if (
file.mimetype === 'image/jpg'
|| file.mimetype === 'image/png'
|| file.mimetype === 'image/jpeg'
) {
cb(null, true);
}
cb(null, false);
};

const upload = multer({
storage,
fileFilter,
limits: { fileSize: 500000 },
});

export default upload;
Loading

0 comments on commit c3dd483

Please sign in to comment.