diff --git a/api/main_endpoints/models/Advertisement.js b/api/main_endpoints/models/Advertisement.js index b35e047f6..509e58ed3 100644 --- a/api/main_endpoints/models/Advertisement.js +++ b/api/main_endpoints/models/Advertisement.js @@ -10,6 +10,11 @@ const AdvertisementSchema = new Schema( }, expireDate: { type: Date, + }, + expireAt: { + type: Date, + default: undefined, + index: {expireAfterSeconds: 0}, // TTL only kicks in when expireAt is set } }, { collection: 'Advertisements' } diff --git a/api/main_endpoints/routes/Advertisement.js b/api/main_endpoints/routes/Advertisement.js index 93a199e4a..2fe2ee023 100644 --- a/api/main_endpoints/routes/Advertisement.js +++ b/api/main_endpoints/routes/Advertisement.js @@ -20,6 +20,7 @@ router.get('/', async (req, res) => { }); }); + router.get('/getAllAdvertisements', async (req, res) => { if (!checkIfTokenSent(req)) { return res.sendStatus(FORBIDDEN); @@ -39,9 +40,16 @@ router.post('/createAdvertisement', async (req, res) => { } else if (!await decodeToken(req)) { return res.sendStatus(UNAUTHORIZED); } + const now = new Date(); + // const expireInOneMinute = new Date(now.getTime() + 60 * 1000); + const newAd = new Advertisement({ + // message: req.body.message, + // expireDate: expireInOneMinute, // testing and it doesn't work + // expireAt: expireInOneMinute message: req.body.message, - expireDate: req.body.expireDate + expireDate: req.body.expireDate, + expireAt: req.body.expireDate }); Advertisement.create(newAd) @@ -59,9 +67,11 @@ router.post('/deleteAdvertisement', async (req, res) => { } else if (!await decodeToken(req)) { return res.sendStatus(UNAUTHORIZED); } + console.log("expire date in delete " + expireDate); + Advertisement.deleteOne({ _id: req.body._id }) .then(result => { - if (result.n < 1) { + if (result.deletedCount < 1) { // used to be result.n res.sendStatus(NOT_FOUND); } else { res.sendStatus(OK); diff --git a/src/APIFunctions/Advertisement.js b/src/APIFunctions/Advertisement.js index e539be9e5..2e7c3540a 100644 --- a/src/APIFunctions/Advertisement.js +++ b/src/APIFunctions/Advertisement.js @@ -66,6 +66,7 @@ export async function createAd(newAd, token) { status.responseData = err; status.error = true; } + console.log("STATUS " + JSON.stringify(status.responseData)); return status; } diff --git a/src/Enums.js b/src/Enums.js index 71ba63922..f9961fba3 100644 --- a/src/Enums.js +++ b/src/Enums.js @@ -48,7 +48,7 @@ function membershipStateToString(accessLevel) { return membershipStatusArray[accessLevel + 2]; } -const BASE_API_URL = process.env.REACT_APP_BASE_API_URL || 'http://localhost:8080/'; +const BASE_API_URL = process.env.REACT_APP_BASE_API_URL || 'http://localhost:8080'; module.exports = { memberApplicationState, diff --git a/src/Pages/Advertisement/AdvertisementAdmin.js b/src/Pages/Advertisement/AdvertisementAdmin.js index 854c5b4d8..ea4461e85 100644 --- a/src/Pages/Advertisement/AdvertisementAdmin.js +++ b/src/Pages/Advertisement/AdvertisementAdmin.js @@ -3,14 +3,18 @@ import { createAd, getAds, deleteAd } from '../../APIFunctions/Advertisement.js' import { useState, useEffect } from 'react'; import { useUser } from '../../Components/context/UserContext'; + // createAd returns a value - what is it? + // how do we know if createAd() works or not? + // is there a field we can check?^ + + // if createAd worked, how can we update the array without calling the backend again? + export default function AdvertisementAdmin() { const { user } = useUser(); - + const [errorMesssage, setErrorMessage] = useState(''); const [ads, setAds] = useState([]); const [message, setMessage] = useState(''); - const [year, setYear] = useState(); - const [month, setMonth] = useState(); - const [day, setDay] = useState(); + const [expireDate, setExpireDate] = useState(); async function getAdsFromDB() { const adsFromDB = await getAds(user.token); @@ -20,53 +24,35 @@ export default function AdvertisementAdmin() { } async function createAdHandler() { - // make sure empty inputs are properly set as undefined if empty - if (year === '') { - setYear(undefined); - } - if (month === '') { - setMonth(undefined); + if(expireDate === null){ + setExpireDate(undefined); } - if (day === '') { - setDay(undefined); + // expireDate is a string so we need to turn into date object + + if(isExpired(expireDate)){ + setErrorMessage("Date is in the past or the present, unable to create ad!!!"); + return; + }else{ + setErrorMessage(""); } - - let expireDate = new Date(year, month - 1, day); - if (isNaN(expireDate.getTime())) { - expireDate = undefined; - } - await createAd({ message, expireDate, }, user.token); await getAdsFromDB(); + } - async function deleteExpiredAds() { - const adsFromDB = await getAds(user.token); - if (!adsFromDB.error) { - const currentDate = new Date(); - const expiredAds = adsFromDB.responseData.filter(ad => { - if (ad.expireDate === undefined) return false; - return new Date(ad.expireDate) < currentDate; - }); - - for (const ad of expiredAds) { - await deleteAd(ad, user.token); - } - } + function isExpired(expireDate){ + const currDate = new Date(); + console.log("current date" + currDate); + const expireDateObject = new Date(expireDate); + return expireDateObject < currDate; } useEffect(() => { getAdsFromDB(); - - const intervalId = setInterval(async () => { - await deleteExpiredAds(); - await getAdsFromDB(); - }, 20); - }, []); return ( @@ -74,6 +60,7 @@ export default function AdvertisementAdmin() {

Welcome to the Advertisement Admin Page!!

+

{errorMesssage}

{ - setYear(event.target.value); - }} - /> - { - setMonth(event.target.value); - }} - /> - { - setDay(event.target.value); + className='flex-1 text-sm input input-bordered sm:text-base' + type='datetime-local' + onChange={ event => { + setExpireDate(event.target.value); }} />