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;