Browse Source

improve setup

pull/1397/head
Bernd Storath 5 months ago
parent
commit
5f34a4e04e
  1. 3
      src/app/pages/setup/1.vue
  2. 2
      src/app/pages/setup/4.vue
  3. 2
      src/app/pages/setup/5.vue
  4. 63
      src/app/stores/global.ts
  5. 36
      src/app/stores/setup.ts
  6. 36
      src/app/utils/api.ts
  7. 8
      src/server/api/account/create.post.ts
  8. 2
      src/server/api/admin/lang.post.ts
  9. 14
      src/server/api/setup/1.post.ts
  10. 9
      src/server/api/setup/4.post.ts
  11. 9
      src/server/api/setup/5.post.ts
  12. 2
      src/server/api/setup/migrate.post.ts

3
src/app/pages/setup/1.vue

@ -25,11 +25,10 @@ function handleEventUpdateLang(value: string) {
const setupStore = useSetupStore(); const setupStore = useSetupStore();
setupStore.setStep(1); setupStore.setStep(1);
const globalStore = useGlobalStore();
const router = useRouter(); const router = useRouter();
async function updateLang() { async function updateLang() {
try { try {
await globalStore.updateLang(locale.value); await setupStore.step1(locale.value);
router.push('/setup/2'); router.push('/setup/2');
} catch (error) { } catch (error) {
if (error instanceof FetchError) { if (error instanceof FetchError) {

2
src/app/pages/setup/4.vue

@ -65,7 +65,7 @@ async function newAccount() {
return; return;
} }
await setupStore.signup(username.value, password.value, accept.value); await setupStore.step4(username.value, password.value, accept.value);
await router.push('/setup/5'); await router.push('/setup/5');
} catch (error) { } catch (error) {
if (error instanceof FetchError) { if (error instanceof FetchError) {

2
src/app/pages/setup/5.vue

@ -53,7 +53,7 @@ async function updateHostPort() {
} }
try { try {
await setupStore.updateHostPort(host.value, port.value); await setupStore.step5(host.value, port.value);
await router.push('/setup/success'); await router.push('/setup/success');
} catch (error) { } catch (error) {
if (error instanceof FetchError) { if (error instanceof FetchError) {

63
src/app/stores/global.ts

@ -1,27 +1,6 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
export const useGlobalStore = defineStore('Global', () => { export const useGlobalStore = defineStore('Global', () => {
const uiShowCharts = ref(getItem('uiShowCharts') === '1');
const currentRelease = ref<null | string>(null);
const latestRelease = ref<null | { version: string; changelog: string }>(
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 sortClient = ref(true); // Sort clients by name, true = asc, false = desc
const { availableLocales, locale } = useI18n(); const { availableLocales, locale } = useI18n();
@ -39,6 +18,12 @@ export const useGlobalStore = defineStore('Global', () => {
} }
} }
const currentRelease = ref<null | string>(null);
const latestRelease = ref<null | { version: string; changelog: string }>(
null
);
const updateAvailable = ref(false);
async function fetchRelease() { async function fetchRelease() {
const { data: release } = await useFetch('/api/release', { const { data: release } = await useFetch('/api/release', {
method: 'get', method: 'get',
@ -53,6 +38,18 @@ export const useGlobalStore = defineStore('Global', () => {
updateAvailable.value = release.value.updateAvailable; updateAvailable.value = release.value.updateAvailable;
} }
const features = ref({
sortClients: {
enabled: false,
},
clientExpiration: {
enabled: false,
},
oneTimeLinks: {
enabled: false,
},
});
async function fetchFeatures() { async function fetchFeatures() {
const { data: apiFeatures } = await useFetch('/api/features', { const { data: apiFeatures } = await useFetch('/api/features', {
method: 'get', method: 'get',
@ -62,6 +59,11 @@ export const useGlobalStore = defineStore('Global', () => {
} }
} }
const statistics = ref({
enabled: false,
chartType: 0,
});
async function fetchStatistics() { async function fetchStatistics() {
const { data: apiStatistics } = await useFetch('/api/statistics', { const { data: apiStatistics } = await useFetch('/api/statistics', {
method: 'get', method: 'get',
@ -71,6 +73,8 @@ export const useGlobalStore = defineStore('Global', () => {
} }
} }
const uiShowCharts = ref(getItem('uiShowCharts') === '1');
const updateCharts = computed(() => { const updateCharts = computed(() => {
return statistics.value.chartType > 0 && uiShowCharts.value; return statistics.value.chartType > 0 && uiShowCharts.value;
}); });
@ -78,24 +82,27 @@ export const useGlobalStore = defineStore('Global', () => {
/** /**
* @throws if unsuccessful * @throws if unsuccessful
*/ */
async function updateLang(language: string) { async function updateLang(lang: string) {
const response = await api.updateLang({ lang: language }); const response = await $fetch('/api/admin/lang', {
method: 'post',
body: { lang },
});
return response.success; return response.success;
} }
return { return {
uiShowCharts,
updateCharts,
sortClient, sortClient,
features, setLanguage,
currentRelease, currentRelease,
latestRelease, latestRelease,
updateAvailable, updateAvailable,
statistics,
fetchRelease, fetchRelease,
features,
fetchFeatures, fetchFeatures,
setLanguage, statistics,
fetchStatistics, fetchStatistics,
uiShowCharts,
updateCharts,
updateLang, updateLang,
}; };
}); });

36
src/app/stores/setup.ts

@ -4,16 +4,33 @@ export const useSetupStore = defineStore('Setup', () => {
/** /**
* @throws if unsuccessful * @throws if unsuccessful
*/ */
async function signup(username: string, password: string, accept: boolean) { async function step1(lang: string) {
const response = await api.setupAdminUser({ username, password, accept }); const response = await $fetch('/api/setup/1', {
method: 'post',
body: { lang },
});
return response.success; return response.success;
} }
/** /**
* @throws if unsuccessful * @throws if unsuccessful
*/ */
async function updateHostPort(host: string, port: number) { async function step4(username: string, password: string, accept: boolean) {
const response = await api.setupHostPort({ host, port }); 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; return response.success;
} }
@ -21,7 +38,10 @@ export const useSetupStore = defineStore('Setup', () => {
* @throws if unsuccessful * @throws if unsuccessful
*/ */
async function runMigration(file: string) { 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; return response.success;
} }
@ -43,12 +63,12 @@ export const useSetupStore = defineStore('Setup', () => {
} }
return { return {
signup, step1,
updateHostPort, step4,
step5,
runMigration, runMigration,
error, error,
handleError, handleError,
step,
totalSteps, totalSteps,
setStep, setStep,
}; };

36
src/app/utils/api.ts

@ -114,42 +114,6 @@ class API {
body: { file }, 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< type WGClientReturn = Awaited<

8
src/server/api/account/create.post.ts

@ -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 };
});

2
src/server/api/lang.post.ts → src/server/api/admin/lang.post.ts

@ -1,7 +1,5 @@
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
const { lang } = await readValidatedBody(event, validateZod(langType)); const { lang } = await readValidatedBody(event, validateZod(langType));
setHeader(event, 'Content-Type', 'application/json');
await Database.system.updateLang(lang); await Database.system.updateLang(lang);
SERVER_DEBUG(`Update Lang: ${lang}`);
return { success: true }; return { success: true };
}); });

14
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 };
});

9
src/server/api/setup/account.post.ts → src/server/api/setup/4.post.ts

@ -1,8 +1,4 @@
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
const { username, password } = await readValidatedBody(
event,
validateZod(passwordSetupType, event)
);
const setupDone = await Database.setup.done(); const setupDone = await Database.setup.done();
if (setupDone) { if (setupDone) {
throw createError({ throw createError({
@ -10,6 +6,11 @@ export default defineEventHandler(async (event) => {
statusMessage: 'Invalid state', statusMessage: 'Invalid state',
}); });
} }
const { username, password } = await readValidatedBody(
event,
validateZod(passwordSetupType, event)
);
await Database.user.create(username, password); await Database.user.create(username, password);
await Database.setup.set(5); await Database.setup.set(5);
return { success: true }; return { success: true };

9
src/server/api/setup/hostport.post.ts → src/server/api/setup/5.post.ts

@ -1,8 +1,4 @@
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
const { host, port } = await readValidatedBody(
event,
validateZod(hostPortType, event)
);
const setupDone = await Database.setup.done(); const setupDone = await Database.setup.done();
if (setupDone) { if (setupDone) {
throw createError({ throw createError({
@ -10,6 +6,11 @@ export default defineEventHandler(async (event) => {
statusMessage: 'Invalid state', statusMessage: 'Invalid state',
}); });
} }
const { host, port } = await readValidatedBody(
event,
validateZod(hostPortType, event)
);
await Database.system.updateClientsHostPort(host, port); await Database.system.updateClientsHostPort(host, port);
await Database.setup.set('success'); await Database.setup.set('success');
return { success: true }; return { success: true };

2
src/server/api/setup/migration.post.ts → src/server/api/setup/migrate.post.ts

@ -4,7 +4,6 @@ import { z } from 'zod';
import type { Database } from '~~/services/database/repositories/database'; import type { Database } from '~~/services/database/repositories/database';
export default defineEventHandler(async (event) => { export default defineEventHandler(async (event) => {
const { file } = await readValidatedBody(event, validateZod(fileType, event));
const setupDone = await Database.setup.done(); const setupDone = await Database.setup.done();
if (setupDone) { if (setupDone) {
throw createError({ throw createError({
@ -13,6 +12,7 @@ export default defineEventHandler(async (event) => {
}); });
} }
const { file } = await readValidatedBody(event, validateZod(fileType, event));
const schema = z.object({ const schema = z.object({
server: z.object({ server: z.object({
privateKey: z.string(), privateKey: z.string(),
Loading…
Cancel
Save