From b354e1c8062d5ecdb3eb9237815f890776cfe1e7 Mon Sep 17 00:00:00 2001 From: Frikkha Date: Wed, 8 Jan 2020 01:15:45 +0100 Subject: [PATCH] Fixed customerInfoUpdate, storeStatistics and caluclate rating on approved reivews, not when posting a review. Maybe some other things, i don't recall what i have done anymore:) --- middleware/updateRatingMiddleware.js | 18 ++++++----- models/itemReview.js | 3 ++ routes/createReview.js | 5 --- routes/manageCustomerInformation.js | 9 ++++-- routes/manageCustomerReviews.js | 2 -- routes/pendingReviews.js | 46 ++++++++++++++++++++-------- routes/searchByMenuItem.js | 45 ++++++++++++++++++++++++++- validationSchemas.js | 2 +- 8 files changed, 99 insertions(+), 31 deletions(-) diff --git a/middleware/updateRatingMiddleware.js b/middleware/updateRatingMiddleware.js index 0be0f019..1779f8c5 100644 --- a/middleware/updateRatingMiddleware.js +++ b/middleware/updateRatingMiddleware.js @@ -3,6 +3,9 @@ const MenuItem = require('../models/menuItem.js'); const ItemReview = require('../models/itemReview.js'); const MenuReview = require('../models/menuReview.js'); +const Sequelize = require('sequelize'); +const Op = Sequelize.Op; + // Input is: // List of menuItems that have a new review, or have had a review deleted. // The menu that is modified. @@ -14,17 +17,16 @@ module.exports = async (menuItems, menu) => { menuItems = await Promise.all(menuItems); menuItems = await menuItems.map(async mi => { - // TODO: This should only return ItemReviews with status "Approved" - // [Op.and]: [{MI_ID: mi.menuItemID}, {Status: 'Approved'}] + //This should only return ItemReviews with status "Approved" const reviews = await ItemReview.findAll({ attributes: ['ItemRating'], where: { - MI_ID: mi.menuItemID + [Op.and]: [{MI_ID: mi.menuItemID}, {Status: 'Approved'}] } }); let rating = await averageRating(reviews, 'ItemRating'); - //Update Rating-attribute for MenuItem. + //Update Rating-attribute for MenuItem await MenuItem.update({ Rating: rating }, @@ -35,7 +37,7 @@ module.exports = async (menuItems, menu) => { }); return reviews; }); - console.log('Finished with updating modified Items.'); + //Finished with updating modified Items let menuItemRatings = await MenuItem.findAll({ attributes: ['Rating'], @@ -52,15 +54,17 @@ module.exports = async (menuItems, menu) => { } let menuItemsRating = await averageRating(mir, 'Rating'); + + // Find the new ratings of the Menu // TODO: This should only return approved reviews. - // [Op.and]: [{Menu_ID: menu.Menu_ID}, {Status: 'Approved'}] let menuReviews = await MenuReview.findAll({ attributes: ['ServiceRating', 'QualityRating'], where: { - Menu_ID: menu.Menu_ID + [Op.and]: [{Menu_ID: menu.Menu_ID}, {Status: 'Approved'}] } }); + let serviceRating = averageRating(menuReviews, 'ServiceRating'); let qualityRating = averageRating(menuReviews, 'QualityRating'); let menuRating = await computeMenuRating(qualityRating, serviceRating, menuItemsRating, menuReviews.length, menuItems.length); diff --git a/models/itemReview.js b/models/itemReview.js index ceeae36d..8d875e48 100644 --- a/models/itemReview.js +++ b/models/itemReview.js @@ -24,6 +24,9 @@ const ItemReview = db.define('ItemReview', { }, MenuReview_ID: { type: Sequelize.INTEGER + }, + Status: { + type: Sequelize.STRING } }, { diff --git a/routes/createReview.js b/routes/createReview.js index ebab2429..96b7492c 100644 --- a/routes/createReview.js +++ b/routes/createReview.js @@ -67,11 +67,6 @@ router.post('/menu/:menuID', auth, isCustomer, async (req, res) => { MenuReview_ID: menuReviewID }) } - // TODO: Delete this!!! Move to ownerApproveReview - // Update ratings for Menu and MenuItems that are affected of this adding. - - const addedToMenu = {Menu_ID: menuID}; - await updateRating(itemReviews, addedToMenu); res.status(201).send('Successful operation'); }catch (error) { diff --git a/routes/manageCustomerInformation.js b/routes/manageCustomerInformation.js index 9e661da5..987c8424 100644 --- a/routes/manageCustomerInformation.js +++ b/routes/manageCustomerInformation.js @@ -11,7 +11,7 @@ const isCustomer = require('../middleware/checkIfCustomerMiddleware.js'); const Customer = require('../models/customer.js'); //These are needed for checking the the nationality of a customer. -const {getNames} = require('country-list'); +const {getNames, getCode} = require('country-list'); nationalities = getNames(); @@ -87,12 +87,17 @@ router.put('/', auth, isCustomer, async (req, res) => { Username: req.username } }); + let nationalityName = customerModified[0].dataValues.Nationality; + let nationalityCode = getCode(nationalityName); res.status(200).send({ email: customerModified[0].dataValues.Email, gender: customerModified[0].dataValues.Gender, ageRange: customerModified[0].dataValues.AgeRange, - nationality: customerModified[0].dataValues.Nationality + nationality: { + nationalityName, + nationalityCode + } }); } catch (error) { console.log(error); diff --git a/routes/manageCustomerReviews.js b/routes/manageCustomerReviews.js index 74ca7a54..24fee252 100644 --- a/routes/manageCustomerReviews.js +++ b/routes/manageCustomerReviews.js @@ -75,8 +75,6 @@ router.get('/', auth, isCustomer , async (req, res) => { // Delete a specific menuReview of a customer, with all its associated itemReviews router.delete('/:reviewID', auth, isCustomer, async (req, res) => { try { - //TODO: Validate input - //check if the review with given reviewID exist const reviewFound = await MenuReview.findOne({ where: { Review_ID: req.params.reviewID diff --git a/routes/pendingReviews.js b/routes/pendingReviews.js index 6571b3e1..7e897111 100644 --- a/routes/pendingReviews.js +++ b/routes/pendingReviews.js @@ -11,6 +11,7 @@ const updateRating = require('../middleware/updateRatingMiddleware.js'); const Restaurant = require('../models/restaurant.js'); const Menu = require('../models/menu.js'); const MenuReview = require('../models/menuReview.js'); +const ItemReview = require('../models/itemReview.js'); const MenuItem = require('../models/menuItem.js'); @@ -26,7 +27,7 @@ router.get('/', auth, isOwner, findRestaurant, async (req, res) => { // console.log('In GET /api/user/owner/restaurant/review') try { - const username=req.username; + const username = req.username; const reviews = await MenuReview.findAll({ where: { @@ -58,9 +59,9 @@ router.get('/', auth, isOwner, findRestaurant, async (req, res) => { //Approve or disapprove pending review router.post('/:reviewID', auth, isOwner, findRestaurant, async (req, res) => { try { - const username=req.username; - const reviewID=req.params.reviewID; - const status=req.body.isApproved? 'Approved' : 'Disapproved'; + const username = req.username; + const reviewID = req.params.reviewID; + const status = req.body.isApproved? 'Approved' : 'Disapproved'; //check if the review is regarding to logged in owner's restaurant const ownerReviewCheck= await MenuReview.findOne({ @@ -78,8 +79,8 @@ router.post('/:reviewID', auth, isOwner, findRestaurant, async (req, res) => { if(!ownerReviewCheck) res.status(404).send('Review with given reviewID not found'); - const reviewRestaurantOwner=ownerReviewCheck.Menu.Restaurant.Owner; - if(reviewRestaurantOwner!=username) res.status(403).send('Forbidden request'); + const reviewRestaurantOwner = ownerReviewCheck.Menu.Restaurant.Owner; + if(reviewRestaurantOwner != username) res.status(403).send('Forbidden request'); await MenuReview.update({ Status: status}, @@ -88,13 +89,32 @@ router.post('/:reviewID', auth, isOwner, findRestaurant, async (req, res) => { Review_ID: reviewID } }); - /* + + let itemReviews = await ItemReview.findAll({ + attributes: ['MI_ID', 'Review_ID'], + where: { + MenuReview_ID: ownerReviewCheck.Review_ID + } + }); + console.log('itemreviews[0]: ' + itemReviews[0]); + for (let i = 0; i < itemReviews.length; i++) { + await ItemReview.update({ + Status: status + }, + { + where: { + Review_ID: itemReviews[i].Review_ID + } + }) + } + itemReviews = await itemReviews.map(async r => { + return {menuItemID: r.MI_ID} + }); + if (status === APPROVED) { - // const menuID = {Menu_ID: ownerReviewCheck.Menu_ID} - // Also find every itemReview associated to the current menuReview - // await updateRating(itemReviews, menuID) + const menuID = {Menu_ID: ownerReviewCheck.Menu_ID} + await updateRating(itemReviews, menuID) } - */ //get pending reviews const reviews = await MenuReview.findAll({ @@ -113,14 +133,14 @@ router.post('/:reviewID', auth, isOwner, findRestaurant, async (req, res) => { model: MenuItem }] }] - }) + }); //build response let response = formatReviews(reviews); res.status(201).send(response); }catch (error) { - res.status(500).send('Internal server error'); + res.status(500).send(error); } }); diff --git a/routes/searchByMenuItem.js b/routes/searchByMenuItem.js index e6b17dd0..ddc339f0 100644 --- a/routes/searchByMenuItem.js +++ b/routes/searchByMenuItem.js @@ -8,17 +8,29 @@ const MenuItem = require('../models/menuItem.js'); const Restaurant = require('../models/restaurants.js'); const TaggedMenu = require('../models/taggedMenu.js'); const Tag = require('../models/tag.js'); +const Customer = require('../models/customer.js'); +const Search = require('../models/search.js'); + + +const jwt = require('jsonwebtoken'); +const config = require('config'); const Sequelize = require('sequelize'); const Op = Sequelize.Op; router.get('/', async (req, res) => { try { + const token = req.header('x-auth-token'); + let username = null; + if (token) { + username = jwt.verify(token, config.get('jwtPrivateKey')).username; + } + const searchWord = req.query.menuItemName; let matchingItems; matchingItems = await MenuItem.findAll({ attributes: ['Name', 'Menu_ID'], where: { - Name: {[Op.iLike]: '%'+ req.query.menuItemName + '%'} + Name: {[Op.iLike]: '%'+ searchWord+ '%'} } }); if (matchingItems.length < 1) { @@ -63,15 +75,46 @@ router.get('/', async (req, res) => { }; return menuInfo; }); + // Update the statistics + await storeSearch(username, searchWord); const result = await Promise.all(promises); + + res.status(200).send(result); } catch (error) { res.status(500).send('Internal server error.'); } }); +const storeSearch = async (username, searchWord) => { + const searchedFor = await Search.findOne({ + where: { + [Op.and]: [{SearchedWord: searchWord}, {Username: username}] + } + }); + + if (searchedFor == null) { + const search = await Search.create({ + Username: username, + SearchedWord: searchWord, + NumberOfSearches: 1 + }) + } else { + let count = searchedFor.NumberOfSearches + 1; + const search = await Search.update ({ + NumberOfSearches: count + }, + { + where: { + [Op.and]: [{SearchedWord: searchWord}, {Username: username}] + } + } + ) + } +}; + const formatTags = (arr) => { for (let i = 0; i < arr.length; i++){ arr[i] = { diff --git a/validationSchemas.js b/validationSchemas.js index 3eafe6ed..fbe0710c 100644 --- a/validationSchemas.js +++ b/validationSchemas.js @@ -60,7 +60,7 @@ const schemas = { }), //Change the password of the owner changeOwnerPassword: Joi.object().keys({ - oldPassword: Joi.strin().required(), + oldPassword: Joi.string().required(), newPassword: Joi.string().min(5).required(), })