Skip to content

Commit

Permalink
feature(rate accommodation): Rate Accommodation
Browse files Browse the repository at this point in the history
- Add rating model
- Add rating migration
- Add rating services
- Add rating controller
- Add rating test
- Add rating documentation
- Add search Functionality
- Add trip search controller
- Add trip search query validation

[Finishes #167727339]
  • Loading branch information
joaquinto committed Sep 14, 2019
1 parent a414c93 commit b962c78
Show file tree
Hide file tree
Showing 23 changed files with 702 additions and 19 deletions.
22 changes: 22 additions & 0 deletions src/controllers/ratingController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { postAccommodationRating, getAccommodationRatings } from '../services/ratingServices';
import { respondWithSuccess, respondWithWarning } from '../helpers/responseHandler';
import statusCode from '../helpers/statusCode';

export const createAccommodationRating = async (req, res) => {
const payload = { accommodationId: req.params.accommodationId, rating: req.body.rating };
try {
const rating = await postAccommodationRating(payload);
return respondWithSuccess(res, statusCode.created, 'Accommodation has been rated successfuly', rating.toJSON());
} catch (error) {
return respondWithWarning(res, statusCode.internalServerError, 'Oops, something bad happened');
}
};

export const getSingleAccommodationRatings = async (req, res) => {
try {
const accommodationRatings = await getAccommodationRatings(req.params.accommodationId);
return !accommodationRatings.length ? respondWithWarning(res, statusCode.resourceNotFound, 'No ratings for this accommodation') : respondWithSuccess(res, statusCode.success, 'Accommodation ratings has been retrieved', accommodationRatings);
} catch (error) {
return respondWithWarning(res, statusCode.internalServerError, 'Oops, something bad happened');
}
};
14 changes: 12 additions & 2 deletions src/controllers/tripController.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import {
postTrip, updateTripStatus, getRequesterEmail, bulkCreate,
getTripRequests, findOneTripRequest, rejectRequest, fetchUserTripStats,
fetchTripStats, fetchTripRequests
getTripRequests, findOneTripRequest, rejectRequest, searchTripRequest,
fetchUserTripStats, fetchTripStats, fetchTripRequests
} from '../services/tripServices';
import { respondWithSuccess, respondWithWarning } from '../helpers/responseHandler';
import statusCode from '../helpers/statusCode';
Expand Down Expand Up @@ -206,3 +206,13 @@ export const retrieveTripRequest = async (req, res) => {
return respondWithWarning(res, statusCode.internalServerError, error.message);
}
};

export const searchTripRequests = async (req, res) => {
try {
const tripRequests = await searchTripRequest(req.query.key);
return !tripRequests.length ? respondWithWarning(res, statusCode.resourceNotFound, 'Trip request not found')
: respondWithSuccess(res, statusCode.success, 'Data has been retrieved successfully', tripRequests);
} catch (error) {
return respondWithWarning(res, statusCode.internalServerError, 'Oops something bad happened');
}
};
4 changes: 2 additions & 2 deletions src/database/migrations/20190829084157-create-trip-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,11 @@ export default {
allowNull: false,
},
departureDate: {
type: Sequelize.DATE,
type: Sequelize.STRING,
allowNull: false,
},
returnDate: {
type: Sequelize.DATE
type: Sequelize.STRING
},
type: {
type: Sequelize.STRING,
Expand Down
29 changes: 29 additions & 0 deletions src/database/migrations/20190912211238-create-rating.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
export default {
up: (queryInterface, Sequelize) => queryInterface.createTable('Ratings', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
accommodationId: {
type: Sequelize.INTEGER,
allowNull: false,
},
rating: {
type: Sequelize.INTEGER,
allowNull: false,
},
createdAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: new Date(),
},
updatedAt: {
allowNull: false,
type: Sequelize.DATE,
defaultValue: new Date(),
}
}),
down: (queryInterface) => queryInterface.dropTable('Ratings')
};
10 changes: 10 additions & 0 deletions src/docs/swagger/definitions/rating.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
export const accommodationRatingSchema = {
type: 'object',
properties: {
rating: {
type: 'integer',
format: 'int32',
example: 1,
}
}
};
133 changes: 133 additions & 0 deletions src/docs/swagger/paths/rating.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
export const accommodationRating = {
post: {
tags: [
'accommodations'
],
security: [
{
BearerToken: []
}
],
summary: 'Post ratings for a particular accommodation',
description: 'Post ratings for a particular accommodation',
parameters: [
{
name: 'accommodationId',
in: 'path',
description: 'path parameter takes the accommodation id',
required: true,
type: 'integer',
format: 'int32'
},
{
name: 'body',
in: 'body',
required: false,
schema: {
$ref: '#definitions/accommodationRatingSchema'
}
}
],
responses: {
201: {
description: 'Room successfully created',
schema: {
$ref: '#/definitions/createRoomRes'
}
},
400: {
description: 'Bad input data',
schema: {
$ref: '#/definitions/badRequest'
}
},
401: {
description: 'Incorrect login details',
schema: {
$ref: '#/definitions/notAuthorized'
}
},
403: {
description: 'Forbidden access',
schema: {
$ref: '#/definitions/accessForbidden'
}
},
404: {
description: 'Accommodation not found',
schema: {
$ref: '#/definitions/notFound'
}
},
500: {
description: 'Server error',
schema: {
$ref: '#/definitions/serverError'
}
}
}
}
};

