From d58dee6983e76977431afd178c33748459a19e2f Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Mon, 5 May 2025 14:56:24 -0400
Subject: [PATCH 01/20] add new inputfield for api key in settings
---
client/src/Pages/Settings/index.jsx | 21 +++++++++++++++++++++
1 file changed, 21 insertions(+)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index 1bad8414d..7e04d6390 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -54,6 +54,7 @@ const Settings = () => {
const [form, setForm] = useState({
enableDistributedUptime: distributedUptimeEnabled,
ttl: checkTTL ? (checkTTL / SECONDS_PER_DAY).toString() : 0,
+ pagespeedApiKey: "",
});
const [version, setVersion] = useState("unknown");
const [errors, setErrors] = useState({});
@@ -277,6 +278,26 @@ const Settings = () => {
)}
+
+
+ Google Pagespeed API Key
+
+ Manage your pagespeed API key
+
+
+
+
+
+
{isAdmin && (
From 2f8981e379a9c6aab50821d391b3dd64e35dab28 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Mon, 5 May 2025 15:10:32 -0400
Subject: [PATCH 02/20] import and use adorment in textinput to toggle
visibility
---
client/src/Pages/Settings/index.jsx | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index 7e04d6390..c43ebf69e 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -6,6 +6,7 @@ import Select from "../../Components/Inputs/Select";
import { useIsAdmin } from "../../Hooks/useIsAdmin";
import Dialog from "../../Components/Dialog";
import ConfigBox from "../../Components/ConfigBox";
+import { PasswordEndAdornment } from "../../Components/Inputs/TextInput/Adornments";
import {
WalletMultiButton,
WalletDisconnectButton,
@@ -57,6 +58,7 @@ const Settings = () => {
pagespeedApiKey: "",
});
const [version, setVersion] = useState("unknown");
+ const [apiKeyFieldType, setApiKeyFieldType] = useState("password");
const [errors, setErrors] = useState({});
const deleteStatsMonitorsInitState = { deleteMonitors: false, deleteStats: false };
const [isOpen, setIsOpen] = useState(deleteStatsMonitorsInitState);
@@ -290,11 +292,17 @@ const Settings = () => {
id="pagespeedApiKey"
label="PageSpeed API Key"
value={form.pagespeedApiKey}
+ type={apiKeyFieldType}
onChange={handleChange}
- type="password"
optionalLabel="(Optional)"
- helperText={errors.pagespeedApiKey}
error={!!errors.pagespeedApiKey}
+ helperText={errors.pagespeedApiKey}
+ endAdornment={
+
+ }
/>
From cc454ab51962007c81e69211a9d2e8e1d3c9f68e Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Mon, 5 May 2025 16:02:59 -0400
Subject: [PATCH 03/20] update loadSettings logic to prioritize db env values
for testing
---
server/service/settingsService.js | 7 ++-----
1 file changed, 2 insertions(+), 5 deletions(-)
diff --git a/server/service/settingsService.js b/server/service/settingsService.js
index 1443755f9..91dd73b38 100755
--- a/server/service/settingsService.js
+++ b/server/service/settingsService.js
@@ -48,12 +48,9 @@ class SettingsService {
// If there are any settings that weren't set by environment variables, use user settings from DB
for (const key in envConfig) {
- if (
- typeof envConfig?.[key] === "undefined" &&
- typeof dbSettings?.[key] !== "undefined"
- ) {
+ if (typeof dbSettings?.[key] !== "undefined") {
this.settings[key] = dbSettings[key];
- }
+ }
}
await this.appSettings.updateOne({}, { $set: this.settings }, { upsert: true });
From d4ed97992fad549c59d34901efb7daff360184ee Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Mon, 5 May 2025 16:03:30 -0400
Subject: [PATCH 04/20] update dispatch action to include pagespeedapi key
---
client/src/Pages/Settings/index.jsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index c43ebf69e..456e620ff 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -128,7 +128,7 @@ const Settings = () => {
const updatedUser = { ...user, checkTTL: form.ttl };
const [userAction, settingsAction] = await Promise.all([
dispatch(update({ localData: updatedUser })),
- dispatch(updateAppSettings({ settings: { language: language } })),
+ dispatch(updateAppSettings({ settings: { language: language, pagespeedApiKey: form.pagespeedApiKey } })),
]);
if (userAction.payload.success && settingsAction.payload.success) {
From 86c31eaaf6174dfe339b982edf57728f9b3d90c5 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Mon, 5 May 2025 16:06:24 -0400
Subject: [PATCH 05/20] add pagespeed key to settings validation
---
client/src/Validation/validation.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/client/src/Validation/validation.js b/client/src/Validation/validation.js
index 38092c9e6..0e303c27f 100644
--- a/client/src/Validation/validation.js
+++ b/client/src/Validation/validation.js
@@ -255,6 +255,7 @@ const settingsValidation = joi.object({
ttl: joi.number().required().messages({
"string.empty": "TTL is required",
}),
+ pagespeedApiKey: joi.string().allow("").optional(),
});
const dayjsValidator = (value, helpers) => {
From 47f84941937a85737ccc1121a7e86710f2541ce3 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Tue, 6 May 2025 14:29:59 -0400
Subject: [PATCH 06/20] update handlechange to modify form validation logic
---
client/src/Pages/Settings/index.jsx | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index 456e620ff..64607648d 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -94,12 +94,17 @@ const Settings = () => {
return;
}
+ let inputValue = value;
+ if (id === "ttl") {
+ inputValue = value.replace(/[^0-9]/g, "");
+ }
+
+ const updatedForm = { ...form, [id]: inputValue };
const { error } = settingsValidation.validate(
- { [id]: value },
- {
- abortEarly: false,
- }
+ updatedForm,
+ { abortEarly: false }
);
+
if (!error || error.details.length === 0) {
setErrors({});
} else {
@@ -110,12 +115,8 @@ const Settings = () => {
setErrors(newErrors);
logger.error("Validation errors:", error.details);
}
- let inputValue = value;
- id === "ttl" && (inputValue = value.replace(/[^0-9]/g, ""));
- setForm((prev) => ({
- ...prev,
- [id]: inputValue,
- }));
+
+ setForm(updatedForm);
};
// TODO Handle saving
From 336ffcc9e98235a71a6f18c1261f8b691df72516 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Tue, 6 May 2025 14:53:24 -0400
Subject: [PATCH 07/20] Add .unknown(true) to validation schema to ignore extra
fields
---
client/src/Validation/validation.js | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/client/src/Validation/validation.js b/client/src/Validation/validation.js
index 0e303c27f..9c4b12c7a 100644
--- a/client/src/Validation/validation.js
+++ b/client/src/Validation/validation.js
@@ -256,7 +256,8 @@ const settingsValidation = joi.object({
"string.empty": "TTL is required",
}),
pagespeedApiKey: joi.string().allow("").optional(),
-});
+})
+.unknown(true);
const dayjsValidator = (value, helpers) => {
if (!dayjs(value).isValid()) {
From 9dc6c3c7b1046915f881f86d6df01f9477aecae1 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Tue, 6 May 2025 14:57:07 -0400
Subject: [PATCH 08/20] revert loadsettings changes
---
server/service/settingsService.js | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/server/service/settingsService.js b/server/service/settingsService.js
index 91dd73b38..1443755f9 100755
--- a/server/service/settingsService.js
+++ b/server/service/settingsService.js
@@ -48,9 +48,12 @@ class SettingsService {
// If there are any settings that weren't set by environment variables, use user settings from DB
for (const key in envConfig) {
- if (typeof dbSettings?.[key] !== "undefined") {
+ if (
+ typeof envConfig?.[key] === "undefined" &&
+ typeof dbSettings?.[key] !== "undefined"
+ ) {
this.settings[key] = dbSettings[key];
- }
+ }
}
await this.appSettings.updateOne({}, { $set: this.settings }, { upsert: true });
From 3e8f3a7a89e72615e06786075e6d1aca2b7ad9c9 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Tue, 6 May 2025 15:56:01 -0400
Subject: [PATCH 09/20] include pagespeedapikey to parsedSettings to save in db
---
client/src/Features/Settings/settingsSlice.js | 1 +
1 file changed, 1 insertion(+)
diff --git a/client/src/Features/Settings/settingsSlice.js b/client/src/Features/Settings/settingsSlice.js
index 614ab7159..51f85a2b5 100644
--- a/client/src/Features/Settings/settingsSlice.js
+++ b/client/src/Features/Settings/settingsSlice.js
@@ -33,6 +33,7 @@ export const updateAppSettings = createAsyncThunk(
try {
const parsedSettings = {
language: settings.language,
+ pagespeedApiKey: settings.pagespeedApiKey,
};
const res = await networkService.updateAppSettings({ settings: parsedSettings });
return res.data;
From b493b5e0e5749b7b8ee528ddefb7991c3db46e73 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Tue, 6 May 2025 15:57:00 -0400
Subject: [PATCH 10/20] modify loadSettings logic to fetch env from DB
---
server/service/settingsService.js | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/server/service/settingsService.js b/server/service/settingsService.js
index 1443755f9..7a219a89d 100755
--- a/server/service/settingsService.js
+++ b/server/service/settingsService.js
@@ -48,11 +48,14 @@ class SettingsService {
// If there are any settings that weren't set by environment variables, use user settings from DB
for (const key in envConfig) {
- if (
- typeof envConfig?.[key] === "undefined" &&
- typeof dbSettings?.[key] !== "undefined"
- ) {
- this.settings[key] = dbSettings[key];
+
+ const envValue = envConfig[key];
+ const dbValue = dbSettings?.[key];
+
+ if (envValue === undefined || envValue === "") {
+ if (dbValue !== undefined) {
+ this.settings[key] = dbValue;
+ }
}
}
From 85c3a16f411e5a94d3662a971f22e0488855f79d Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Tue, 6 May 2025 16:45:48 -0400
Subject: [PATCH 11/20] add pagespeed to intialstate and handler in
settingsslice
---
client/src/Features/Settings/settingsSlice.js | 2 ++
server/service/settingsService.js | 13 +++++--------
2 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/client/src/Features/Settings/settingsSlice.js b/client/src/Features/Settings/settingsSlice.js
index 51f85a2b5..35e17e360 100644
--- a/client/src/Features/Settings/settingsSlice.js
+++ b/client/src/Features/Settings/settingsSlice.js
@@ -6,6 +6,7 @@ const initialState = {
apiBaseUrl: "",
logLevel: "debug",
language: "",
+ pagespeedApiKey: "",
};
export const getAppSettings = createAsyncThunk(
@@ -57,6 +58,7 @@ const handleGetSettingsFulfilled = (state, action) => {
state.apiBaseUrl = action.payload.data.apiBaseUrl;
state.logLevel = action.payload.data.logLevel;
state.language = action.payload.data.language;
+ state.pagespeedApiKey = action.payload.data.pagespeedApiKey;
};
const handleGetSettingsRejected = (state, action) => {
state.isLoading = false;
diff --git a/server/service/settingsService.js b/server/service/settingsService.js
index 7a219a89d..1443755f9 100755
--- a/server/service/settingsService.js
+++ b/server/service/settingsService.js
@@ -48,14 +48,11 @@ class SettingsService {
// If there are any settings that weren't set by environment variables, use user settings from DB
for (const key in envConfig) {
-
- const envValue = envConfig[key];
- const dbValue = dbSettings?.[key];
-
- if (envValue === undefined || envValue === "") {
- if (dbValue !== undefined) {
- this.settings[key] = dbValue;
- }
+ if (
+ typeof envConfig?.[key] === "undefined" &&
+ typeof dbSettings?.[key] !== "undefined"
+ ) {
+ this.settings[key] = dbSettings[key];
}
}
From 91d373264511a2b4ab25834c003acfdd0ed9dfa9 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Tue, 6 May 2025 16:47:53 -0400
Subject: [PATCH 12/20] add useffect to load pagespeed key in the form
---
client/src/Pages/Settings/index.jsx | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index 64607648d..b82407e05 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -83,6 +83,15 @@ const Settings = () => {
fetchLatestVersion();
}, []);
+ const { pagespeedApiKey } = useSelector((state) => state.settings);
+
+ useEffect(() => {
+ setForm((prev) => ({
+ ...prev,
+ pagespeedApiKey: pagespeedApiKey || "",
+ }));
+ }, [pagespeedApiKey]);
+
const handleChange = (event) => {
const { type, checked, value, id } = event.target;
From 26e9ff3568a31aef466774abe64f98cd1864a74a Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Wed, 7 May 2025 13:51:34 -0400
Subject: [PATCH 13/20] add flag to track if api key is set
---
client/src/Pages/Settings/index.jsx | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index b82407e05..9c6b0f94f 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -7,6 +7,7 @@ import { useIsAdmin } from "../../Hooks/useIsAdmin";
import Dialog from "../../Components/Dialog";
import ConfigBox from "../../Components/ConfigBox";
import { PasswordEndAdornment } from "../../Components/Inputs/TextInput/Adornments";
+import { getAppSettings } from "../../Features/Settings/settingsSlice";
import {
WalletMultiButton,
WalletDisconnectButton,
@@ -59,6 +60,7 @@ const Settings = () => {
});
const [version, setVersion] = useState("unknown");
const [apiKeyFieldType, setApiKeyFieldType] = useState("password");
+ const [isApiKeySet, setIsApiKeySet] = useState(false);
const [errors, setErrors] = useState({});
const deleteStatsMonitorsInitState = { deleteMonitors: false, deleteStats: false };
const [isOpen, setIsOpen] = useState(deleteStatsMonitorsInitState);
@@ -83,6 +85,10 @@ const Settings = () => {
fetchLatestVersion();
}, []);
+ useEffect(() => {
+ dispatch(getAppSettings());
+ }, []);
+
const { pagespeedApiKey } = useSelector((state) => state.settings);
useEffect(() => {
From 8ce7477b069a8c63942548eae9c67ae6a0a55383 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Wed, 7 May 2025 13:52:48 -0400
Subject: [PATCH 14/20] update useffect to handle pagespeed key
---
client/src/Pages/Settings/index.jsx | 19 ++++++++++++++-----
1 file changed, 14 insertions(+), 5 deletions(-)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index 9c6b0f94f..77ce770bd 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -92,11 +92,20 @@ const Settings = () => {
const { pagespeedApiKey } = useSelector((state) => state.settings);
useEffect(() => {
- setForm((prev) => ({
- ...prev,
- pagespeedApiKey: pagespeedApiKey || "",
- }));
- }, [pagespeedApiKey]);
+ if (pagespeedApiKey) {
+ setIsApiKeySet(true);
+ setForm((prev) => ({
+ ...prev,
+ pagespeedApiKey: "********",
+ }));
+ } else {
+ setIsApiKeySet(false);
+ setForm((prev) => ({
+ ...prev,
+ pagespeedApiKey: "",
+ }));
+ }
+ }, [pagespeedApiKey]);
const handleChange = (event) => {
const { type, checked, value, id } = event.target;
From d963fe65c1a582d29063c905fe3ac753da6d2fa9 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Wed, 7 May 2025 13:53:45 -0400
Subject: [PATCH 15/20] add handler function to reset api key
---
client/src/Pages/Settings/index.jsx | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index 77ce770bd..834d7d4b6 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -215,6 +215,14 @@ const Settings = () => {
}
};
+ const handleResetApiKey = () => {
+ setIsApiKeySet(false);
+ setForm((prev) => ({
+ ...prev,
+ pagespeedApiKey: "",
+ }));
+ };
+
const languages = Object.keys(i18n.options.resources || {});
return (
From f2e8f16af8ac1ede6bacdfba1d4e4f18b2655544 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Wed, 7 May 2025 13:55:48 -0400
Subject: [PATCH 16/20] update pagespeed input field jsx
---
client/src/Pages/Settings/index.jsx | 46 +++++++++++++++++++----------
1 file changed, 31 insertions(+), 15 deletions(-)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index 834d7d4b6..b2f90f554 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -321,22 +321,38 @@ const Settings = () => {
-
+
+
+ )
+ }
/>
- }
- />
+
+ {isApiKeySet && (
+
+ )}
+
{isAdmin && (
From e7742f9be8b7c129dc0ef5091050f780382fd3a9 Mon Sep 17 00:00:00 2001
From: Vishnu Sreekumaran Nair <200557136@student.georgianc.on.ca>
Date: Wed, 7 May 2025 14:17:47 -0400
Subject: [PATCH 17/20] update helpertext and add typography component to
display note
---
client/src/Pages/Settings/index.jsx | 15 ++++++++-------
1 file changed, 8 insertions(+), 7 deletions(-)
diff --git a/client/src/Pages/Settings/index.jsx b/client/src/Pages/Settings/index.jsx
index b2f90f554..f1413c2b5 100644
--- a/client/src/Pages/Settings/index.jsx
+++ b/client/src/Pages/Settings/index.jsx
@@ -96,7 +96,7 @@ const Settings = () => {
setIsApiKeySet(true);
setForm((prev) => ({
...prev,
- pagespeedApiKey: "********",
+ pagespeedApiKey: "*************************************",
}));
} else {
setIsApiKeySet(false);
@@ -332,11 +332,7 @@ const Settings = () => {
disabled={isApiKeySet}
optionalLabel="(Optional)"
error={!!errors.pagespeedApiKey}
- helperText={
- isApiKeySet
- ? "API key is set. Click Reset to change it."
- : errors.pagespeedApiKey
- }
+ helperText={errors.pagespeedApiKey}
endAdornment={
!isApiKeySet && (
{
)
}
/>
+ {isApiKeySet && (
+
+ API key is set. Click Reset to change it.
+
+ )}
{isApiKeySet && (
-