Skip to content

Commit 82eb9dd

Browse files
authored
Merge branch 'development' into 1703-migrate-editproject-mui
2 parents 8903fbe + ffda4f4 commit 82eb9dd

File tree

8 files changed

+330
-233
lines changed

8 files changed

+330
-233
lines changed

backend/app.js

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
12
// app.js - Entry point for our application
23

34
// Load in all of our node modules. Their uses are explained below as they are called.
45
const express = require('express');
6+
const morgan = require('morgan');
57
const cron = require('node-cron');
68
const fetch = require('node-fetch');
7-
const morgan = require('morgan');
89
const cookieParser = require('cookie-parser');
910

1011
const customRequestHeaderName = 'x-customrequired-header';
@@ -52,12 +53,14 @@ app.use(cookieParser());
5253
app.use(morgan('dev'));
5354

5455
// WORKERS
55-
const runOpenCheckinWorker = require('./workers/openCheckins')(cron, fetch);
56-
const runCloseCheckinWorker = require('./workers/closeCheckins')(cron, fetch);
56+
const runOpenCheckinWorker = require('./workers/openCheckins');
57+
runOpenCheckinWorker(cron, fetch);
5758

58-
const { createRecurringEvents } = require('./workers/createRecurringEvents');
59-
const runCreateRecurringEventsWorker = createRecurringEvents(cron, fetch);
59+
const runCloseCheckinWorker = require('./workers/closeCheckins');
60+
runCloseCheckinWorker(cron, fetch);
6061

62+
const { createRecurringEvents } = require('./workers/createRecurringEvents');
63+
createRecurringEvents(cron, fetch);
6164
// const runSlackBot = require("./workers/slackbot")(fetch);
6265

6366
// MIDDLEWARE

backend/controllers/event.controller.js

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ EventController.event_list = async function (req, res) {
99
const events = await Event.find(query).populate('project');
1010
return res.status(200).send(events);
1111
} catch (err) {
12+
console.error('[event.controller]', err);
1213
return res.sendStatus(400);
1314
}
1415
};
@@ -20,6 +21,7 @@ EventController.event_by_id = async function (req, res) {
2021
const events = await Event.findById(EventId).populate('project');
2122
return res.status(200).send(events);
2223
} catch (err) {
24+
console.error('[event.controller]', err);
2325
return res.sendStatus(400);
2426
}
2527
};
@@ -28,9 +30,15 @@ EventController.create = async function (req, res) {
2830
const { body } = req;
2931

3032
try {
31-
const event = await Event.create(body);
32-
return res.status(201).send(event);
33+
if (Array.isArray(body)) {
34+
const events = await Event.insertMany(body);
35+
return res.status(201).send(events);
36+
} else {
37+
const event = await Event.create(body);
38+
return res.status(201).send(event);
39+
}
3340
} catch (err) {
41+
console.error('[event.controller]', err);
3442
return res.sendStatus(400);
3543
}
3644
};
@@ -42,17 +50,31 @@ EventController.destroy = async function (req, res) {
4250
const event = await Event.findByIdAndDelete(EventId);
4351
return res.status(200).send(event);
4452
} catch (err) {
53+
console.error('[event.controller]', err);
4554
return res.sendStatus(400);
4655
}
4756
};
4857

4958
EventController.update = async function (req, res) {
50-
const { EventId } = req.params;
59+
const { body } = req;
5160

5261
try {
53-
const event = await Event.findByIdAndUpdate(EventId, req.body);
54-
return res.status(200).send(event);
62+
if (Array.isArray(body)) {
63+
const ops = body.map((e) => ({
64+
updateOne: {
65+
filter: { _id: e._id },
66+
update: { $set: { checkInReady: e.checkInReady } },
67+
},
68+
}));
69+
const events = await Event.bulkWrite(ops);
70+
return res.status(200).send(events);
71+
} else {
72+
const { EventId } = req.params;
73+
const event = await Event.findByIdAndUpdate(EventId, req.body);
74+
return res.status(200).send(event);
75+
}
5576
} catch (err) {
77+
console.error('[event.controller]', err);
5678
return res.sendStatus(400);
5779
}
5880
};

backend/routers/events.router.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
const express = require("express");
1+
const express = require('express');
22
const router = express.Router();
33

44
const { Event } = require('../models/event.model');
@@ -13,12 +13,14 @@ router.get('/:EventId', EventController.event_by_id);
1313

1414
router.delete('/:EventId', EventController.destroy);
1515

16+
router.patch('/batchUpdate', EventController.update);
17+
1618
router.patch('/:EventId', EventController.update);
1719

