diff --git a/api/main_endpoints/models/Advertisement.js b/api/main_endpoints/models/Advertisement.js index 509e58ed3..b35e047f6 100644 --- a/api/main_endpoints/models/Advertisement.js +++ b/api/main_endpoints/models/Advertisement.js @@ -10,11 +10,6 @@ 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 2fe2ee023..93a199e4a 100644 --- a/api/main_endpoints/routes/Advertisement.js +++ b/api/main_endpoints/routes/Advertisement.js @@ -20,7 +20,6 @@ router.get('/', async (req, res) => { }); }); - router.get('/getAllAdvertisements', async (req, res) => { if (!checkIfTokenSent(req)) { return res.sendStatus(FORBIDDEN); @@ -40,16 +39,9 @@ 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, - expireAt: req.body.expireDate + expireDate: req.body.expireDate }); Advertisement.create(newAd) @@ -67,11 +59,9 @@ 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.deletedCount < 1) { // used to be result.n + if (result.n < 1) { res.sendStatus(NOT_FOUND); } else { res.sendStatus(OK); diff --git a/src/APIFunctions/Advertisement.js b/src/APIFunctions/Advertisement.js index 2e7c3540a..e539be9e5 100644 --- a/src/APIFunctions/Advertisement.js +++ b/src/APIFunctions/Advertisement.js @@ -66,7 +66,6 @@ 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 f9961fba3..71ba63922 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 ea4461e85..854c5b4d8 100644 --- a/src/Pages/Advertisement/AdvertisementAdmin.js +++ b/src/Pages/Advertisement/AdvertisementAdmin.js @@ -3,18 +3,14 @@ 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 [expireDate, setExpireDate] = useState(); + const [year, setYear] = useState(); + const [month, setMonth] = useState(); + const [day, setDay] = useState(); async function getAdsFromDB() { const adsFromDB = await getAds(user.token); @@ -24,35 +20,53 @@ export default function AdvertisementAdmin() { } async function createAdHandler() { - if(expireDate === null){ - setExpireDate(undefined); + // make sure empty inputs are properly set as undefined if empty + if (year === '') { + setYear(undefined); + } + if (month === '') { + setMonth(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(""); + if (day === '') { + setDay(undefined); } + + let expireDate = new Date(year, month - 1, day); + if (isNaN(expireDate.getTime())) { + expireDate = undefined; + } + await createAd({ message, expireDate, }, user.token); await getAdsFromDB(); - } - function isExpired(expireDate){ - const currDate = new Date(); - console.log("current date" + currDate); - const expireDateObject = new Date(expireDate); - return expireDateObject < currDate; + 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); + } + } } useEffect(() => { getAdsFromDB(); + + const intervalId = setInterval(async () => { + await deleteExpiredAds(); + await getAdsFromDB(); + }, 20); + }, []); return ( @@ -60,7 +74,6 @@ export default function AdvertisementAdmin() {

Welcome to the Advertisement Admin Page!!

-

{errorMesssage}

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