From cb4e56133cee1cb7b04eb19b9931180043535401 Mon Sep 17 00:00:00 2001 From: reaas <reaas@stud.ntnu.no> Date: Mon, 14 Oct 2019 12:04:17 +0200 Subject: [PATCH] Google Trends chart component is working as intended. Takes one argument, the movie title. It is not styled yet.. Ref. #22 --- client/package-lock.json | 18 ++++++++ client/package.json | 2 + client/src/components/InterestOverTime.js | 53 +++++++++++++++++++++++ server/package-lock.json | 5 +++ server/package.json | 1 + server/routes/movies.js | 24 ++++++++++ 6 files changed, 103 insertions(+) create mode 100644 client/src/components/InterestOverTime.js diff --git a/client/package-lock.json b/client/package-lock.json index 134f01c..b49672e 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -5815,6 +5815,11 @@ } } }, + "google-trends-api": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/google-trends-api/-/google-trends-api-4.9.0.tgz", + "integrity": "sha512-ujOLHM98bE7Igy8YA4Lrb5naDpaY1wGt215zgHXPznCDwHmMjMK1FW8yW//dHQ9CKyG/HzaNBDfF7jEAUk8Kkw==" + }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", @@ -10472,6 +10477,14 @@ "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.2.tgz", "integrity": "sha512-DHRuRk3K4Lg9obI6J4Y+nKvtwjasYRU9CFL3ud42x9YJG1HbQjSNublapC/WBJOA726gNUbqbj0U2df9+uzspQ==" }, + "react-google-charts": { + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/react-google-charts/-/react-google-charts-3.0.15.tgz", + "integrity": "sha512-78s5xOQOJvL+jIewrWQZEHtlVk+5Yh4zZy+ODA1on1o1FaRjKWXxoo4n4JQl1XuqkF/A9NWque3KqM6pMggjzQ==", + "requires": { + "react-load-script": "^0.0.6" + } + }, "react-is": { "version": "16.10.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.10.1.tgz", @@ -10482,6 +10495,11 @@ "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" }, + "react-load-script": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/react-load-script/-/react-load-script-0.0.6.tgz", + "integrity": "sha512-aRGxDGP9VoLxcsaYvKWIW+LRrMOzz2eEcubTS4NvQPPugjk2VvMhow0wWTkSl7RxookomD1MwcP4l5UStg5ShQ==" + }, "react-overlays": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-1.2.0.tgz", diff --git a/client/package.json b/client/package.json index 864fdae..b09a007 100644 --- a/client/package.json +++ b/client/package.json @@ -5,9 +5,11 @@ "dependencies": { "axios": "^0.19.0", "bootstrap": "^4.3.1", + "google-trends-api": "^4.9.0", "react": "^16.10.1", "react-bootstrap": "^1.0.0-beta.14", "react-dom": "^16.10.1", + "react-google-charts": "^3.0.15", "react-redux": "^7.1.1", "react-scripts": "3.1.2", "redux": "^4.0.4" diff --git a/client/src/components/InterestOverTime.js b/client/src/components/InterestOverTime.js new file mode 100644 index 0000000..a17b196 --- /dev/null +++ b/client/src/components/InterestOverTime.js @@ -0,0 +1,53 @@ +import React, { useState, useEffect } from 'react'; +import axios from 'axios'; +import { Chart } from 'react-google-charts'; + +/** + * Component to get and show the Google search trend over the last week. + * Param: title - movie title to search for + * return: the component HTML as an Area chart. + */ +const InterestOverTime = ({ title }) => { + const [currentTitle, setTitle] = useState(title); + const [chartData, setChartData] = useState(0); + + // Called each time a new title is passed to the component + useEffect(() => { + axios.get('/api/MovieTrend', { params: { Title: title }}) + .then(res => { + let data = JSON.parse(res.data.data); + + let tempData = []; + let tempTitles = ['Date', 'Interest']; + tempData.push(tempTitles); + + // Since the data recieved from Google is not on the form we want, + // some magic has to happen. Created the data structure that + // react-google-charts wants + data.default.timelineData.map(time => { + let tempValues = []; + tempValues.push(time.formattedTime); + tempValues.push(Number(time.formattedValue[0])); + tempData.push(tempValues); + }); + + setChartData(tempData); + }); + }, [title]); + + return( + <Chart + width={300} + height={300} + chartType="AreaChart" + loader={<div>Loading chart</div>} + data={chartData} + options={{ + title: title, + vAxis: { title: 'Interest over time' } + }} + /> + ) +} + +export default InterestOverTime; diff --git a/server/package-lock.json b/server/package-lock.json index f1df13b..6632d14 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -311,6 +311,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, + "google-trends-api": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/google-trends-api/-/google-trends-api-4.9.0.tgz", + "integrity": "sha512-ujOLHM98bE7Igy8YA4Lrb5naDpaY1wGt215zgHXPznCDwHmMjMK1FW8yW//dHQ9CKyG/HzaNBDfF7jEAUk8Kkw==" + }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", diff --git a/server/package.json b/server/package.json index 0b5d96f..aafcbc6 100644 --- a/server/package.json +++ b/server/package.json @@ -9,6 +9,7 @@ "cookie-parser": "~1.4.3", "debug": "~2.6.9", "express": "~4.16.0", + "google-trends-api": "^4.9.0", "http-errors": "~1.6.2", "jade": "~1.11.0", "mongoose": "^5.7.3", diff --git a/server/routes/movies.js b/server/routes/movies.js index 4bbbf11..8855bbd 100644 --- a/server/routes/movies.js +++ b/server/routes/movies.js @@ -1,6 +1,8 @@ var express = require('express'); var router = express.Router(); +const googleTrends = require('google-trends-api'); + const Movies = require('../Schemas/Movies'); /* GET movies @@ -120,4 +122,26 @@ router.post('/UpdateUserRating', function(req, res) { }); }); +router.get('/MovieTrend', function(req, res) { + var days = 7; + var date = new Date(); + var lastWeek = new Date(date.getTime() - (days * 24 * 60 * 60 * 1000)); + var lastDay = lastWeek.getDate(); + var lastMonth = lastWeek.getMonth() + 1; + var lastYear = lastWeek.getFullYear(); + + var startTime = new Date(lastYear + "-" + lastMonth + "-" + lastDay); + + googleTrends.interestOverTime({ + keyword: req.query.Title, + startTime: startTime + }) + .then(function(result) { + return res.json({ success: true, data: result }); + }) + .catch(function(error) { + return res.json({ success: false, error: error }); + }); +}) + module.exports = router; -- GitLab