From 7d333c6d93607d76bd38d34b3358c107db0de1f5 Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 17 Jun 2025 10:58:30 +0800 Subject: [PATCH 1/4] return updated settings --- server/controllers/settingsController.js | 18 ++++++++++++------ server/db/mongo/modules/settingsModule.js | 6 ++++-- server/service/settingsService.js | 14 ++++++-------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/server/controllers/settingsController.js b/server/controllers/settingsController.js index d1010c093..dd5c1b6d7 100755 --- a/server/controllers/settingsController.js +++ b/server/controllers/settingsController.js @@ -11,8 +11,7 @@ class SettingsController { this.emailService = emailService; } - getAppSettings = async (req, res, next) => { - const dbSettings = await this.settingsService.getDBSettings(); + buildAppSettings = (dbSettings) => { const sanitizedSettings = { ...dbSettings }; delete sanitizedSettings.version; @@ -30,6 +29,14 @@ class SettingsController { delete sanitizedSettings.systemEmailPassword; } returnSettings.settings = sanitizedSettings; + return returnSettings; + }; + + getAppSettings = async (req, res, next) => { + const dbSettings = await this.settingsService.getDBSettings(); + + const returnSettings = this.buildAppSettings(dbSettings); + console.log(returnSettings); return res.success({ msg: this.stringService.getAppSettings, data: returnSettings, @@ -45,12 +52,11 @@ class SettingsController { } try { - await this.db.updateAppSettings(req.body); - const updatedSettings = { ...(await this.settingsService.reloadSettings()) }; - delete updatedSettings.jwtSecret; + const updatedSettings = await this.db.updateAppSettings(req.body); + const returnSettings = this.buildAppSettings(updatedSettings); return res.success({ msg: this.stringService.updateAppSettings, - data: updatedSettings, + data: returnSettings, }); } catch (error) { next(handleError(error, SERVICE_NAME, "updateAppSettings")); diff --git a/server/db/mongo/modules/settingsModule.js b/server/db/mongo/modules/settingsModule.js index d3568ad32..4fd0d1634 100755 --- a/server/db/mongo/modules/settingsModule.js +++ b/server/db/mongo/modules/settingsModule.js @@ -26,10 +26,12 @@ const updateAppSettings = async (newSettings) => { delete update.$set.systemEmailPassword; } - const settings = await AppSettings.findOneAndUpdate({}, update, { - new: true, + await AppSettings.findOneAndUpdate({}, update, { upsert: true, }); + const settings = await AppSettings.findOne() + .select("-__v -_id -createdAt -updatedAt -singleton") + .lean(); return settings; } catch (error) { error.service = SERVICE_NAME; diff --git a/server/service/settingsService.js b/server/service/settingsService.js index bc314abff..de035922c 100755 --- a/server/service/settingsService.js +++ b/server/service/settingsService.js @@ -28,8 +28,8 @@ class SettingsService { * Constructs a new SettingsService * @constructor * @throws {Error} - */ constructor(appSettings) { - this.appSettings = appSettings; + */ constructor(AppSettings) { + this.AppSettings = AppSettings; this.settings = { ...envConfig }; } /** @@ -60,16 +60,14 @@ class SettingsService { async getDBSettings() { // Remove any old settings - await this.appSettings.deleteMany({ version: { $exists: false } }); + await this.AppSettings.deleteMany({ version: { $exists: false } }); - let settings = await this.appSettings - .findOne({ singleton: true }) + let settings = await this.AppSettings.findOne({ singleton: true }) .select("-__v -_id -createdAt -updatedAt -singleton") .lean(); if (settings === null) { - await this.appSettings.create({}); - settings = await this.appSettings - .findOne({ singleton: true }) + await this.AppSettings.create({}); + settings = await this.AppSettings.findOne({ singleton: true }) .select("-__v -_id -createdAt -updatedAt -singleton") .lean(); } From 456798ca1519cd56289f61eccca657152c49a05a Mon Sep 17 00:00:00 2001 From: Alex Holliday Date: Tue, 17 Jun 2025 10:58:41 +0800 Subject: [PATCH 2/4] move state to parent --- client/src/Hooks/settingsHooks.js | 24 ++++++++++++++--- client/src/Pages/Settings/SettingsEmail.jsx | 14 +++++----- .../src/Pages/Settings/SettingsPagespeed.jsx | 12 ++++++--- client/src/Pages/Settings/index.jsx | 26 +++++++++++++++---- 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/client/src/Hooks/settingsHooks.js b/client/src/Hooks/settingsHooks.js index 7d3ff28fc..98a21c1fa 100644 --- a/client/src/Hooks/settingsHooks.js +++ b/client/src/Hooks/settingsHooks.js @@ -3,7 +3,7 @@ import { networkService } from "../main"; import { createToast } from "../Utils/toastUtils"; import { useTranslation } from "react-i18next"; -const useFetchSettings = ({ setSettingsData }) => { +const useFetchSettings = ({ setSettingsData, setIsApiKeySet, setIsEmailPasswordSet }) => { const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(undefined); useEffect(() => { @@ -12,6 +12,8 @@ const useFetchSettings = ({ setSettingsData }) => { try { const response = await networkService.getAppSettings(); setSettingsData(response?.data?.data); + setIsApiKeySet(response?.data?.data?.pagespeedKeySet); + setIsEmailPasswordSet(response?.data?.data?.emailPasswordSet); } catch (error) { createToast({ body: "Failed to fetch settings" }); setError(error); @@ -20,12 +22,18 @@ const useFetchSettings = ({ setSettingsData }) => { } }; fetchSettings(); - }, []); + }, [setSettingsData]); return [isLoading, error]; }; -const useSaveSettings = () => { +const useSaveSettings = ({ + setSettingsData, + setIsApiKeySet, + setApiKeyHasBeenReset, + setIsEmailPasswordSet, + setEmailPasswordHasBeenReset, +}) => { const [isLoading, setIsLoading] = useState(false); const [error, setError] = useState(undefined); const { t } = useTranslation(); @@ -39,7 +47,15 @@ const useSaveSettings = () => { ttl: settings.checkTTL, }); } - console.log({ settingsResponse }); + setIsApiKeySet(settingsResponse.data.data.pagespeedKeySet); + setIsEmailPasswordSet(settingsResponse.data.data.emailPasswordSet); + if (settingsResponse.data.data.pagespeedKeySet === true) { + setApiKeyHasBeenReset(false); + } + if (settingsResponse.data.data.emailPasswordSet === true) { + setEmailPasswordHasBeenReset(false); + } + setSettingsData(settingsResponse.data.data); createToast({ body: t("settingsSuccessSaved") }); } catch (error) { createToast({ body: t("settingsFailedToSave") }); diff --git a/client/src/Pages/Settings/SettingsEmail.jsx b/client/src/Pages/Settings/SettingsEmail.jsx index e7ae88154..4bd6ff3ad 100644 --- a/client/src/Pages/Settings/SettingsEmail.jsx +++ b/client/src/Pages/Settings/SettingsEmail.jsx @@ -7,7 +7,7 @@ import Stack from "@mui/material/Stack"; // Utils import { useTheme } from "@emotion/react"; import { PropTypes } from "prop-types"; -import { useState } from "react"; +import { useState, useEffect } from "react"; import { useTranslation } from "react-i18next"; import { PasswordEndAdornment } from "../../Components/Inputs/TextInput/Adornments"; import { useSendTestEmail } from "../../Hooks/useSendTestEmail"; @@ -20,7 +20,9 @@ const SettingsEmail = ({ handleChange, settingsData, setSettingsData, - isPasswordSet, + isEmailPasswordSet, + emailPasswordHasBeenReset, + setEmailPasswordHasBeenReset, }) => { // Setup const { t } = useTranslation(); @@ -43,7 +45,6 @@ const SettingsEmail = ({ } = settingsData?.settings || {}; // Local state const [password, setPassword] = useState(""); - const [hasBeenReset, setHasBeenReset] = useState(false); // Network const [isSending, , sendTestEmail] = useSendTestEmail(); // Using empty placeholder for unused error variable @@ -152,7 +153,7 @@ const SettingsEmail = ({ onChange={handleChange} /> - {(isPasswordSet === false || hasBeenReset === true) && ( + {(isEmailPasswordSet === false || emailPasswordHasBeenReset === true) && ( {t("settingsEmailPassword")} )} - {isPasswordSet === true && hasBeenReset === false && ( + + {isEmailPasswordSet === true && emailPasswordHasBeenReset === false && ( {t("settingsEmailFieldResetLabel")}