From a9ddb272186e89b8ccf103dc65bfea1a254a3920 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Thu, 13 Jun 2024 13:05:41 -0700 Subject: [PATCH] Implemented HTTP(s) Request, added add and delete to and from job queue --- Server/controllers/authController.js | 1 + Server/controllers/monitorController.js | 4 +++ Server/index.js | 6 ++-- Server/package-lock.json | 2 +- Server/package.json | 1 + Server/service/jobQueue.js | 44 +++++++++++++++++++++---- 6 files changed, 48 insertions(+), 10 deletions(-) diff --git a/Server/controllers/authController.js b/Server/controllers/authController.js index 7730219ea..c0862cd9e 100644 --- a/Server/controllers/authController.js +++ b/Server/controllers/authController.js @@ -24,6 +24,7 @@ const { * @returns {String} */ const issueToken = (payload) => { + //TODO Add proper expiration date return jwt.sign(payload, process.env.JWT_SECRET, { expiresIn: "99d" }); }; diff --git a/Server/controllers/monitorController.js b/Server/controllers/monitorController.js index 250dc55b8..a8743fe5e 100644 --- a/Server/controllers/monitorController.js +++ b/Server/controllers/monitorController.js @@ -116,6 +116,8 @@ const createMonitor = async (req, res, next) => { try { const monitor = await req.db.createMonitor(req, res); + // Add monitor to job queue + req.jobQueue.addJob(monitor._id, monitor); return res .status(201) .json({ success: true, msg: "Monitor created", data: monitor }); @@ -147,6 +149,8 @@ const deleteMonitor = async (req, res, next) => { try { const monitor = await req.db.deleteMonitor(req, res, next); + req.jobQueue.deleteJob(monitor); + /** * TODO * We should remove all checks and alerts associated with this monitor diff --git a/Server/index.js b/Server/index.js index 63aae0279..0d5be15ea 100644 --- a/Server/index.js +++ b/Server/index.js @@ -38,7 +38,6 @@ const startApp = async () => { ? DB_TYPE[process.env.DB_TYPE]() : require("./db/FakeDb"); - const jobQueue = await JobQueue.createJobQueue(); /** * NOTES * Email Service will be added @@ -69,7 +68,7 @@ const startApp = async () => { //routes app.use("/api/v1/auth", authRouter); - app.use("/api/v1/monitors", monitorRouter); + app.use("/api/v1/monitors", verifyJWT, monitorRouter); app.use("/api/v1/checks", verifyJWT, checkRouter); app.use("/api/v1/alerts", verifyJWT, alertRouter); //Temporary route for testing, remove later @@ -92,7 +91,8 @@ const startApp = async () => { */ app.use(handleErrors); - connectDbAndRunServer(app, db); + await connectDbAndRunServer(app, db); + const jobQueue = await JobQueue.createJobQueue(db); }; startApp().catch((error) => { diff --git a/Server/package-lock.json b/Server/package-lock.json index faa647ddc..9b8273ebd 100644 --- a/Server/package-lock.json +++ b/Server/package-lock.json @@ -10,6 +10,7 @@ "license": "ISC", "dependencies": { "@sendgrid/mail": "^8.1.3", + "axios": "^1.7.2", "bcrypt": "^5.1.1", "bullmq": "5.7.15", "cors": "^2.8.5", @@ -373,7 +374,6 @@ "version": "1.7.2", "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", - "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", diff --git a/Server/package.json b/Server/package.json index 33e7f58b0..2d21452c1 100644 --- a/Server/package.json +++ b/Server/package.json @@ -12,6 +12,7 @@ "license": "ISC", "dependencies": { "@sendgrid/mail": "^8.1.3", + "axios": "^1.7.2", "bcrypt": "^5.1.1", "bullmq": "5.7.15", "cors": "^2.8.5", diff --git a/Server/service/jobQueue.js b/Server/service/jobQueue.js index 5a9fbc6d5..58bbbfc09 100644 --- a/Server/service/jobQueue.js +++ b/Server/service/jobQueue.js @@ -6,6 +6,8 @@ const connection = { }; const JOBS_PER_WORKER = 5; const logger = require("../utils/logger"); +const SERVICE_NAME = "JobQueue"; +const axios = require("axios"); class JobQueue { /** @@ -18,6 +20,7 @@ class JobQueue { connection, }); this.workers = []; + this.db = null; } /** @@ -27,9 +30,11 @@ class JobQueue { * @returns {Promise} - Returns a new JobQueue * */ - static async createJobQueue() { + static async createJobQueue(db) { const queue = new JobQueue(); try { + queue.db = db; + const monitors = await db.getAllMonitors(); const workerStats = await queue.getWorkerStats(); await queue.scaleWorkers(workerStats); return queue; @@ -47,8 +52,9 @@ class JobQueue { const worker = new Worker( QUEUE_NAME, async (job) => { - // TODO Ping a monitor - console.log(`${job.name} completed, workers: ${this.workers.length}`); + const response = await axios.get(job.data.url); + // TODO create a check object and save it to the db + console.log(response.status); }, { connection, @@ -147,7 +153,6 @@ class JobQueue { async getJobs() { try { const jobs = await this.queue.getRepeatableJobs(); - console.log("jobs", jobs); return jobs; } catch (error) { throw error; @@ -166,8 +171,7 @@ class JobQueue { try { await this.queue.add(jobName, payload, { repeat: { - every: 1000, - limit: 100, + every: payload.interval, }, }); const workerStats = await this.getWorkerStats(); @@ -177,6 +181,34 @@ class JobQueue { } } + /** + * Deletes a job from the queue. + * + * @async + * @param {Monitor} monitor - The monitor to remove. + * @throws {Error} + */ + async deleteJob(monitor) { + try { + const deleted = await this.queue.removeRepeatable(monitor.id, { + every: monitor.interval, + }); + if (deleted) { + logger.info("Job removed from queue", { + service: SERVICE_NAME, + jobId: monitor.id, + }); + } else { + logger.error("Job not found in queue", { + service: SERVICE_NAME, + jobId: monitor.id, + }); + } + } catch (error) { + throw error; + } + } + /** * @async * @returns {Promise} - Returns true if obliteration is successful