From dcdce86844eec7ca1d385ba4ec42afa0cfdabf21 Mon Sep 17 00:00:00 2001 From: Macheza Dzabala Date: Fri, 15 Nov 2019 11:14:42 +0200 Subject: [PATCH] - A user can now search by rating [finishes #169731201] --- src/controllers/searchController.js | 21 +++++++++++++++++++-- src/helpers/ratingsHelper.js | 4 +++- src/middlewares/verifySearchKeys.js | 6 ++++-- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/controllers/searchController.js b/src/controllers/searchController.js index 12921a8a..d3a34bc9 100644 --- a/src/controllers/searchController.js +++ b/src/controllers/searchController.js @@ -1,20 +1,37 @@ +/* eslint-disable max-len */ +/* eslint-disable eqeqeq */ import accommodationServices from '../services/accommodationServices'; import responseHelper from '../utils/responseHelper'; import searchQuery from '../utils/db/queries/accommodationSearchQuery'; +import { getRatings } from '../helpers/ratingsHelper'; export default class SearchController { + static accommodations = async (req, res) => { - const { query } = req; + const applyRatings = async (accommodations, userId) => ( + Promise.all(accommodations.map(async accommodation => { + const rated = await getRatings(accommodation, userId); + return rated; + })) + ); + + const { query, user: { payload: { id } } } = req; try { - const accommodations = await accommodationServices.findAccommodations(searchQuery(query)); + const unrated = await accommodationServices.findAccommodations(searchQuery(query)); + + let accommodations = await applyRatings(unrated, id); if (accommodations.length === 0) { return responseHelper(res, 'No accommodations matching this criteria were found.', accommodations, 404); } + if (query.rating) { + accommodations = accommodations.filter(accommodation => accommodation.dataValues.averageRating == query.rating); + } + return responseHelper(res, 'Accommodations', accommodations, 200); } catch (error) { return responseHelper(res, 'Something went wrong', error.message, 500); diff --git a/src/helpers/ratingsHelper.js b/src/helpers/ratingsHelper.js index e2c5534b..47fb1142 100644 --- a/src/helpers/ratingsHelper.js +++ b/src/helpers/ratingsHelper.js @@ -1,6 +1,8 @@ +/* eslint-disable no-restricted-globals */ /* eslint-disable import/prefer-default-export */ /* eslint-disable indent */ /* eslint-disable max-len */ + export const getRatings = async (accommodation, userId) => { if (accommodation) { @@ -12,7 +14,7 @@ export const getRatings = async (accommodation, userId) => { const averageRating = summation / ratings.length; accommodation.dataValues.hasRated = hasRated; accommodation.dataValues.hasBookmarked = hasBookmarked; - accommodation.dataValues.averageRating = averageRating; + accommodation.dataValues.averageRating = (!isNaN(averageRating) ? averageRating : 0); accommodation.dataValues.ratings = ratings; } diff --git a/src/middlewares/verifySearchKeys.js b/src/middlewares/verifySearchKeys.js index a38feacf..5487f76f 100644 --- a/src/middlewares/verifySearchKeys.js +++ b/src/middlewares/verifySearchKeys.js @@ -14,7 +14,8 @@ export default (req, res, next) => { || key === 'name' || key === 'description' || key === 'highlights' - || key === 'amenities') { + || key === 'amenities' + || key === 'rating') { return true; } return false; @@ -30,7 +31,8 @@ export default (req, res, next) => { || query.name === '' || query.description === '' || query.highlights === '' - || query.amenities === '') { + || query.amenities === '' + || query.rating === '') { return responseHelper(res, 'Search keys cannot be null', null, 400); }