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();
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) {

2
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) {

2
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) {

63
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 | 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 { 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() {
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,
};
});

36
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,
};

36
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<

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) => {
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 };
});

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) => {
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 };

9
src/server/api/setup/hostport.post.ts → 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 };

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';
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(),
Loading…
Cancel
Save