Skip to content
Open
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
48 changes: 12 additions & 36 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,39 +1,15 @@
# Project Name
- Reviews Module
> Project description

## Related Projects

- https://github.com/FEC-5-Open-Table/Overview
- https://github.com/FEC-5-Open-Table/Photos
- https://github.com/FEC-5-Open-Table/Menu
- https://github.com/FEC-5-Open-Table/Reviews

## Table of Contents

1. [Usage](#Usage)
1. [Requirements](#requirements)
1. [Development](#development)

## Usage

> Some usage instructions

## Requirements

An `nvmrc` file is included if using [nvm](https://github.com/creationix/nvm).

- Node 6.13.0
- etc

## Development

### Installing Dependencies

From within the root directory:

```sh
npm install -g webpack
npm install
```

## API Documentation
- CREATE
- CREATE restaurant record by id: '/restaurant/add/:name/:area/:menuitemlovedfor'
- READ
- READ restaurant reviews by id: '/restaurant/:id/reviews'
- READ restaurant filter keywords by id: '/restaurant/:id/filterKeywords'
- READ restaurant "LovedFor" by id: '/restaurant/:id/LovedFor'
- READ restaurant info by id: '/restaurant/:id/info'
- UPDATE
- UPDATE restaurant helpfulness score: '/restaurant/:is_helpful/id/:id/helpfulEvent'
- DELETE
- DELETE restaurant by id: '/restaurant/remove/:id'
1 change: 0 additions & 1 deletion client/components/Review.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,6 @@ class Review extends React.Component {
if (!readMoreClicked && review.reviewText.length < 200) readMorePhrase = '';
const reviewPluralCase = (review.userReviewCount === 1 ? 'review' : 'reviews');
const initials = review.userName.split(' ')[0][0] + review.userName.split(' ')[1][0];

return (
<div id="reviewContainer">
{reportPopUp}
Expand Down
14 changes: 8 additions & 6 deletions client/components/app.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,12 @@ class App extends React.Component {
if (r === 4) fourStarCount++;
if (r === 5) fiveStarCount++;
}
const counts = [fiveStarCount, fourStarCount, threeStarCount, twoStarCount, oneStarCount]
const counts = [fiveStarCount, fourStarCount, threeStarCount, twoStarCount, oneStarCount];
this.setState({ percentages: counts.map(count => Math.round(count / allReviews.length * 100) + '%') })
}

pullDataById(id) {
axios.get(`http://ec2-34-207-216-56.compute-1.amazonaws.com/restaurant/${id}/reviews`)
axios.get(`api/restaurant/${id}/reviews`)
.then((res) => {
this.setState({
reviews: res.data.slice(0, 20),
Expand All @@ -110,23 +110,23 @@ class App extends React.Component {
}

pullRestaurantInfoById(id) {
axios.get(`http://ec2-34-207-216-56.compute-1.amazonaws.com/restaurant/${id}/info`)
axios.get(`api/restaurant/${id}/info`)
.then((res) => {
this.setState({ restaurantInfo: res.data });
})
.catch(err => console.error(err));
}

pullKeywordsById(id) {
axios.get(`http://ec2-34-207-216-56.compute-1.amazonaws.com/restaurant/${id}/filterKeywords`)
axios.get(`api/restaurant/${id}/filterKeywords`)
.then((res) => {
this.setState({ keyWords: res.data });
})
.catch(err => console.log(err));
}

pullMenuItemsById(id) {
axios.get(`http://ec2-34-207-216-56.compute-1.amazonaws.com/restaurant/${id}/LovedFor`)
axios.get(`api/restaurant/${id}/lovedFor`)
.then((res) => {
this.setState({ lovedFor: res.data });
})
Expand Down Expand Up @@ -196,7 +196,9 @@ class App extends React.Component {
}

scrollToTopOfFeed() {
document.getElementById('reviewContainer').scrollIntoView({ behavior: 'smooth' });
if (document.getElementById('reviewContainer')) {
document.getElementById('reviewContainer').scrollIntoView({ behavior: 'smooth' });
}
}

render() {
Expand Down
1 change: 0 additions & 1 deletion client/index.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import App from './components/app.jsx';

window.Reviews = App;

19 changes: 14 additions & 5 deletions database/db.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
require('dotenv').config();
// uncomment for Docker deployment
// require('dotenv').config();
const mysql = require('mysql');

// uncomment this for Docker deployment (and comment out lines 13-18)
// const con = mysql.createConnection({
// host: process.env.DB_HOST,
// user: process.env.DB_USER,
// password: process.env.DB_PASS,
// database: process.env.DB_DATABASE,
// });

const con = mysql.createConnection({
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASS,
database: process.env.DB_DATABASE,
host: 'localhost',
user: 'root',
password: '',
database: 'reviews',
});

const pullFromDB = (query, cb) => {
Expand Down
38 changes: 38 additions & 0 deletions generators/cassandra-schema.cql
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
DROP KEYSPACE reviews;

CREATE KEYSPACE reviews WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1 };

CREATE TABLE restaurant (id text PRIMARY KEY,restaurantname text,restaurantarea text);

CREATE TABLE filters (id text PRIMARY KEY,filterkeyword text,rest_id text);

CREATE TABLE lovedfor (id text PRIMARY KEY,menuitem text,rest_id text);

CREATE TABLE reviews (id text PRIMARY KEY,username text,userphoto text,userarea text,reviewtext text,is_recommended text,dineddate text,overallrating text,foodrating text,servicerating text,ambiancerating text,valuerating text,noise text,userreviewcount text,rest_id text);

-- COPY restaurant (id, restaurantname, restaurantarea) FROM '/data/listings.csv' WITH HEADER = TRUE;

-- COPY filters (id,filterkeyword,rest_id) FROM '/data/all-filters.csv' WITH HEADER = TRUE;

-- COPY lovedfor (id,menuitem,rest_id) FROM '/data/all-items.csv' WITH HEADER = TRUE;

-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/a-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/b-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/c-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/d-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/e-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/f-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/g-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/h-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/i-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/j-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/k-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/l-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/m-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/n-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/o-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/p-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/q-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/r-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/s-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
-- copy reviews (id,username,userphoto,userarea,reviewtext,is_recommended,dineddate,overallrating,foodrating,servicedating,ambiancerating,valuerating,noise,userreviewcount,rest_id) FROM '/data/t-reviews.csv' DELIMITER ',' CSV HEADER QUOTE '"';
70 changes: 70 additions & 0 deletions generators/data-generator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
const fs = require('fs');
const faker = require('faker');

const ratingOptions = [1, 2, 3, 4, 5];
const trueFalseOptions = [0, 1];
const noiseOptions = [0, 1, 2];

const listRandomizer = (list) => {
const i = Math.floor(Math.random() * list.length);
return list[i];
};

fs.readFile('./names.csv', 'utf8', (err, data) => {
if (err) {
throw err;
}
const restaurantNames = data.split(/\r\n|\n/);
let restaurantId = 1;
console.log('id,restaurantName,restaurantArea');
while (restaurantId < 10000001) {
const restaurantName = restaurantNames[restaurantId - 1];
const restaurantArea = faker.address.county();
console.log(`${restaurantId},${restaurantName},${restaurantArea}`);
restaurantId += 1;
}
restaurantId = 1;
let filterId = 1;
console.log('id,filterKeyword,rest_id');
while (restaurantId < 10000001) {
const filterKeyWordCount = Math.random() * 5;
for (let j = 0; j < filterKeyWordCount; j += 1) {
const filterKeyWord = faker.lorem.paragraph().split(' ')[2];
console.log(`${filterId},${filterKeyWord},${restaurantId}`);
filterId += 1;
}
restaurantId += 1;
}
restaurantId = 1;
let lovedForId = 1;
console.log('id,menuItem,rest_id');
while (restaurantId < 10000001) {
const lovedForCount = Math.random() * 20;
for (let j = 0; j < lovedForCount; j += 1) {
const menuItem = faker.lorem.paragraph().split(' ')[2];
console.log(`${lovedForId},${menuItem},${restaurantId}`);
lovedForId += 1;
}
restaurantId += 1;
}
restaurantId = 1;
let reviewId = 1;
console.log('id,userName,userPhoto,userArea,reviewText,is_recommended,dinedDate,overallRating,foodRating,serviceRating,ambianceRating,valueRating,noise,userReviewCount,rest_id');
while (restaurantId < 10000001) {
const reviewCount = Math.random() * 20;
for (let j = 0; j < reviewCount; j += 1) {
const randUserName = faker.name.findName();
const randuserPhoto = `${faker.internet.avatar()} `;
const randuserArea = faker.address.city();
const randreviewText = faker.lorem.paragraphs();
const randRecommended = listRandomizer(trueFalseOptions);
let randDate = (faker.date()).toISOString().substring(0, 10);
const randRating = [listRandomizer(ratingOptions), listRandomizer(ratingOptions), listRandomizer(ratingOptions), listRandomizer(ratingOptions), listRandomizer(ratingOptions)];
const randNoise = listRandomizer(noiseOptions);
const randUserReviewCount = Math.floor(Math.random() * 50);
console.log(`${reviewId}, ${randUserName}, ${randuserPhoto}, ${randuserArea}, ${randreviewText}, ${randRecommended}, ${randDate}, ${randRating[0]}, ${randRating[1]}, ${randRating[2]}, ${randRating[3]}, ${randRating[4]}, ${randNoise}, ${randUserReviewCount}, ${restaurantId}`);
reviewId += 1;
}
restaurantId += 1;
}
});
14 changes: 14 additions & 0 deletions generators/filter-generator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const faker = require('faker');

let restaurantId = 5633227;
let filterId = 16903239;
console.log('id,filterKeyword,rest_id');
while (restaurantId < 10000001) {
const filterKeyWordCount = Math.random() * 5;
for (let j = 0; j < filterKeyWordCount; j += 1) {
const filterKeyWord = faker.lorem.paragraph().split(' ')[2];
console.log(`${filterId},${filterKeyWord},${restaurantId}`);
filterId += 1;
}
restaurantId += 1;
}
14 changes: 14 additions & 0 deletions generators/item-generator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const faker = require('faker');

let restaurantId = 9000001;
let lovedForId = 94498395;
console.log('id,menuItem,rest_id');
while (restaurantId < 10000001) {
const lovedForCount = Math.random() * 20;
for (let j = 0; j < lovedForCount; j += 1) {
const menuItem = faker.lorem.paragraph().split(' ')[2];
console.log(`${lovedForId},${menuItem},${restaurantId}`);
lovedForId += 1;
}
restaurantId += 1;
}
17 changes: 17 additions & 0 deletions generators/listing-generator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const fs = require('fs');
const faker = require('faker');

fs.readFile('./names.csv', 'utf8', (err, data) => {
if (err) {
throw err;
}
const restaurantNames = data.split(/\r\n|\n/);
let restaurantId = 1;
console.log('id,restaurantName,restaurantArea');
while (restaurantId < 10000001) {
const restaurantName = restaurantNames[restaurantId - 1];
const restaurantArea = faker.address.county();
console.log(`${restaurantId},${restaurantName},${restaurantArea}`);
restaurantId += 1;
}
});
30 changes: 30 additions & 0 deletions generators/name-generator.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
const fs = require('fs');

const addNames = (words, first, i, count) => {
words.forEach((word, index) => {
if (index !== i) {
let second = word.split('');
second[0] = second[0].toUpperCase();
second = second.join('');
const name = `${first} ${second}`;
count += 1;
if (count < 10000001) console.log(name);
}
});
};

fs.readFile('../english-words/words_alpha.txt', 'utf8', (err, data) => {
if (err) {
throw err;
}
const words = data.split(/\r\n|\n/);
let i = 1;
let count = 1;
while (i < 29) {
let first = words[i].split('');
first[0] = first[0].toUpperCase();
first = first.join('');
addNames(words, first, i, count);
i += 1;
}
});
Loading