Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

#170180280 Manager get all and specific user booking Requests #48

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions src/controllers/BookingController.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,5 +26,24 @@ class BookingController {
return Response.errorMessage(req, res, 'Server error', 500);
}
}

/**
* Manager can get specific or all booking requests
* @static
* @description GET /api/trips/booking
* @param {object} req request object
* @param {object} res response object
* @memberof BookingController
* @returns {object} data
*/
static async getUserBookingRequests(req, res) {
try {
const result = await AccommodationService.getUserBookingReqService(req);
return result.length !== 0 ? Response.successMessage(req, res, 'User booking requests are retrieved successfully', result, 200)
: Response.errorMessage(req, res, 'No Booking request found', 404);
} catch (error) {
return Response.errorMessage(req, res, 'Server error', 500);
}
}
}
export default BookingController;
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
'use strict';
module.exports = {
up: (queryInterface, Sequelize) => {
return queryInterface.addColumn('bookings', 'userId', {
type: Sequelize.INTEGER
})
},
down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn('bookings', 'userId')
}
};
1 change: 1 addition & 0 deletions src/database/models/booking.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module.exports = (sequelize, DataTypes) => {
const booking = sequelize.define('booking', {
tripId: DataTypes.INTEGER,
roomId: DataTypes.INTEGER,
userId: DataTypes.INTEGER,
checkInDate: DataTypes.DATE,
checkOutDate: DataTypes.DATE
}, {});
Expand Down
8 changes: 7 additions & 1 deletion src/middlewares/AccommodationMiddleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@ class AccommodationMiddleware {
isAccommodationExist, allAvailRoom, isRoomBooked
} = serviceQueries;

const isOwnerOfTheTrip = await BookingService.isOwnerOftheTripService(req);

if (isOwnerOfTheTrip.length === 0) {
return Response.errorMessage(req, res, 'Sorry, You are not the owner of this trip request', 403);
}

const allAvailRoomId = allAvailRoom.map(i => i.id);
const isRoomExist = allAvailRoomId.includes(parseInt(roomId, 10));
if (!isRoomExist) {
Expand All @@ -51,7 +57,7 @@ class AccommodationMiddleware {
});

if (isBookable) {
return Response.errorMessage(req, res, 'Room booked by other client', 403);
return Response.errorMessage(req, res, 'Room booked by other client', 409);
}
if (!isAccommodationExist) {
return Response.errorMessage(req, res, 'Sorry, the destination of your trip request does not have available accommodation', 404);
Expand Down
1 change: 1 addition & 0 deletions src/middlewares/Validate.js
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,7 @@ class Validate {
const day = d.getDate();
const correctDate = new Date(year, month, day).toDateString();
return [
check('tripId', 'tripId should be an integer').isNumeric(),
check('roomId', 'roomId should be valid').isInt(),
check('checkInDate', 'Invalid Date(format: YYYY-MM-DD)').isAfter(correctDate),
check('checkOutDate', 'Invalid Date(format: YYYY-MM-DD)').isAfter(correctDate),
Expand Down
9 changes: 4 additions & 5 deletions src/middlewares/findUsers.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,11 +54,10 @@ export const commentAccess = async (req, res, next) => {
return Response.errorMessage(req, res, 'You should be either a requester or a manager', 403);
};
export const isManagerHasAccess = async (req, res, next) => {
const { id } = req.user;
const getRole = await users.findAll({ where: { roleId: 6, id } });
const [{ dataValues }] = getRole;
return dataValues.roleId !== 6
? Response.successMessage(req, res, 'You do not have access to perform this action as a manager', 403) : next();
const getRole = await users.findAll({ where: { roleId: req.user.roleId }, raw: true });
const [{ roleId }] = getRole;
return roleId !== 6
? Response.errorMessage(req, res, 'You do not have access to perform this action as a manager', 403) : next();
};

export const isManagerOwnsRequest = async (req, res, next) => {
Expand Down
47 changes: 47 additions & 0 deletions src/routes/api/bookingRoute.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import Validate from '../../middlewares/Validate';
import checkInputDataError from '../../middlewares/checkInputDataError';
import ValidateAccommodation from '../../middlewares/ValidateAccommodation';
import isUserVerified from '../../middlewares/isUserVerified';
import { isManagerHasAccess } from '../../middlewares/findUsers';

const { checkIfCheckInDateIsAsCheckOutDate } = ValidateAccommodation;
const bookingRouter = express.Router();
Expand Down Expand Up @@ -70,5 +71,51 @@ const { isTripFound, isRoomBooked } = Conflict;

bookingRouter.post('/:tripId/booking', verifyToken, isUserVerified, isTripFound, Validate.bookAccommodationRules(), checkInputDataError, checkIfCheckInDateIsAsCheckOutDate, isRoomBooked, AccommodationMiddleware.isAccommodationAvail, BookingController.bookAccommodation);

/**
* @swagger
*
* /trips/booking:
* get:
* summary: Manager can get all booking requests
* tags: [Booking]
* responses:
* "200":
* description: Ok
* "400":
* description: Bad request
* "404":
* description: Booking request not found
* "500":
* description: Server Error
*/

bookingRouter.get('/booking', verifyToken, isUserVerified, isManagerHasAccess, BookingController.getUserBookingRequests);
/**
* @swagger
*
* /trips/booking/{userId}:
* get:
* summary: Manager can get specific booking requests
* tags: [Booking]
* parameters:
* - name: userId
* in: path
* description: Please enter the valid user id
* required: false
* schema:
* type: integer
* responses:
* "200":
* description: Ok
* "400":
* description: Bad request
* "404":
* description: Booking request not found
* "500":
* description: Server Error
*/

bookingRouter.get('/booking/:userId', verifyToken, isUserVerified, isManagerHasAccess, BookingController.getUserBookingRequests);


export default bookingRouter;
82 changes: 73 additions & 9 deletions src/services/BookingService.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import {
trips, accommodations, rooms, booking
trips, accommodations, rooms, booking, tripRequests
} from '../database/models';
import CommonQueries from './CommonQueries';
import Response from '../helpers/Response';


/**
Expand All @@ -14,10 +15,11 @@ class BookingService {
* @static
* @description POST /api/trips/:tripId/booking
* @param {object} req request object
* @memberof CommentController
* @param {object} res response object
* @memberof BookingController
* @returns {object} data
*/
static async bookAccommodationService(req) {
static async bookAccommodationService(req, res) {
try {
const { tripId } = req.params;
const tripObj = {
Expand All @@ -29,29 +31,27 @@ class BookingService {
const accommodationObj = {
where: { cityId: destinationId }, raw: true
};
const isAccommodationExist = await CommonQueries.findOne(accommodations, accommodationObj);
const isAccommodationExist = await CommonQueries.findAll(accommodations, accommodationObj);

const roomObj = {
where: { accommodationId: isAccommodationExist.cityId },
where: { accommodationId: isAccommodationExist[0].id },
raw: true
};

const allAvailRoom = await CommonQueries.findAll(rooms, roomObj);

const allAvailRoomId = allAvailRoom.map(i => i.id);
const bookedRoomObj = {
where: { roomId: allAvailRoomId }, raw: true
};
const isRoomBooked = await CommonQueries.findAll(booking, bookedRoomObj);

return {
allAvailRoom,
isAccommodationExist,
getTrip,
isRoomBooked,
};
} catch (error) {
console.log('error', error);
return Response.errorMessage(req, res, error.message, 500);
}
}

Expand All @@ -60,20 +60,84 @@ class BookingService {
* @static
* @param {object} req request object
* @param {object} res response object
* @memberof CommentController
* @memberof BookingController
* @returns {object} data
*/
static async createAccommodationService(req) {
const { tripId } = req.params;
const { id } = req.user;
const { roomId, checkInDate, checkOutDate } = req.body;

const bookAccommodationObj = {
tripId,
userId: id,
roomId: parseInt(roomId, 10),
checkInDate: new Date(checkInDate),
checkOutDate: new Date(checkOutDate)

};
const result = await CommonQueries.create(booking, bookAccommodationObj);
return result;
}

/**
* As Manager can get all accommodation request made
* @static
* @param {object} req request object
* @param {object} res response object
* @memberof BookingController
* @returns {object} data
*/
static async getAllBookingReqService() {
const result = await CommonQueries.findAll(booking);
return result;
}

/**
* As Manager can get specific accommodation request made
* @static
* @param {object} req request object
* @param {object} res response object
* @memberof BookingController
* @returns {object} data
*/
static async getUserBookingReqService(req) {
const { userId } = req.params;
const findOneBookingObj = {
where: { userId }, raw: true
};

const result = !userId ? await CommonQueries.findAll(booking) : await CommonQueries.findAll(booking, findOneBookingObj);
return result;
}

/**
* Check If s/he is the owner of that trip s/he is booking an accommodation for
* @static
* @param {object} req request object
* @param {object} res response object
* @memberof BookingController
* @returns {object} data
*/
static async isOwnerOftheTripService(req) {
try {
const { tripId } = req.params;
const i = parseInt(tripId, 10);
const { id } = req.user;
const findOneBookingObj = {
where: { id: i },
include: [{
model: tripRequests,
where: { userId: id }
}],
raw: true
};
const result = await CommonQueries.findAll(trips, findOneBookingObj);

return result;
} catch (error) {
return Response.errorMessage(req, res, error.message, 500);
}
}
}
export default BookingService;
Loading