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 search Functionality
- Add trip search controller
- Add trip search query validation

[Finishes #167727339]
  • Loading branch information
joaquinto committed Sep 14, 2019
1 parent dd245a8 commit 4d59c7f
Show file tree
Hide file tree
Showing 23 changed files with 716 additions and 45 deletions.
2 changes: 1 addition & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
},
"rules": {
"one-var": 0,
"new-cap": 0,
"one-var-declaration-per-line": 0,
"new-cap": 0,
"consistent-return": 0,
"no-param-reassign": 0,
"comma-dangle": 0,
Expand Down
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');
}
};
16 changes: 12 additions & 4 deletions src/controllers/tripController.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {
postTrip, updateTripStatus, getRequesterEmail, bulkCreate,
getTripRequests, findOneTripRequest, rejectRequest, fetchUserTripStats, fetchTripStats, fetchTripRequests
postTrip, updateTripStatus, getRequesterEmail, bulkCreate, 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 @@ -59,7 +58,7 @@ export const multiCityTripRequest = async (req, res) => {
status: 'pending',
userId: id
};

const multiCityTrip = await postTrip(payload);
const multiCityRequests = subRequest.map(sub => ({
tripId: multiCityTrip.id,
Expand Down Expand Up @@ -212,4 +211,13 @@ export const retrieveTripRequest = async (req, res) => {
} catch(error) {
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'
}
}
}
}
};
Loading

0 comments on commit 4d59c7f

Please sign in to comment.