From a377532d2238bd8a2719c40afc647723f00b3817 Mon Sep 17 00:00:00 2001
From: Bernd Storath <999999bst@gmail.com>
Date: Mon, 10 Feb 2025 14:16:58 +0100
Subject: [PATCH] change metrics settings in admin panel
---
src/app/components/form/DateField.vue | 2 +-
src/app/components/form/NullTextField.vue | 26 ++++++++++++++++
src/app/pages/admin.vue | 1 -
src/app/pages/admin/index.vue | 14 +++++++++
src/app/pages/admin/metrics.vue | 3 --
src/app/pages/me.vue | 23 +++++---------
src/app/pages/setup/1.vue | 10 ++-----
src/server/api/admin/general.get.ts | 6 ++--
.../database/repositories/general/service.ts | 30 ++++++++++++++-----
.../database/repositories/general/types.ts | 9 ++++++
10 files changed, 85 insertions(+), 39 deletions(-)
create mode 100644 src/app/components/form/NullTextField.vue
delete mode 100644 src/app/pages/admin/metrics.vue
diff --git a/src/app/components/form/DateField.vue b/src/app/components/form/DateField.vue
index 2e57b8c0..a675796a 100644
--- a/src/app/components/form/DateField.vue
+++ b/src/app/components/form/DateField.vue
@@ -14,7 +14,7 @@
diff --git a/src/app/pages/admin.vue b/src/app/pages/admin.vue
index ba2f4169..aeb01b3d 100644
--- a/src/app/pages/admin.vue
+++ b/src/app/pages/admin.vue
@@ -45,7 +45,6 @@ const menuItems = [
{ id: 'config', name: 'Config' },
{ id: 'interface', name: 'Interface' },
{ id: 'hooks', name: 'Hooks' },
- { id: 'metrics', name: 'Metrics' },
];
const activeMenuItem = computed(() => {
diff --git a/src/app/pages/admin/index.vue b/src/app/pages/admin/index.vue
index a9979e2c..fb711551 100644
--- a/src/app/pages/admin/index.vue
+++ b/src/app/pages/admin/index.vue
@@ -8,6 +8,20 @@
label="Session Timeout"
/>
+
+ Metrics
+
+
+
+
Actions
diff --git a/src/app/pages/admin/metrics.vue b/src/app/pages/admin/metrics.vue
deleted file mode 100644
index 056d8979..00000000
--- a/src/app/pages/admin/metrics.vue
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/src/app/pages/me.vue b/src/app/pages/me.vue
index bbe2989e..b1de45a1 100644
--- a/src/app/pages/me.vue
+++ b/src/app/pages/me.vue
@@ -9,7 +9,11 @@
{{ $t('me.sectionGeneral') }}
-
+
@@ -49,20 +53,7 @@ authStore.update();
const toast = useToast();
const name = ref(authStore.userData?.name);
-
-const rawEmail = ref(authStore.userData?.email);
-const email = computed({
- get: () => rawEmail.value ?? undefined,
- set: (value) => {
- const temp = value?.trim() ?? null;
- if (temp === '') {
- rawEmail.value = null;
- return;
- }
- rawEmail.value = temp;
- return;
- },
-});
+const email = ref(authStore.userData?.email);
async function submit() {
try {
@@ -70,7 +61,7 @@ async function submit() {
method: 'post',
body: {
name: name.value,
- email: rawEmail.value,
+ email: email.value,
},
});
toast.showToast({
diff --git a/src/app/pages/setup/1.vue b/src/app/pages/setup/1.vue
index decfb2d9..4b7cedfd 100644
--- a/src/app/pages/setup/1.vue
+++ b/src/app/pages/setup/1.vue
@@ -6,7 +6,9 @@
- Continue
+
+ Continue
+
@@ -17,10 +19,4 @@ definePageMeta({
const setupStore = useSetupStore();
setupStore.setStep(1);
-
-const router = useRouter();
-
-async function nextStep() {
- router.push('/setup/2');
-}
diff --git a/src/server/api/admin/general.get.ts b/src/server/api/admin/general.get.ts
index d27f39f9..965cebe2 100644
--- a/src/server/api/admin/general.get.ts
+++ b/src/server/api/admin/general.get.ts
@@ -1,6 +1,4 @@
export default definePermissionEventHandler(actions.ADMIN, async () => {
- const sessionConfig = await Database.general.getSessionConfig();
- return {
- sessionTimeout: sessionConfig.sessionTimeout,
- };
+ const generalConfig = await Database.general.getConfig();
+ return generalConfig;
});
diff --git a/src/server/database/repositories/general/service.ts b/src/server/database/repositories/general/service.ts
index 590a6e5d..449dbfab 100644
--- a/src/server/database/repositories/general/service.ts
+++ b/src/server/database/repositories/general/service.ts
@@ -29,25 +29,31 @@ function createPreparedStatement(db: DBType) {
},
})
.prepare(),
- updateSetupStep: db
- .update(general)
- .set({
- setupStep: sql.placeholder('setupStep') as never as number,
+ getConfig: db.query.general
+ .findFirst({
+ columns: {
+ sessionTimeout: true,
+ metricsPrometheus: true,
+ metricsJson: true,
+ metricsPassword: true,
+ },
})
.prepare(),
- update: db
+ updateSetupStep: db
.update(general)
.set({
- sessionTimeout: sql.placeholder('sessionTimeout') as never as number,
+ setupStep: sql.placeholder('setupStep') as never as number,
})
.prepare(),
};
}
export class GeneralService {
+ #db: DBType;
#statements: ReturnType;
constructor(db: DBType) {
+ this.#db = db;
this.#statements = createPreparedStatement(db);
}
@@ -102,6 +108,16 @@ export class GeneralService {
}
update(data: GeneralUpdateType) {
- return this.#statements.update.execute(data);
+ return this.#db.update(general).set(data).execute();
+ }
+
+ async getConfig() {
+ const result = await this.#statements.getConfig.execute();
+
+ if (!result) {
+ throw new Error('General Config not found');
+ }
+
+ return result;
}
}
diff --git a/src/server/database/repositories/general/types.ts b/src/server/database/repositories/general/types.ts
index 05944528..74d8dfc2 100644
--- a/src/server/database/repositories/general/types.ts
+++ b/src/server/database/repositories/general/types.ts
@@ -5,9 +5,18 @@ import z from 'zod';
export type GeneralType = InferSelectModel;
const sessionTimeout = z.number({ message: 'zod.general.sessionTimeout' });
+const metricsEnabled = z.boolean({ message: 'zod.general.metricsEnabled' });
+const metricsPassword = z
+ .string({ message: 'zod.general.metricsPassword' })
+ .min(1, { message: 'zod.general.metricsPasswordMin' })
+ // TODO: validate argon2 regex?
+ .nullable();
export const GeneralUpdateSchema = z.object({
sessionTimeout: sessionTimeout,
+ metricsPrometheus: metricsEnabled,
+ metricsJson: metricsEnabled,
+ metricsPassword: metricsPassword,
});
export type GeneralUpdateType = z.infer;