1820
// TODO: Refactor and remove
19-
router.get("/nexteventbyproject/:id", (req, res) => {
21+
router.get('/nexteventbyproject/:id', (req, res) => {
2022
Event.find({ project: req.params.id })
21-
.populate("project")
23+
.populate('project')
2224
.then((events) => {
2325
res.status(200).json(events[events.length - 1]);
2426
})

backend/workers/closeCheckins.js

Lines changed: 95 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,86 +1,99 @@
11
module.exports = (cron, fetch) => {
2+
// Check to see if any events are about to start,
3+
// and if so, open their respective check-ins
4+
5+
const url =
6+
process.env.NODE_ENV === 'prod'
7+
? 'https://www.vrms.io'
8+
: `http://localhost:${process.env.BACKEND_PORT}`;
9+
const headerToSend = process.env.CUSTOM_REQUEST_HEADER;
10+
11+
async function fetchEvents() {
12+
try {
13+
const res = await fetch(`${url}/api/events`, {
14+
headers: {
15+
'x-customrequired-header': headerToSend,
16+
},
17+
});
18+
const resJson = await res.json();
19+
20+
return resJson;
21+
} catch (error) {
22+
console.log(error);
23+
}
24+
}
25+
26+
async function updateEvents(eventsToUpdate) {
27+
try {
28+
const res = await fetch(`${url}/api/events/batchUpdate`, {
29+
method: 'PATCH',
30+
headers: {
31+
'Content-Type': 'application/json',
32+
'x-customrequired-header': headerToSend,
33+
},
34+
body: JSON.stringify(eventsToUpdate),
35+
});
36+
if (!res.ok) throw new Error('Failed to update event');
37+
return await res.json();
38+
} catch (error) {
39+
console.error('Error updating event:', error);
40+
return null;
41+
}
42+
}
43+
async function sortAndFilterEvents() {
44+
const events = await fetchEvents();
45+
46+
// Get current time and set to date variable
47+
const now = Date.now();
48+
49+
// Filter events if event date is after now but before thirty minutes from now
50+
if (events && events.length > 0) {
51+
const sortedEvents = events.filter((event) => {
52+
if (!event.date) {
53+
// handle if event date is null/undefined
54+
// false meaning don't include in sortedEvents
55+
return false;
56+
}
57+
// Calculate three hours from now
58+
const threeHoursFromStartTime = new Date(event.date).getTime() + 10800000;
59+
if (Number.isNaN(threeHoursFromStartTime)) return false;
60+
return now >= threeHoursFromStartTime && event.checkInReady === true;
61+
});
62+
63+
// console.log('Sorted events: ', sortedEvents);
64+
return sortedEvents;
65+
}
66+
}
67+
68+
async function closeCheckins(events) {
69+
if (events && events.length > 0) {
70+
console.log('Closing check-ins');
71+
// console.log('Closing event: ', event);
72+
const batchEventsToUpdate = events.map((e) => ({
73+
_id: e._id,
74+
checkInReady: false,
75+
}));
76+
const updatedEvents = await updateEvents(batchEventsToUpdate);
77+
if (updatedEvents) console.log('Updated events:', updatedEvents);
78+
console.log('Check-ins closed');
79+
} else {
80+
console.log('No open events to close');
81+
}
82+
}
83+
84+
async function runTask() {
85+
const eventsToClose = await sortAndFilterEvents().catch((err) => {
86+
console.log(err);
87+
});
288

3-
// Check to see if any events are about to start,
4-
// and if so, open their respective check-ins
5-
6-
const url = process.env.NODE_ENV === 'prod' ? 'https://www.vrms.io' : `http://localhost:${process.env.BACKEND_PORT}`;
7-
const headerToSend = process.env.CUSTOM_REQUEST_HEADER;
8-
9-
async function fetchEvents() {
10-
try {
11-
const res = await fetch(`${url}/api/events`, {
12-
headers: {
13-
"x-customrequired-header": headerToSend
14-
}
15-
});
16-
const resJson = await res.json();
17-
18-
return resJson;
19-
} catch(error) {
20-
console.log(error);
21-
};
22-
};
23-
24-
async function sortAndFilterEvents() {
25-
const events = await fetchEvents();
26-
27-
// Filter events if event date is after now but before thirty minutes from now
28-
if (events && events.length > 0) {
29-
30-
const sortedEvents = events.filter(event => {
31-
if (!event.date) {
32-
// handle if event date is null/undefined
33-
// false meaning don't include in sortedEvents
34-
return false
35-
}
36-
37-
const currentTimeISO = new Date().toISOString();
38-
const threeHoursFromStartTime = new Date(event.date).getTime() + 10800000;
39-
const threeHoursISO = new Date(threeHoursFromStartTime).toISOString();
40-
41-
return (currentTimeISO > threeHoursISO) && (event.checkInReady === true);
42-
});
43-
44-
// console.log('Sorted events: ', sortedEvents);
45-
return sortedEvents;
46-
};
47-
};
48-
49-
async function closeCheckins(events) {
50-
if(events && events.length > 0) {
51-
events.forEach(async event => {
52-
// console.log('Closing event: ', event);
53-
54-
await fetch(`${url}/api/events/${event._id}`, {
55-
method: "PATCH",
56-
headers: {
57-
"Content-Type": "application/json",
58-
"x-customrequired-header": headerToSend
59-
},
60-
body: JSON.stringify({ checkInReady: false })
61-
})
62-
.catch(err => {
63-
console.log(err);
64-
});
65-
});
66-
};
67-
};
68-
69-
async function runTask() {
70-
console.log("Closing check-ins");
71-
72-
const eventsToClose = await sortAndFilterEvents()
73-
.catch(err => {console.log(err)});
74-
75-
await closeCheckins(eventsToClose)
76-
.catch(err => {console.log(err)});
77-
78-
console.log("Check-ins closed");
79-
};
80-
81-
const scheduledTask = cron.schedule('*/30 * * * *', () => {
82-
runTask();
89+
await closeCheckins(eventsToClose).catch((err) => {
90+
console.log(err);
8391
});
92+
}
93+
94+
const scheduledTask = cron.schedule('*/30 * * * *', () => {
95+
runTask();
96+
});
8497

85-
return scheduledTask;
86-
};
98+
return scheduledTask;
99+
};

0 commit comments

Comments
 (0)