export const getAccommodationRatings = {
get: {
tags: [
'accommodations'
],
security: [
{
BearerToken: []
}
],
summary: 'Post ratings for a particular accommodation',
description: 'Post ratings for a particular accommodation',
parameters: [
{
name: 'accommodationId',
in: 'path',
description: 'path parameter takes the accommodation id',
required: true,
type: 'integer',
format: 'int32'
}
],
responses: {
200: {
description: 'Ratings have been retrieved successfully',
schema: {
$ref: '#/definitions/success'
}
},
400: {
description: 'Bad input data',
schema: {
$ref: '#/definitions/badRequest'
}
},
401: {
description: 'Incorrect login details',
schema: {
$ref: '#/definitions/notAuthorized'
}
},
403: {
description: 'Forbidden access',
schema: {
$ref: '#/definitions/accessForbidden'
}
},
404: {
description: 'Accommodation not found',
schema: {
$ref: '#/definitions/notFound'
}
},
500: {
description: 'Server error',
schema: {
$ref: '#/definitions/serverError'
}
}
}
}
};
4 changes: 2 additions & 2 deletions src/docs/swagger/paths/socialAuth.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ const facebookPath = {
200: {
description: 'Login with a facebook account',
schema: {
$ref: '#/definitions/socialMedia'
$ref: '#/definitions/socialMediaAuthentication'

}
}
Expand All @@ -28,7 +28,7 @@ const googlePath = {
200: {
description: 'Login with a google account',
schema: {
$ref: '#/definitions/socialMedia'
$ref: '#/definitions/socialMediaAuthentication'

}
}
Expand Down
65 changes: 64 additions & 1 deletion src/docs/swagger/paths/trips.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@

export const requestTrip = {
post: {
tags: [
Expand Down Expand Up @@ -54,7 +55,7 @@ export const requestTrip = {
}
}
},

};

export const multiCityTripPath = {
Expand Down Expand Up @@ -422,3 +423,65 @@ export const getTripStatsPath = {
}
}
};

export const searchTripRequestPath = {
get: {
tags: [
'trips'
],
security: [
{
BearerToken: []
}
],
summary: 'Search for trips',
description: 'Search for trip requests',
parameters: [
{
name: 'key',
in: 'query',
description: 'Query parameter takes in the search query',
required: true,
type: 'string'
}
],
responses: {
200: {
description: 'Trip resquest has been approved',
schema: {
$ref: '#/definitions/success'
}
},
400: {
description: 'Invalid request details',
schema: {
$ref: '#/definitions/badRequest'
}
},
401: {
description: 'Unauthorized',
schema: {
$ref: '#/definitions/notAuthorized'
}
},
403: {
description: 'Access forbidden',
schema: {
$ref: '#/definitions/accessForbidden'
}
},
404: {
description: 'Trip not found',
schema: {
$ref: '#/definitions/notFound'
}
},
500: {
description: 'Server error',
schema: {
$ref: '#/definitions/serverError'
}
}
}
}
};
11 changes: 8 additions & 3 deletions src/docs/swagger/swagger.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ import {
verifyUserPath, fetchTripPath,
} from './paths/users';
import {
requestTrip, approvedTripPath, getTripPath, returnTrip, multiCityTripPath,
rejectTripPath, getTripStatsPath
requestTrip, approvedTripPath, getTripPath, returnTrip, multiCityTripPath, rejectTripPath, getTripStatsPath, searchTripRequestPath
} from './paths/trips';
import {
createTrip, returnTripSchema, createMultiCityTrip, multiCityTripRes,
Expand Down Expand Up @@ -56,6 +55,8 @@ import { markAllNotficationPath } from './paths/notification';
import { createChat } from './definitions/chat';
import { flightPath } from './paths/flight';
import { FlightCreate } from './definitions/flight';
import { accommodationRatingSchema } from './definitions/rating';
import { accommodationRating, getAccommodationRatings } from './paths/rating';

const swaggerDocument = {
swagger: '2.0',
Expand Down Expand Up @@ -112,7 +113,7 @@ const swaggerDocument = {
{
name: 'chats',
description: 'Chat related endpoints'
},
},
{
name: 'flights',
description: 'Flight related endpoints'
Expand Down Expand Up @@ -142,11 +143,14 @@ const swaggerDocument = {
'/trips/{tripId}/reject': rejectTripPath,
'/trips/{tripId}/comments': getTripCommentsPath,
'/trips/{tripId}/comments/{commentId}': deleteCommentPath,
'/trips/search/?key={key}': searchTripRequestPath,
'/trips/return': returnTrip,
'/trips/stats': getTripStatsPath,
'/accommodations': createAccommodationPath,
'/accommodations/rooms/{accommodationId}': createRoomPath,
'/accommodations/{accommodationId}': getAccommodationPath,
'/accommodations/{accommodationId}/rating': accommodationRating,
'/accommodations/{accommodationId}/ratings': getAccommodationRatings,
'/accommodations/trip/{tripId}': getTripAccommodationsPath,
'/accommodations/like/{accommodationId}': accommodationLike,
'/accommodations/trips/{tripId}': getTripAccommodationsPath,
Expand Down Expand Up @@ -196,6 +200,7 @@ const swaggerDocument = {
resetUserPassword,
updateRolePermissionsReq,
updateRolePermissionsRes,
accommodationRatingSchema,
rolesRes,
createTrip,
createComment,
Expand Down
2 changes: 1 addition & 1 deletion src/helpers/validator.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ export default {
password: Joi.string().required(),
email: Joi.string().email().required().trim(),
username: Joi.string().required().trim().min(3),
id: Joi.number().required(),
id: Joi.number().integer().required(),

// Profile validations
rememberMe: Joi.boolean(),
Expand Down
Loading

0 comments on commit b962c78

Please sign in to comment.