Merge pull request #899 from bluewave-labs/feat/be/documentation

Add JSdocs to SettingsService, add descriptions of services
This commit is contained in:
Alexander Holliday
2024-09-30 18:56:03 -07:00
committed by GitHub
5 changed files with 46 additions and 64 deletions
-3
View File
@@ -21,7 +21,6 @@ const queueRouter = require("./routes/queueRoute");
const JobQueue = require("./service/jobQueue");
const NetworkService = require("./service/networkService");
const EmailService = require("./service/emailService");
const PageSpeedService = require("./service/pageSpeedService");
const SettingsService = require("./service/settingsService");
const SERVICE_NAME = "Server";
@@ -73,7 +72,6 @@ const startApp = async () => {
req.db = db;
req.jobQueue = jobQueue;
req.emailService = emailService;
req.pageSpeedService = pageSpeedService;
req.settingsService = settingsService;
next();
});
@@ -136,7 +134,6 @@ const startApp = async () => {
networkService,
settingsService
);
const pageSpeedService = new PageSpeedService();
const cleanup = async () => {
if (cleaningUp) {
+8 -1
View File
@@ -5,11 +5,18 @@ const JOBS_PER_WORKER = 5;
const logger = require("../utils/logger");
const { errorMessages, successMessages } = require("../utils/messages");
const SERVICE_NAME = "JobQueue";
/**
* JobQueue
*
* This service is responsible for managing the job queue.
* It handles enqueuing, dequeuing, and processing jobs.
* It scales the number of workers based on the number of jobs/worker
*/
class JobQueue {
/**
* Constructs a new JobQueue
* @constructor
* @param {SettingsService} settingsService - The settings service
* @throws {Error}
*/
constructor(settingsService) {
+7
View File
@@ -4,6 +4,13 @@ const logger = require("../utils/logger");
const http = require("http");
const { errorMessages, successMessages } = require("../utils/messages");
/**
* NetworkService
*
* This service handles all network requests on the back end
* This includes pings, http requests, and pagespeed checks
*/
class NetworkService {
constructor(db, emailService) {
this.db = db;
-52
View File
@@ -1,52 +0,0 @@
const PageSpeedCheck = require("../models/PageSpeedCheck");
const axios = require("axios");
const logger = require("../utils/logger");
class PageSpeedService {
constructor() {
this.SERVICE_NAME = "PageSpeedService";
}
/**
* Runs a PageSpeed check using Google Lighthouse API.
* @param {string} url - The URL to check.
* @returns {Promise<Object>} The results from the PageSpeed API.
*/
async runPageSpeedCheck(url) {
try {
const response = await axios.get(
"https://pagespeedonline.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://www.google.com&category=seo&category=accessibility&category=best-practices&category=performance"
);
return response.data;
} catch (error) {
logger.error(`Error running PageSpeed check for ${url}`, {
service: this.SERVICE_NAME,
error: error.message,
});
error.service === undefined ? (error.service = SERVICE_NAME) : null;
error.method === undefined ? (error.method = "runPageSpeedCheck") : null;
throw error;
}
}
/**
* Creates a new PageSpeedCheck document.
* @param {Object} data - The data for the new PageSpeedCheck.
* @returns {Promise<PageSpeedCheck>} The created PageSpeedCheck document.
*/
async createPageSpeedCheck(data) {
try {
const newPageSpeedCheck = new PageSpeedCheck(data);
return await newPageSpeedCheck.save();
} catch (error) {
error.service === undefined ? (error.service = SERVICE_NAME) : null;
error.method === undefined
? (error.method = "createPageSpeedCheck")
: null;
throw error;
}
}
}
module.exports = PageSpeedService;
+31 -8
View File
@@ -1,6 +1,7 @@
const { env } = require("process");
const AppSettings = require("../models/AppSettings");
const SERVICE_NAME = "SettingsService";
// Load settings from environment variables
const envConfig = {
logLevel: undefined,
apiBaseUrl: undefined,
@@ -17,19 +18,34 @@ const envConfig = {
systemEmailAddress: process.env.SYSTEM_EMAIL_ADDRESS,
systemEmailPassword: process.env.SYSTEM_EMAIL_PASSWORD,
};
/**
* SettingsService
*
* This service is responsible for loading and managing the application settings.
* It gives priority to environment variables and will only load settings
* from the database if they are not set in the environment.
*/
class SettingsService {
constructor() {
/**
* Constructs a new SettingsService
* @constructor
* @throws {Error}
*/ constructor() {
this.settings = { ...envConfig };
}
async loadSettings() {
/**
* Load settings from the database and merge with environment settings.
* If there are any settings that weren't set by environment variables, use user settings from the database.
* @returns {Promise<Object>} The merged settings.
* @throws Will throw an error if settings are not found in the database or if settings have not been loaded.
*/ async loadSettings() {
try {
const dbSettings = await AppSettings.findOne();
if (!this.settings) {
throw new Error("Settings not found");
}
// Try to load settings from env first, if not found, load from db
// If there are any settings that weren't set by environment variables, use user settings from DB
for (const key in envConfig) {
if (envConfig[key] === undefined && dbSettings[key] !== undefined) {
this.settings[key] = dbSettings[key];
@@ -46,11 +62,18 @@ class SettingsService {
throw error;
}
}
/**
* Reload settings by calling loadSettings.
* @returns {Promise<Object>} The reloaded settings.
*/
async reloadSettings() {
return this.loadSettings();
}
/**
* Get the current settings.
* @returns {Object} The current settings.
* @throws Will throw an error if settings have not been loaded.
*/
getSettings() {
if (!this.settings) {
throw new Error("Settings have not been loaded");