From 5f34a4e04e451bdc62990947ecc8a46ec82677e7 Mon Sep 17 00:00:00 2001 From: Bernd Storath <999999bst@gmail.com> Date: Tue, 12 Nov 2024 08:24:02 +0100 Subject: [PATCH] improve setup --- src/app/pages/setup/1.vue | 3 +- src/app/pages/setup/4.vue | 2 +- src/app/pages/setup/5.vue | 2 +- src/app/stores/global.ts | 63 ++++++++++--------- src/app/stores/setup.ts | 36 ++++++++--- src/app/utils/api.ts | 36 ----------- src/server/api/account/create.post.ts | 8 --- src/server/api/{ => admin}/lang.post.ts | 2 - src/server/api/setup/1.post.ts | 14 +++++ .../api/setup/{account.post.ts => 4.post.ts} | 9 +-- .../api/setup/{hostport.post.ts => 5.post.ts} | 9 +-- .../{migration.post.ts => migrate.post.ts} | 2 +- 12 files changed, 91 insertions(+), 95 deletions(-) delete mode 100644 src/server/api/account/create.post.ts rename src/server/api/{ => admin}/lang.post.ts (67%) create mode 100644 src/server/api/setup/1.post.ts rename src/server/api/setup/{account.post.ts => 4.post.ts} (99%) rename src/server/api/setup/{hostport.post.ts => 5.post.ts} (99%) rename src/server/api/setup/{migration.post.ts => migrate.post.ts} (100%) diff --git a/src/app/pages/setup/1.vue b/src/app/pages/setup/1.vue index fd4a0fca..fbe34bae 100644 --- a/src/app/pages/setup/1.vue +++ b/src/app/pages/setup/1.vue @@ -25,11 +25,10 @@ function handleEventUpdateLang(value: string) { const setupStore = useSetupStore(); setupStore.setStep(1); -const globalStore = useGlobalStore(); const router = useRouter(); async function updateLang() { try { - await globalStore.updateLang(locale.value); + await setupStore.step1(locale.value); router.push('/setup/2'); } catch (error) { if (error instanceof FetchError) { diff --git a/src/app/pages/setup/4.vue b/src/app/pages/setup/4.vue index 06d92864..cbb31503 100644 --- a/src/app/pages/setup/4.vue +++ b/src/app/pages/setup/4.vue @@ -65,7 +65,7 @@ async function newAccount() { return; } - await setupStore.signup(username.value, password.value, accept.value); + await setupStore.step4(username.value, password.value, accept.value); await router.push('/setup/5'); } catch (error) { if (error instanceof FetchError) { diff --git a/src/app/pages/setup/5.vue b/src/app/pages/setup/5.vue index dfc2a958..5358eab2 100644 --- a/src/app/pages/setup/5.vue +++ b/src/app/pages/setup/5.vue @@ -53,7 +53,7 @@ async function updateHostPort() { } try { - await setupStore.updateHostPort(host.value, port.value); + await setupStore.step5(host.value, port.value); await router.push('/setup/success'); } catch (error) { if (error instanceof FetchError) { diff --git a/src/app/stores/global.ts b/src/app/stores/global.ts index 156cb6cd..cef17527 100644 --- a/src/app/stores/global.ts +++ b/src/app/stores/global.ts @@ -1,27 +1,6 @@ import { defineStore } from 'pinia'; export const useGlobalStore = defineStore('Global', () => { - const uiShowCharts = ref(getItem('uiShowCharts') === '1'); - const currentRelease = ref(null); - const latestRelease = ref( - null - ); - const updateAvailable = ref(false); - const features = ref({ - sortClients: { - enabled: false, - }, - clientExpiration: { - enabled: false, - }, - oneTimeLinks: { - enabled: false, - }, - }); - const statistics = ref({ - enabled: false, - chartType: 0, - }); const sortClient = ref(true); // Sort clients by name, true = asc, false = desc const { availableLocales, locale } = useI18n(); @@ -39,6 +18,12 @@ export const useGlobalStore = defineStore('Global', () => { } } + const currentRelease = ref(null); + const latestRelease = ref( + null + ); + const updateAvailable = ref(false); + async function fetchRelease() { const { data: release } = await useFetch('/api/release', { method: 'get', @@ -53,6 +38,18 @@ export const useGlobalStore = defineStore('Global', () => { updateAvailable.value = release.value.updateAvailable; } + const features = ref({ + sortClients: { + enabled: false, + }, + clientExpiration: { + enabled: false, + }, + oneTimeLinks: { + enabled: false, + }, + }); + async function fetchFeatures() { const { data: apiFeatures } = await useFetch('/api/features', { method: 'get', @@ -62,6 +59,11 @@ export const useGlobalStore = defineStore('Global', () => { } } + const statistics = ref({ + enabled: false, + chartType: 0, + }); + async function fetchStatistics() { const { data: apiStatistics } = await useFetch('/api/statistics', { method: 'get', @@ -71,6 +73,8 @@ export const useGlobalStore = defineStore('Global', () => { } } + const uiShowCharts = ref(getItem('uiShowCharts') === '1'); + const updateCharts = computed(() => { return statistics.value.chartType > 0 && uiShowCharts.value; }); @@ -78,24 +82,27 @@ export const useGlobalStore = defineStore('Global', () => { /** * @throws if unsuccessful */ - async function updateLang(language: string) { - const response = await api.updateLang({ lang: language }); + async function updateLang(lang: string) { + const response = await $fetch('/api/admin/lang', { + method: 'post', + body: { lang }, + }); return response.success; } return { - uiShowCharts, - updateCharts, sortClient, - features, + setLanguage, currentRelease, latestRelease, updateAvailable, - statistics, fetchRelease, + features, fetchFeatures, - setLanguage, + statistics, fetchStatistics, + uiShowCharts, + updateCharts, updateLang, }; }); diff --git a/src/app/stores/setup.ts b/src/app/stores/setup.ts index ba7224e3..ec1ce5cf 100644 --- a/src/app/stores/setup.ts +++ b/src/app/stores/setup.ts @@ -4,16 +4,33 @@ export const useSetupStore = defineStore('Setup', () => { /** * @throws if unsuccessful */ - async function signup(username: string, password: string, accept: boolean) { - const response = await api.setupAdminUser({ username, password, accept }); + async function step1(lang: string) { + const response = await $fetch('/api/setup/1', { + method: 'post', + body: { lang }, + }); return response.success; } /** * @throws if unsuccessful */ - async function updateHostPort(host: string, port: number) { - const response = await api.setupHostPort({ host, port }); + async function step4(username: string, password: string, accept: boolean) { + const response = await $fetch('/api/setup/4', { + method: 'post', + body: { username, password, accept }, + }); + return response.success; + } + + /** + * @throws if unsuccessful + */ + async function step5(host: string, port: number) { + const response = await $fetch('/api/setup/5', { + method: 'post', + body: { host, port }, + }); return response.success; } @@ -21,7 +38,10 @@ export const useSetupStore = defineStore('Setup', () => { * @throws if unsuccessful */ async function runMigration(file: string) { - const response = await api.setupMigration({ file }); + const response = await $fetch('/api/setup/migrate', { + method: 'post', + body: { file }, + }); return response.success; } @@ -43,12 +63,12 @@ export const useSetupStore = defineStore('Setup', () => { } return { - signup, - updateHostPort, + step1, + step4, + step5, runMigration, error, handleError, - step, totalSteps, setStep, }; diff --git a/src/app/utils/api.ts b/src/app/utils/api.ts index e4639cc6..a27567a7 100644 --- a/src/app/utils/api.ts +++ b/src/app/utils/api.ts @@ -114,42 +114,6 @@ class API { body: { file }, }); } - - async updateLang({ lang }: { lang: string }) { - return $fetch('/api/lang', { - method: 'post', - body: { lang }, - }); - } - - async setupAdminUser({ - username, - password, - accept, - }: { - username: string; - password: string; - accept: boolean; - }) { - return $fetch('/api/setup/account', { - method: 'post', - body: { username, password, accept }, - }); - } - - async setupHostPort({ host, port }: { host: string; port: number }) { - return $fetch('/api/setup/hostport', { - method: 'post', - body: { host, port }, - }); - } - - async setupMigration({ file }: { file: string }) { - return $fetch('/api/setup/migration', { - method: 'post', - body: { file }, - }); - } } type WGClientReturn = Awaited< diff --git a/src/server/api/account/create.post.ts b/src/server/api/account/create.post.ts deleted file mode 100644 index b5194459..00000000 --- a/src/server/api/account/create.post.ts +++ /dev/null @@ -1,8 +0,0 @@ -export default defineEventHandler(async (event) => { - const { username, password } = await readValidatedBody( - event, - validateZod(passwordType) - ); - await Database.user.create(username, password); - return { success: true }; -}); diff --git a/src/server/api/lang.post.ts b/src/server/api/admin/lang.post.ts similarity index 67% rename from src/server/api/lang.post.ts rename to src/server/api/admin/lang.post.ts index 06647210..6048fbad 100644 --- a/src/server/api/lang.post.ts +++ b/src/server/api/admin/lang.post.ts @@ -1,7 +1,5 @@ export default defineEventHandler(async (event) => { const { lang } = await readValidatedBody(event, validateZod(langType)); - setHeader(event, 'Content-Type', 'application/json'); await Database.system.updateLang(lang); - SERVER_DEBUG(`Update Lang: ${lang}`); return { success: true }; }); diff --git a/src/server/api/setup/1.post.ts b/src/server/api/setup/1.post.ts new file mode 100644 index 00000000..6202ec91 --- /dev/null +++ b/src/server/api/setup/1.post.ts @@ -0,0 +1,14 @@ +export default defineEventHandler(async (event) => { + const setupDone = await Database.setup.done(); + if (setupDone) { + throw createError({ + statusCode: 400, + statusMessage: 'Invalid state', + }); + } + + const { lang } = await readValidatedBody(event, validateZod(langType)); + await Database.system.updateLang(lang); + await Database.setup.set(2); + return { success: true }; +}); diff --git a/src/server/api/setup/account.post.ts b/src/server/api/setup/4.post.ts similarity index 99% rename from src/server/api/setup/account.post.ts rename to src/server/api/setup/4.post.ts index b1329b9a..67a4b28a 100644 --- a/src/server/api/setup/account.post.ts +++ b/src/server/api/setup/4.post.ts @@ -1,8 +1,4 @@ export default defineEventHandler(async (event) => { - const { username, password } = await readValidatedBody( - event, - validateZod(passwordSetupType, event) - ); const setupDone = await Database.setup.done(); if (setupDone) { throw createError({ @@ -10,6 +6,11 @@ export default defineEventHandler(async (event) => { statusMessage: 'Invalid state', }); } + + const { username, password } = await readValidatedBody( + event, + validateZod(passwordSetupType, event) + ); await Database.user.create(username, password); await Database.setup.set(5); return { success: true }; diff --git a/src/server/api/setup/hostport.post.ts b/src/server/api/setup/5.post.ts similarity index 99% rename from src/server/api/setup/hostport.post.ts rename to src/server/api/setup/5.post.ts index 0704fbe4..fa6b9aac 100644 --- a/src/server/api/setup/hostport.post.ts +++ b/src/server/api/setup/5.post.ts @@ -1,8 +1,4 @@ export default defineEventHandler(async (event) => { - const { host, port } = await readValidatedBody( - event, - validateZod(hostPortType, event) - ); const setupDone = await Database.setup.done(); if (setupDone) { throw createError({ @@ -10,6 +6,11 @@ export default defineEventHandler(async (event) => { statusMessage: 'Invalid state', }); } + + const { host, port } = await readValidatedBody( + event, + validateZod(hostPortType, event) + ); await Database.system.updateClientsHostPort(host, port); await Database.setup.set('success'); return { success: true }; diff --git a/src/server/api/setup/migration.post.ts b/src/server/api/setup/migrate.post.ts similarity index 100% rename from src/server/api/setup/migration.post.ts rename to src/server/api/setup/migrate.post.ts index 53b18c22..6c92ccc7 100644 --- a/src/server/api/setup/migration.post.ts +++ b/src/server/api/setup/migrate.post.ts @@ -4,7 +4,6 @@ import { z } from 'zod'; import type { Database } from '~~/services/database/repositories/database'; export default defineEventHandler(async (event) => { - const { file } = await readValidatedBody(event, validateZod(fileType, event)); const setupDone = await Database.setup.done(); if (setupDone) { throw createError({ @@ -13,6 +12,7 @@ export default defineEventHandler(async (event) => { }); } + const { file } = await readValidatedBody(event, validateZod(fileType, event)); const schema = z.object({ server: z.object({ privateKey: z.string(),