diff --git a/api/main_endpoints/models/HomepageVisit.js b/api/main_endpoints/models/HomepageVisit.js new file mode 100644 index 000000000..1e1caa59a --- /dev/null +++ b/api/main_endpoints/models/HomepageVisit.js @@ -0,0 +1,14 @@ +const mongoose = require('mongoose'); +const Schema = mongoose.Schema; + +const HomepageVisitSchema = new Schema( + { + visitCount: { + type: Number, + default: 0 + } + }, + { collection: 'HomepageVisit' } +); + +module.exports = mongoose.model('HomepageVisit', HomepageVisitSchema); \ No newline at end of file diff --git a/api/main_endpoints/routes/Homepage.js b/api/main_endpoints/routes/Homepage.js new file mode 100644 index 000000000..d6c962c1e --- /dev/null +++ b/api/main_endpoints/routes/Homepage.js @@ -0,0 +1,29 @@ +const express = require ('express'); +const router = express.Router(); +const visitCounter = require('../models/HomepageVisit'); +const { BAD_REQUEST, OK } = require('../../util/constants').STATUS_CODES; + +router.post('/visit', async (req, res) => { + try { + await visitCounter.findOneAndUpdate( + {}, + {$inc: {visitCount: 1}}, + { new: true, upsert: true } + ); + res.sendStatus(OK); + } catch (error) { + res.sendStatus(BAD_REQUEST); + } +}); + +router.get('/count', async (req, res) => { + try { + const response = await visitCounter.findOne({}); + const visitCount = response ? response.visitCount : 0; + return res.status(OK).send({visitCount}); + } catch (error) { + return res.sendStatus(BAD_REQUEST); + } +}) + +module.exports = router; \ No newline at end of file diff --git a/src/APIFunctions/HomepageVisit.js b/src/APIFunctions/HomepageVisit.js new file mode 100644 index 000000000..7eac3ac15 --- /dev/null +++ b/src/APIFunctions/HomepageVisit.js @@ -0,0 +1,40 @@ +import { ApiResponse } from './ApiResponses'; +import { BASE_API_URL } from '../Enums'; + +export async function incrementVisitCount() { + let status = new ApiResponse(); + try { + await fetch (BASE_API_URL + 'api/Homepage/visit', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + }); + if (res.ok) { + status.responseData = result; + } else { + status.error = true; + } + } catch (err) { + status.responseData = err; + status.error = true; + } + return status; +} + +export async function getVisitCount() { + let status = new ApiResponse(); + try { + const res = await fetch (BASE_API_URL + 'api/Homepage/count'); + if (res.ok) { + const result = await res.json(); + status.responseData = result; + } else { + status.error = true; + } + } catch (err) { + status.responseData = err; + status.error = true; + } + return status; +} \ No newline at end of file diff --git a/src/Pages/Home/Home.js b/src/Pages/Home/Home.js index 53b42e00d..a2aa063e6 100755 --- a/src/Pages/Home/Home.js +++ b/src/Pages/Home/Home.js @@ -3,12 +3,15 @@ import Footer from '../../Components/Footer/Footer.js'; import './Home.css'; import { getAd } from '../../APIFunctions/Advertisement.js'; +import { incrementVisitCount, getVisitCount } from '../../APIFunctions/HomepageVisit.js'; const Home = () => { const [message, setMessage] = useState(''); const [showMessage, setShowMessage] = useState(false); const [showAll, setShowAll] = useState(false); + const [visitCount, setVisitCount] = useState(0); + async function getMessage() { try { const messageData = await getAd(); @@ -20,8 +23,15 @@ const Home = () => { } } + async function loadVisitCounter() { + await incrementVisitCount(); + const response = await getVisitCount(); + if(!response.error) setVisitCount(response.responseData.visitCount); + } + useEffect(() => { getMessage(); + loadVisitCounter(); setTimeout(() => setShowAll(true), 100); }, []); @@ -96,6 +106,10 @@ const Home = () => { +
+ Visit Count: {visitCount} +
+