From 0417497457a634ba21bc73e99bbeb7a08d393e6b Mon Sep 17 00:00:00 2001 From: Sean Edmunds Date: Thu, 9 Jul 2026 16:55:54 -0500 Subject: [PATCH] Adding modules --- commands/SearchData.cjs | 46 ++ commands/applicationData.cjs | 99 ++++ commands/bookmarkData.cjs | 157 +++++++ commands/guacamoleData.cjs | 60 +++ commands/messageData.cjs | 71 +++ commands/personalData.cjs | 61 +++ commands/providerData.cjs | 78 ++++ commands/themeData.cjs | 191 ++++++++ commands/wolData.cjs | 67 +++ triggerBackend.cjs | 850 +++++++---------------------------- 10 files changed, 1001 insertions(+), 679 deletions(-) create mode 100644 commands/SearchData.cjs create mode 100644 commands/applicationData.cjs create mode 100644 commands/bookmarkData.cjs create mode 100644 commands/guacamoleData.cjs create mode 100644 commands/messageData.cjs create mode 100644 commands/personalData.cjs create mode 100644 commands/providerData.cjs create mode 100644 commands/themeData.cjs create mode 100644 commands/wolData.cjs diff --git a/commands/SearchData.cjs b/commands/SearchData.cjs new file mode 100644 index 0000000..e068631 --- /dev/null +++ b/commands/SearchData.cjs @@ -0,0 +1,46 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getSearchHistory = async (_req, res) => { + const conn = await pool.getConnection(); + const query = + "SELECT * FROM trigger_database.searchHistory ORDER BY dateTimeStamp DESC;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const addSearchHistoryItem = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.searchHistory (prefix, provider, searchTerm) VALUES (${escapeString(req.body.prefix)}, ${escapeString(req.body.provider)}, ${escapeString(req.body.searchTerm)})`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteSearchHistoryItem = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.searchHistory WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +module.exports = { + getSearchHistory, + addSearchHistoryItem, + deleteSearchHistoryItem, +}; diff --git a/commands/applicationData.cjs b/commands/applicationData.cjs new file mode 100644 index 0000000..3e8c7a5 --- /dev/null +++ b/commands/applicationData.cjs @@ -0,0 +1,99 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getApplications = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * FROM trigger_database.applications;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const getEnabledApplications = async (_req, res) => { + const conn = await pool.getConnection(); + const query = + "SELECT * FROM trigger_database.applications WHERE enabled = 1;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const postApplication = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.applications (name, url, icon, baseUrl, filterName, enabled, \`index\`) VALUES (${escapeString(req.body.name)}, ${escapeString(req.body.url)}, ${escapeString(req.body.icon)}, ${escapeString(req.body.baseUrl)}, ${escapeString(req.body.filterName)}, ${req.body.enabled}, ${req.body.index});`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const patchApplication = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.applications SET name = ${escapeString(req.body.name)}, url = ${escapeString(req.body.url)}, icon = ${escapeString(req.body.icon)}, baseUrl = ${escapeString(req.body.baseUrl)}, filterName = ${escapeString(req.body.filterName)}, enabled = ${req.body.enabled} WHERE id = ${req.body.id};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteApplication = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.applications WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const getAppCategories = async (_req, res) => { + const conn = await pool.getConnection(); + const query = + "SELECT filterName FROM trigger_database.applications UNION SELECT filterName FROM trigger_database.bookmarkCategories;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const updateApplicationOrder = async (req, res) => { + const conn = await pool.getConnection(); + req.body.map(async (link) => { + return conn + .query( + "UPDATE trigger_database.applications SET `index` = ? where id IN (?)", + [link.index, link.id], + ) + .then((_rows) => { + res.status(200); + }); + }); + res.send({ status: "success" }); + conn.end(); +}; + +module.exports = { + getApplications, + getEnabledApplications, + postApplication, + patchApplication, + deleteApplication, + getAppCategories, + updateApplicationOrder, +}; diff --git a/commands/bookmarkData.cjs b/commands/bookmarkData.cjs new file mode 100644 index 0000000..0be425b --- /dev/null +++ b/commands/bookmarkData.cjs @@ -0,0 +1,157 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getBookmarks = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * FROM trigger_database.bookmarks;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const postBookmark = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.bookmarks (name, url, category, \`index\`, enabled) VALUES (${escapeString(req.body.name)}, ${escapeString(req.body.url)}, ${escapeString(req.body.category)}, ${req.body.index}, ${req.body.enabled});`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const patchBookmark = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.bookmarks SET name = ${escapeString(req.body.name)}, url = ${escapeString(req.body.url)}, category = ${escapeString(req.body.category)}, \`index\` = ${req.body.index}, enabled = ${req.body.enabled} WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteBookmark = async (req, res) => { + const conn = await pool.getConnection(); + if (req.body.length > 1) { + req.body.map(async (link) => { + return conn + .query("DELETE FROM trigger_database.bookmarks where id IN (?)", [ + link.id, + ]) + .then(() => { + res.status(200); + }); + }); + res.send({ status: "success" }); + } else { + const query = `DELETE FROM trigger_database.bookmarks WHERE id = ${req.body.id}`; + conn + .query(query) + .then(() => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + } + conn.end(); +}; + +const patchBookmarkOrder = async (req, res) => { + const conn = await pool.getConnection(); + req.body.map(async (link) => { + return conn + .query( + "UPDATE trigger_database.bookmarks SET `index` = ? where id IN (?)", + [link.index, link.id], + ) + .then(() => { + res.status(200); + }); + }); + res.send({ status: "success" }); + conn.end(); +}; + +const getBookmarkCategories = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * from trigger_database.bookmarkCategories;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const postBookmarkCategory = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.bookmarkCategories (categoryName, categoryIndex, filterName) VALUES (${escapeString(req.body.categoryName)},${req.body.categoryIndex || 0},${escapeString(req.body.filterName)})`; + conn.query(query).then((_rows) => { + res.status(200).send({ status: "success" }); + }); + conn.end(); +}; + +const patchBookmarkCategory = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.bookmarkCategories SET categoryName = ${escapeString(req.body.categoryName)}, filterName = ${escapeString(req.body.filterName)}, enabled = ${req.body.enabled} WHERE id = ${req.body.id};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteBookmarkCategory = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.bookmarkCategories WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const patchBookmarkCategoryOrder = async (req, res) => { + const conn = await pool.getConnection(); + req.body.map(async (category) => { + return conn + .query( + "UPDATE trigger_database.bookmarkCategories SET categoryIndex = ? where id IN (?)", + [category.index, category.id], + ) + .then((_rows) => { + res.status(200); + }); + }); + res.send({ status: "success" }); + conn.end(); +}; + +module.exports = { + getBookmarks, + postBookmark, + patchBookmark, + deleteBookmark, + patchBookmarkOrder, + getBookmarkCategories, + postBookmarkCategory, + patchBookmarkCategory, + deleteBookmarkCategory, + patchBookmarkCategoryOrder, +}; diff --git a/commands/guacamoleData.cjs b/commands/guacamoleData.cjs new file mode 100644 index 0000000..352040c --- /dev/null +++ b/commands/guacamoleData.cjs @@ -0,0 +1,60 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getGuacamoleClients = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * from trigger_database.guacamoleClients;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const createGuacamoleClient = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.guacamoleClients (clientName, clientIdentifier, enabled, type) VALUES (${escapeString(req.body.clientName)}, ${escapeString(req.body.clientIdentifier)}, ${req.body.enabled}, ${escapeString(req.body.type)})`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const updateGuacamoleClient = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.guacamoleClients SET clientName = ${escapeString(req.body.clientName)}, clientIdentifier = ${escapeString(req.body.clientIdentifier)} , enabled = ${req.body.enabled}, type = ${escapeString(req.body.type)} WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteGuacamoleClient = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.guacamoleClients WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +module.exports = { + getGuacamoleClients, + createGuacamoleClient, + updateGuacamoleClient, + deleteGuacamoleClient, +}; diff --git a/commands/messageData.cjs b/commands/messageData.cjs new file mode 100644 index 0000000..cd44a23 --- /dev/null +++ b/commands/messageData.cjs @@ -0,0 +1,71 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getMessages = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * FROM trigger_database.messages;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const getDisplayedGreeting = async (_req, res) => { + const conn = await pool.getConnection(); + const query = + "SELECT * FROM trigger_database.messages WHERE customGreeting = 1 ORDER BY RAND() LIMIT 1;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const postMessage = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.messages (message) VALUES (${escapeString(req.body.message)});`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const patchMessage = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.messages SET message = ${escapeString(req.body.message)}, customGreeting = ${req.body.customGreeting} WHERE id = ${req.body.id};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteMessage = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.messages WHERE id = ${req.body.id};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +module.exports = { + getMessages, + getDisplayedGreeting, + postMessage, + patchMessage, + deleteMessage, +}; diff --git a/commands/personalData.cjs b/commands/personalData.cjs new file mode 100644 index 0000000..01aee35 --- /dev/null +++ b/commands/personalData.cjs @@ -0,0 +1,61 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getPersonalData = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * FROM trigger_database.personalData;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const getGuacamoleHost = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT guacamoleHost FROM trigger_database.personalData;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const getGuacamoleEnabled = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT enableGuacamole FROM trigger_database.personalData;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const getWolEnabled = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT enableWol FROM trigger_database.personalData;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const updatePersonalData = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.personalData SET firstName = ${escapeString(req.body.firstName)}, lastName = ${escapeString(req.body.lastName)}, email = ${escapeString(req.body.email)}, physicalAddress = ${escapeString(req.body.physicalAddress)}, enableWol = ${req.body.enableWol}, enableGuacamole = ${req.body.enableGuacamole}, guacamoleHost = ${escapeString(req.body.guacamoleHost ?? "")}, nickname = ${escapeString(req.body.nickname ?? "")}, defaultFont = ${escapeString(req.body.defaultFont)};`; + + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +module.exports = { + getPersonalData, + updatePersonalData, + getGuacamoleHost, + getGuacamoleEnabled, + getWolEnabled, +}; diff --git a/commands/providerData.cjs b/commands/providerData.cjs new file mode 100644 index 0000000..17834bc --- /dev/null +++ b/commands/providerData.cjs @@ -0,0 +1,78 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getProviders = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * FROM trigger_database.providers;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const getDefaultProvider = async (_req, res) => { + const conn = await pool.getConnection(); + const query = `SELECT * FROM trigger_database.providers WHERE \`default\` = 1;`; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const postProvider = async (req, res) => { + const conn = await pool.getConnection(); + if (req.body.default === true || req.body.default === 1) { + const query = `UPDATE trigger_database.providers SET \`default\` = 0;`; + conn.query(query); + } + const query = `INSERT INTO trigger_database.providers (name, url, prefix, \`default\`, icon) VALUES (${escapeString(req.body.name)}, ${escapeString(req.body.url)}, ${escapeString(req.body.prefix)}, ${req.body.default ? 1 : 0}, ${escapeString(req.body.icon)});`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const patchProvider = async (req, res) => { + const conn = await pool.getConnection(); + if (req.body.default === true || req.body.default === 1) { + const query = `UPDATE trigger_database.providers SET \`default\` = 0;`; + conn.query(query); + } + const query = `UPDATE trigger_database.providers SET name = ${escapeString(req.body.name)}, url = ${escapeString(req.body.url)}, prefix = ${escapeString(req.body.prefix)}, \`default\` = ${req.body.default}, icon = ${escapeString(req.body.icon)} WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteProvider = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.providers WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +module.exports = { + getProviders, + getDefaultProvider, + postProvider, + patchProvider, + deleteProvider, +}; diff --git a/commands/themeData.cjs b/commands/themeData.cjs new file mode 100644 index 0000000..e945f95 --- /dev/null +++ b/commands/themeData.cjs @@ -0,0 +1,191 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); +const fs = require("node:fs"); + +const getThemes = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * FROM trigger_database.themes;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const addTheme = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.themes (name, backgroundImage, backgroundColor, searchColor, primaryColor, accentColor, borderColor, themeFont) VALUES (${escapeString(req.body.name)},${escapeString(req.body.backgroundImage)},${escapeString(req.body.backgroundColor)},${escapeString(req.body.searchColor)},${escapeString(req.body.primaryColor)},${escapeString(req.body.accentColor)},${escapeString(req.body.borderColor)},${escapeString(req.body.themeFont)})`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const updateTheme = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.themes SET name = ${escapeString(req.body.name)}, backgroundImage = ${escapeString(req.body.backgroundImage)}, backgroundColor = ${escapeString(req.body.backgroundColor)}, searchColor = ${escapeString(req.body.searchColor)}, primaryColor = ${escapeString(req.body.primaryColor)}, accentColor = ${escapeString(req.body.accentColor)}, borderColor = ${escapeString(req.body.borderColor)}, randomEnabled = ${req.body.randomEnabled ? 1 : 0}, textShadowsEnabled = ${req.body.textShadowsEnabled ? 1 : 0}, appShadowsEnabled = ${req.body.appShadowsEnabled ? 1 : 0}, themeFont = ${req.body.themeFont === null ? null : escapeString(req.body.themeFont)} WHERE id = ${req.body.id};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteTheme = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.themes WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const getThemePlaylists = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * FROM trigger_database.themePlaylists;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const addThemePlaylist = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.themePlaylists (name, themeList) VALUES (${escapeString(req.body.name)},${escapeString(req.body.themeList)});`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const updateThemePlaylist = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.themePlaylists SET name = ${escapeString(req.body.name)}, themeList = ${escapeString(req.body.themeList)} WHERE id = ${req.body.id};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteThemePlaylist = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.themePlaylists WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const getBackgrounds = async (_req, res) => { + fs.readdir( + "../TriggerFrontend/backgrounds", + { withFileTypes: true }, + (_err, files) => { + res + .status(200) + .send(files.filter((file) => file.isFile()).map((file) => file.name)); + }, + ); +}; + +const uploadBackground = async (req, res) => { + const image = req.file.path; + const thumbnail = `${req.file.destination}thumbs/${req.file.filename}`; + exec(`convert ${image} -resize 'x1080' -define jpeg:extent=300kb ${image}`); + exec(`convert ${image} -resize 'x360' -define jpeg:extent=75kb ${thumbnail}`); + res.status(200).send({ status: "success", statusText: image }); +}; + +const updateBackground = async (req, res) => { + fs.rename( + `../TriggerFrontend/backgrounds/${req.body.fileName}`, + `../TriggerFrontend/backgrounds/${req.body.newFileName}`, + (err) => { + if (err) throw err; + }, + ); + fs.rename( + `../TriggerFrontend/backgrounds/thumbs/${req.body.fileName}`, + `../TriggerFrontend/backgrounds/thumbs/${req.body.newFileName}`, + (err) => { + if (err) throw err; + }, + ); + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.themes SET backgroundImage = ${escapeString(req.body.newFileName)} WHERE backgroundImage = ${escapeString(req.body.fileName)};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteBackground = async (req, res) => { + fs.rm(`../TriggerFrontend/backgrounds/${req.body.fileName}`, (_err) => { + if (_err) throw _err; + }); + fs.rm( + `../TriggerFrontend/backgrounds/thumbs/${req.body.fileName}`, + (_err) => { + if (_err) throw _err; + }, + ); + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.themes SET backgroundImage = 'none' WHERE backgroundImage = ${escapeString(req.body.fileName)};`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +module.exports = { + getThemes, + addTheme, + updateTheme, + deleteTheme, + getThemePlaylists, + addThemePlaylist, + updateThemePlaylist, + deleteThemePlaylist, + getBackgrounds, + uploadBackground, + updateBackground, + deleteBackground, +}; diff --git a/commands/wolData.cjs b/commands/wolData.cjs new file mode 100644 index 0000000..a941a2e --- /dev/null +++ b/commands/wolData.cjs @@ -0,0 +1,67 @@ +const { pool } = require("../triggerBackend.cjs"); +const escapeString = require("sql-escape-string"); + +const getWolClients = async (_req, res) => { + const conn = await pool.getConnection(); + const query = "SELECT * from trigger_database.wolClients;"; + conn.query(query).then((rows) => { + res.status(200).send(rows); + }); + conn.end(); +}; + +const createWolClient = async (req, res) => { + const conn = await pool.getConnection(); + const query = `INSERT INTO trigger_database.wolClients (hostname, macAddress) VALUES (${escapeString(req.body.hostname)}, ${escapeString(req.body.macAddress)})`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const updateWolClient = async (req, res) => { + const conn = await pool.getConnection(); + const query = `UPDATE trigger_database.wolClients SET hostname = ${escapeString(req.body.hostname)}, macAddress = ${escapeString(req.body.macAddress)} WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const deleteWolClient = async (req, res) => { + const conn = await pool.getConnection(); + const query = `DELETE FROM trigger_database.wolClients WHERE id = ${req.body.id}`; + conn + .query(query) + .then((_rows) => { + res.status(200).send({ status: "success" }); + }) + .catch((err) => { + res.status(500).send({ error: err }); + }); + conn.end(); +}; + +const wakeWolClient = async (req, res) => { + wol.wake(req.body.macAddress, () => { + res.status(200).send({ status: "success" }); + }); +}; + +module.exports = { + getWolClients, + createWolClient, + updateWolClient, + deleteWolClient, + wakeWolClient, +}; diff --git a/triggerBackend.cjs b/triggerBackend.cjs index de25c52..6501674 100644 --- a/triggerBackend.cjs +++ b/triggerBackend.cjs @@ -1,13 +1,11 @@ require("dotenv").config(); const express = require("express"); const cors = require("cors"); -const fs = require("node:fs"); -const wol = require("wol"); +const _wol = require("wol"); const mariadb = require("mariadb"); const bodyParser = require("body-parser"); -const escapeString = require("sql-escape-string"); +const _escapeString = require("sql-escape-string"); const multer = require("multer"); -const { exec } = require("node:child_process"); const pool = mariadb.createPool({ host: process.env.DB_HOST, @@ -17,7 +15,86 @@ const pool = mariadb.createPool({ connectionLimit: 5, }); -const app = express(); +module.exports = { pool }; + +const { + getPersonalData, + updatePersonalData, + getGuacamoleHost, + getGuacamoleEnabled, + getWolEnabled, +} = require("./commands/personalData.cjs"); +const { + getMessages, + getDisplayedGreeting, + postMessage, + patchMessage, + deleteMessage, +} = require("./commands/messageData.cjs"); +const { + getApplications, + getEnabledApplications, + postApplication, + patchApplication, + deleteApplication, + getAppCategories, + updateApplicationOrder, +} = require("./commands/applicationData.cjs"); +const { + getBookmarks, + postBookmark, + patchBookmark, + deleteBookmark, + patchBookmarkOrder, + getBookmarkCategories, + postBookmarkCategory, + patchBookmarkCategory, + deleteBookmarkCategory, + patchBookmarkCategoryOrder, +} = require("./commands/bookmarkData.cjs"); +const { + getProviders, + getDefaultProvider, + postProvider, + patchProvider, + deleteProvider, +} = require("./commands/providerData.cjs"); + +const { + getThemes, + addTheme, + updateTheme, + deleteTheme, + getThemePlaylists, + addThemePlaylist, + updateThemePlaylist, + deleteThemePlaylist, + getBackgrounds, + uploadBackground, + updateBackground, + deleteBackground, +} = require("./commands/themeData.cjs"); + +const { + getWolClients, + createWolClient, + updateWolClient, + deleteWolClient, + wakeWolClient, +} = require("./commands/wolData.cjs"); + +const { + getGuacamoleClients, + createGuacamoleClient, + updateGuacamoleClient, + deleteGuacamoleClient, +} = require("./commands/guacamoleData.cjs"); + +const { + getSearchHistory, + addSearchHistoryItem, + deleteSearchHistoryItem, +} = require("./commands/SearchData.cjs"); const storage = multer.diskStorage({ destination: (_req, _file, cb) => { @@ -30,6 +107,9 @@ const storage = multer.diskStorage({ const uploads = multer({ storage: storage }); +const app = express(); + +app.use(cors()); app.use(bodyParser.json({ limit: "50mb" })); app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); app.use( @@ -41,770 +121,182 @@ app.use( // Personal Data // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/personalData`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * FROM trigger_database.personalData;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/personalData`, getPersonalData); -app.get(`/${process.env.API_URI}/api/guacamoleHost`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT guacamoleHost FROM trigger_database.personalData;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}) +app.get(`/${process.env.API_URI}/api/guacamoleHost`, getGuacamoleHost); -app.get(`/${process.env.API_URI}/api/guacamoleEnabled`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT enableGuacamole FROM trigger_database.personalData;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}) +app.get(`/${process.env.API_URI}/api/guacamoleEnabled`, getGuacamoleEnabled); -app.get(`/${process.env.API_URI}/api/wolEnabled`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT enableWol FROM trigger_database.personalData;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}) +app.get(`/${process.env.API_URI}/api/wolEnabled`, getWolEnabled); -app.patch(`/${process.env.API_URI}/api/personalData`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.personalData SET firstName = ${escapeString(req.body.firstName)}, lastName = ${escapeString(req.body.lastName)}, email = ${escapeString(req.body.email)}, physicalAddress = ${escapeString(req.body.physicalAddress)}, enableWol = ${req.body.enableWol}, enableGuacamole = ${req.body.enableGuacamole}, guacamoleHost = ${escapeString(req.body.guacamoleHost ?? "")}, nickname = ${escapeString(req.body.nickname ?? "")}, defaultFont = ${escapeString(req.body.defaultFont)};`; - - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/personalData`, updatePersonalData); ////////////////////////////////////////////// // Messages // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/messages`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * FROM trigger_database.messages;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/messages`, getMessages); -app.get(`/${process.env.API_URI}/api/displayedGreeting`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = - "SELECT * FROM trigger_database.messages WHERE customGreeting = 1 ORDER BY RAND() LIMIT 1;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/displayedGreeting`, getDisplayedGreeting); -app.post(`/${process.env.API_URI}/api/messages`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.messages (message) VALUES (${escapeString(req.body.message)});`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/messages`, postMessage); -app.patch(`/${process.env.API_URI}/api/messages`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.messages SET message = ${escapeString(req.body.message)}, customGreeting = ${req.body.customGreeting} WHERE id = ${req.body.id};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/messages`, patchMessage); -app.delete(`/${process.env.API_URI}/api/messages`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.messages WHERE id = ${req.body.id};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/messages`, deleteMessage); ////////////////////////////////////////////// // Application Data // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/applications`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * FROM trigger_database.applications;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/applications`, getApplications); -app.get(`/${process.env.API_URI}/api/enabledApplications`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = - "SELECT * FROM trigger_database.applications WHERE enabled = 1;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get( + `/${process.env.API_URI}/api/enabledApplications`, + getEnabledApplications, +); -app.post(`/${process.env.API_URI}/api/applications`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.applications (name, url, icon, baseUrl, filterName, enabled, \`index\`) VALUES (${escapeString(req.body.name)}, ${escapeString(req.body.url)}, ${escapeString(req.body.icon)}, ${escapeString(req.body.baseUrl)}, ${escapeString(req.body.filterName)}, ${req.body.enabled}, ${req.body.index});`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/applications`, postApplication); -app.patch(`/${process.env.API_URI}/api/applications`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.applications SET name = ${escapeString(req.body.name)}, url = ${escapeString(req.body.url)}, icon = ${escapeString(req.body.icon)}, baseUrl = ${escapeString(req.body.baseUrl)}, filterName = ${escapeString(req.body.filterName)}, enabled = ${req.body.enabled} WHERE id = ${req.body.id};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/applications`, patchApplication); -app.delete(`/${process.env.API_URI}/api/applications`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.applications WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/applications`, deleteApplication); -app.get(`/${process.env.API_URI}/api/appCategories`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = - "SELECT filterName FROM trigger_database.applications UNION SELECT filterName FROM trigger_database.bookmarkCategories;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/appCategories`, getAppCategories); -app.patch(`/${process.env.API_URI}/api/applicationOrder`, async (req, res) => { - const conn = await pool.getConnection(); - req.body.map((link) => { - conn - .query( - "UPDATE trigger_database.applications SET `index` = ? where id IN (?)", - [link.index, link.id], - ) - .then((_rows) => { - res.status(200); - }); - }); - res.send({ status: "success" }); - conn.end(); -}); +app.patch( + `/${process.env.API_URI}/api/applicationOrder`, + updateApplicationOrder, +); ////////////////////////////////////////////// // Bookmark Data // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/bookmarks`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * FROM trigger_database.bookmarks;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/bookmarks`, getBookmarks); -app.post(`/${process.env.API_URI}/api/bookmarks`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.bookmarks (name, url, category, \`index\`, enabled) VALUES (${escapeString(req.body.name)}, ${escapeString(req.body.url)}, ${escapeString(req.body.category)}, ${req.body.index}, ${req.body.enabled});`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/bookmarks`, postBookmark); -app.patch(`/${process.env.API_URI}/api/bookmarks`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.bookmarks SET name = ${escapeString(req.body.name)}, url = ${escapeString(req.body.url)}, category = ${escapeString(req.body.category)}, \`index\` = ${req.body.index}, enabled = ${req.body.enabled} WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/bookmarks`, patchBookmark); -app.delete(`/${process.env.API_URI}/api/bookmarks`, async (req, res) => { - const conn = await pool.getConnection(); - if (req.body.length > 1) { - req.body.map((link) => { - conn - .query("DELETE FROM trigger_database.bookmarks where id IN (?)", [ - link.id, - ]) - .then(() => { - res.status(200); - }); - }); - res.send({ status: "success" }); - } else { - const query = `DELETE FROM trigger_database.bookmarks WHERE id = ${req.body.id}`; - conn - .query(query) - .then(() => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - } - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/bookmarks`, deleteBookmark); -app.patch(`/${process.env.API_URI}/api/bookmarkOrder`, async (req, res) => { - const conn = await pool.getConnection(); - req.body.map((link) => { - conn - .query( - "UPDATE trigger_database.bookmarks SET `index` = ? where id IN (?)", - [link.index, link.id], - ) - .then(() => { - res.status(200); - }); - }); - res.send({ status: "success" }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/bookmarkOrder`, patchBookmarkOrder); -app.get(`/${process.env.API_URI}/api/bookmarkCategories`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * from trigger_database.bookmarkCategories;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get( + `/${process.env.API_URI}/api/bookmarkCategories`, + getBookmarkCategories, +); -app.post(`/${process.env.API_URI}/api/bookmarkCategories`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.bookmarkCategories (categoryName, categoryIndex, filterName) VALUES (${escapeString(req.body.categoryName)},${req.body.categoryIndex || 0},${escapeString(req.body.filterName)})`; - conn.query(query).then((_rows) => { - res.status(200).send({ status: "success" }); - }); - conn.end(); -}); +app.post( + `/${process.env.API_URI}/api/bookmarkCategories`, + postBookmarkCategory, +); -app.patch(`/${process.env.API_URI}/api/bookmarkCategories`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.bookmarkCategories SET categoryName = ${escapeString(req.body.categoryName)}, filterName = ${escapeString(req.body.filterName)}, enabled = ${req.body.enabled} WHERE id = ${req.body.id};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch( + `/${process.env.API_URI}/api/bookmarkCategories`, + patchBookmarkCategory, +); -app.delete(`/${process.env.API_URI}/api/bookmarkCategories`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.bookmarkCategories WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete( + `/${process.env.API_URI}/api/bookmarkCategories`, + deleteBookmarkCategory, +); -app.patch(`/${process.env.API_URI}/api/bookmarkCategoryOrder`, async (req, res) => { - const conn = await pool.getConnection(); - req.body.map((category) => { - conn - .query( - "UPDATE trigger_database.bookmarkCategories SET categoryIndex = ? where id IN (?)", - [category.index, category.id], - ) - .then((_rows) => { - res.status(200); - }); - }); - res.send({ status: "success" }); - conn.end(); -}); +app.patch( + `/${process.env.API_URI}/api/bookmarkCategoryOrder`, + patchBookmarkCategoryOrder, +); ////////////////////////////////////////////// // Provider Data // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/providers`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * FROM trigger_database.providers;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/providers`, getProviders); -app.get(`/${process.env.API_URI}/api/providers/default`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = `SELECT * FROM trigger_database.providers WHERE \`default\` = 1;`; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/providers/default`, getDefaultProvider); -app.post(`/${process.env.API_URI}/api/providers`, async (req, res) => { - const conn = await pool.getConnection(); - if (req.body.default === true || req.body.default === 1) { - const query = `UPDATE trigger_database.providers SET \`default\` = 0;`; - conn.query(query); - } - const query = `INSERT INTO trigger_database.providers (name, url, prefix, \`default\`, icon) VALUES (${escapeString(req.body.name)}, ${escapeString(req.body.url)}, ${escapeString(req.body.prefix)}, ${req.body.default ? 1 : 0}, ${escapeString(req.body.icon)});`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/providers`, postProvider); -app.patch(`/${process.env.API_URI}/api/providers`, async (req, res) => { - const conn = await pool.getConnection(); - if (req.body.default === true || req.body.default === 1) { - const query = `UPDATE trigger_database.providers SET \`default\` = 0;`; - conn.query(query); - } - const query = `UPDATE trigger_database.providers SET name = ${escapeString(req.body.name)}, url = ${escapeString(req.body.url)}, prefix = ${escapeString(req.body.prefix)}, \`default\` = ${req.body.default}, icon = ${escapeString(req.body.icon)} WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/providers`, patchProvider); -app.delete(`/${process.env.API_URI}/api/providers`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.providers WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/providers`, deleteProvider); ////////////////////////////////////////////// // Theming // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/themes`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * FROM trigger_database.themes;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/themes`, getThemes); -app.post(`/${process.env.API_URI}/api/themes`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.themes (name, backgroundImage, backgroundColor, searchColor, primaryColor, accentColor, borderColor, themeFont) VALUES (${escapeString(req.body.name)},${escapeString(req.body.backgroundImage)},${escapeString(req.body.backgroundColor)},${escapeString(req.body.searchColor)},${escapeString(req.body.primaryColor)},${escapeString(req.body.accentColor)},${escapeString(req.body.borderColor)},${escapeString(req.body.themeFont)})`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/themes`, addTheme); -app.patch(`/${process.env.API_URI}/api/themes`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.themes SET name = ${escapeString(req.body.name)}, backgroundImage = ${escapeString(req.body.backgroundImage)}, backgroundColor = ${escapeString(req.body.backgroundColor)}, searchColor = ${escapeString(req.body.searchColor)}, primaryColor = ${escapeString(req.body.primaryColor)}, accentColor = ${escapeString(req.body.accentColor)}, borderColor = ${escapeString(req.body.borderColor)}, randomEnabled = ${req.body.randomEnabled ? 1 : 0}, textShadowsEnabled = ${req.body.textShadowsEnabled ? 1 : 0}, appShadowsEnabled = ${req.body.appShadowsEnabled ? 1 : 0}, themeFont = ${req.body.themeFont === null ? null : escapeString(req.body.themeFont)} WHERE id = ${req.body.id};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/themes`, updateTheme); -app.delete(`/${process.env.API_URI}/api/themes`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.themes WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/themes`, deleteTheme); -app.get(`/${process.env.API_URI}/api/themePlaylists`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * FROM trigger_database.themePlaylists;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/themePlaylists`, getThemePlaylists); -app.post(`/${process.env.API_URI}/api/themePlaylists`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.themePlaylists (name, themeList) VALUES (${escapeString(req.body.name)},${escapeString(req.body.themeList)});`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/themePlaylists`, addThemePlaylist); -app.patch(`/${process.env.API_URI}/api/themePlaylists`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.themePlaylists SET name = ${escapeString(req.body.name)}, themeList = ${escapeString(req.body.themeList)} WHERE id = ${req.body.id};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/themePlaylists`, updateThemePlaylist); -app.delete(`/${process.env.API_URI}/api/themePlaylists`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.themePlaylists WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/themePlaylists`, deleteThemePlaylist); -app.get(`/${process.env.API_URI}/api/backgrounds`, async (_req, res) => { - fs.readdir( - "../TriggerFrontend/backgrounds", - { withFileTypes: true }, - (_err, files) => { - res - .status(200) - .send(files.filter((file) => file.isFile()).map((file) => file.name)); - }, - ); -}); +app.get(`/${process.env.API_URI}/api/backgrounds`, getBackgrounds); app.post( `/${process.env.API_URI}/api/backgrounds`, uploads.single("background"), - async (req, res) => { - const image = req.file.path; - const thumbnail = `${req.file.destination}thumbs/${req.file.filename}`; - exec(`convert ${image} -resize 'x1080' -define jpeg:extent=300kb ${image}`); - exec( - `convert ${image} -resize 'x360' -define jpeg:extent=75kb ${thumbnail}`, - ); - res.status(200).send({ status: "success", statusText: image }); - }, + uploadBackground, ); -app.patch(`/${process.env.API_URI}/api/backgrounds`, async (req, res) => { - fs.rename( - `../TriggerFrontend/backgrounds/${req.body.fileName}`, - `../TriggerFrontend/backgrounds/${req.body.newFileName}`, - (err) => { - if (err) throw err; - }, - ); - fs.rename( - `../TriggerFrontend/backgrounds/thumbs/${req.body.fileName}`, - `../TriggerFrontend/backgrounds/thumbs/${req.body.newFileName}`, - (err) => { - if (err) throw err; - }, - ); - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.themes SET backgroundImage = ${escapeString(req.body.newFileName)} WHERE backgroundImage = ${escapeString(req.body.fileName)};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/backgrounds`, updateBackground); -app.delete(`/${process.env.API_URI}/api/backgrounds`, async (req, res) => { - fs.rm(`../TriggerFrontend/backgrounds/${req.body.fileName}`, (_err) => { - if (_err) throw _err; - }); - fs.rm( - `../TriggerFrontend/backgrounds/thumbs/${req.body.fileName}`, - (_err) => { - if (_err) throw _err; - }, - ); - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.themes SET backgroundImage = 'none' WHERE backgroundImage = ${escapeString(req.body.fileName)};`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/backgrounds`, deleteBackground); ////////////////////////////////////////////// // Wake on LAN Clients // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/wolClients`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * from trigger_database.wolClients;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/wolClients`, getWolClients); -app.post(`/${process.env.API_URI}/api/wolClients`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.wolClients (hostname, macAddress) VALUES (${escapeString(req.body.hostname)}, ${escapeString(req.body.macAddress)})`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/wolClients`, createWolClient); -app.patch(`/${process.env.API_URI}/api/wolClients`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.wolClients SET hostname = ${escapeString(req.body.hostname)}, macAddress = ${escapeString(req.body.macAddress)} WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch(`/${process.env.API_URI}/api/wolClients`, updateWolClient); -app.delete(`/${process.env.API_URI}/api/wolClients`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.wolClients WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete(`/${process.env.API_URI}/api/wolClients`, deleteWolClient); -app.post(`/${process.env.API_URI}/api/wakeClient`, async (req, res) => { - wol.wake(req.body.macAddress, () => { - res.status(200).send({ status: "success" }); - }); -}); +app.post(`/${process.env.API_URI}/api/wakeClient`, wakeWolClient); ////////////////////////////////////////////// // Guacamole Clients // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/guacamoleClients`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = "SELECT * from trigger_database.guacamoleClients;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/guacamoleClients`, getGuacamoleClients); -app.post(`/${process.env.API_URI}/api/guacamoleClients`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.guacamoleClients (clientName, clientIdentifier, enabled, type) VALUES (${escapeString(req.body.clientName)}, ${escapeString(req.body.clientIdentifier)}, ${req.body.enabled}, ${escapeString(req.body.type)})`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/guacamoleClients`, createGuacamoleClient); -app.patch(`/${process.env.API_URI}/api/guacamoleClients`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `UPDATE trigger_database.guacamoleClients SET clientName = ${escapeString(req.body.clientName)}, clientIdentifier = ${escapeString(req.body.clientIdentifier)} , enabled = ${req.body.enabled}, type = ${escapeString(req.body.type)} WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.patch( + `/${process.env.API_URI}/api/guacamoleClients`, + updateGuacamoleClient, +); -app.delete(`/${process.env.API_URI}/api/guacamoleClients`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.guacamoleClients WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete( + `/${process.env.API_URI}/api/guacamoleClients`, + deleteGuacamoleClient, +); ////////////////////////////////////////////// // Search // ////////////////////////////////////////////// -app.get(`/${process.env.API_URI}/api/searchHistory`, async (_req, res) => { - const conn = await pool.getConnection(); - const query = - "SELECT * FROM trigger_database.searchHistory ORDER BY dateTimeStamp DESC;"; - conn.query(query).then((rows) => { - res.status(200).send(rows); - }); - conn.end(); -}); +app.get(`/${process.env.API_URI}/api/searchHistory`, getSearchHistory); -app.post(`/${process.env.API_URI}/api/searchHistory`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `INSERT INTO trigger_database.searchHistory (prefix, provider, searchTerm) VALUES (${escapeString(req.body.prefix)}, ${escapeString(req.body.provider)}, ${escapeString(req.body.searchTerm)})`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.post(`/${process.env.API_URI}/api/searchHistory`, addSearchHistoryItem); -app.delete(`/${process.env.API_URI}/api/searchHistory`, async (req, res) => { - const conn = await pool.getConnection(); - const query = `DELETE FROM trigger_database.searchHistory WHERE id = ${req.body.id}`; - conn - .query(query) - .then((_rows) => { - res.status(200).send({ status: "success" }); - }) - .catch((err) => { - res.status(500).send({ error: err }); - }); - conn.end(); -}); +app.delete( + `/${process.env.API_URI}/api/searchHistory`, + deleteSearchHistoryItem, +); app.listen(process.env.API_PORT, "0.0.0.0", () => {});