diff --git a/src/boot/auth.ts b/src/boot/auth.ts index d5a0f05..03fb3ae 100644 --- a/src/boot/auth.ts +++ b/src/boot/auth.ts @@ -1,29 +1,35 @@ import { boot } from 'quasar/wrappers'; -import { appApi } from './axios'; import { createPinia } from 'pinia'; import { useUserStore } from 'src/vueLib/login/userStore'; import { useLogin } from 'src/vueLib/login/useLogin'; +import { Me, openDatabase } from 'src/vueLib/components/DatabaseCall'; const pinia = createPinia(); export default boot(async ({ app }) => { app.use(pinia); - const useStore = useUserStore(); + const userStore = useUserStore(); const login = useLogin(); - await appApi - .get('/login/me') - .then((resp) => { - useStore - .setUser({ - id: resp.data.id, - user: resp.data.username, - role: { role: resp.data.role, permissions: [] }, - }) - .catch((err) => console.error(err)); - login.refresh().catch((err) => console.error(err)); + const resp = await Me().catch(() => + login.logout().catch((err) => { + console.error(err); + return; + }), + ); + + if (!resp) return; + + await userStore + .setUser({ + id: resp.data.id, + user: resp.data.username, + role: { role: resp.data.role, permissions: [] }, + workspaceId: resp.data.workspaceId, + settings: resp.data.settings, }) - .catch(() => { - login.logout().catch((err) => console.error(err)); - }); + .catch((err) => console.error(err)); + login.refresh().catch((err) => console.error(err)); + + await openDatabase().catch((err) => console.error(err)); }); diff --git a/src/boot/quasar-global.ts b/src/boot/quasar-global.ts index dfa33a3..4b7f8ef 100644 --- a/src/boot/quasar-global.ts +++ b/src/boot/quasar-global.ts @@ -1,7 +1,7 @@ import { boot } from 'quasar/wrappers'; import { setQuasarInstance } from 'src/vueLib/utils/globalQ'; import { setRouterInstance } from 'src/vueLib/utils/globalRouter'; -import { databaseName, logo, appName, workspace } from 'src/vueLib/models/settings'; +import { logo, appName } from 'src/vueLib/models/settings'; import { Dark } from 'quasar'; import { getLocalDarkMode, getLocalSettings } from 'src/localstorage/localStorage'; @@ -20,8 +20,6 @@ export default boot(({ app, router }) => { if (settings.appName) { appName.value = settings.appName; } - databaseName.value = settings.databaseName; - workspace.value = settings.workspace?.uuid ?? ''; document.documentElement.style.setProperty('--q-primary', settings.primaryColor ?? '#1976d2'); document.documentElement.style.setProperty( diff --git a/src/boot/restore-route.js b/src/boot/restore-route.js index d38742b..c3d9069 100644 --- a/src/boot/restore-route.js +++ b/src/boot/restore-route.js @@ -1,15 +1,14 @@ import { boot } from 'quasar/wrappers'; import { useUserStore } from 'src/vueLib/login/userStore'; -import { appApi } from './axios'; import { getLocalLastRoute, setLocalLastRoute } from 'src/localstorage/localStorage'; +import { Me } from 'src/vueLib/components/DatabaseCall'; export default boot(async ({ router }) => { const userStore = useUserStore(); // load user try { - const { data } = await appApi.get('/login/me'); + const data = await Me(); userStore.setFirstLogin(data.newDatabase); - data.role.role = data.role; await userStore.setUser(data); } catch { diff --git a/src/components/AddToEvent.vue b/src/components/AddToEvent.vue index cba28bc..2e1d0ef 100644 --- a/src/components/AddToEvent.vue +++ b/src/components/AddToEvent.vue @@ -111,7 +111,7 @@ async function addAttendees() { }); await updateAttendees(0); - updateEvents(); + await updateEvents(); } let resolveNewEvent!: (value: Event) => void; diff --git a/src/localstorage/localStorage.ts b/src/localstorage/localStorage.ts index 031ea2f..9f7844e 100644 --- a/src/localstorage/localStorage.ts +++ b/src/localstorage/localStorage.ts @@ -1,12 +1,10 @@ import { Dark } from 'quasar'; -import { appName, databaseName, workspace, type Settings } from 'src/vueLib/models/settings'; +import { appName, type Settings } from 'src/vueLib/models/settings'; import { ref } from 'vue'; export function setLocalSettings(settings: Settings) { - localStorage.setItem('icon', settings.icon); - localStorage.setItem('appName', settings.appName); - localStorage.setItem('databaseName', settings.databaseName); - localStorage.setItem('workspace', settings.workspace?.uuid || ''); + if (settings.icon !== '') localStorage.setItem('icon', settings.icon); + if (settings.appName !== '') localStorage.setItem('appName', settings.appName); localStorage.setItem('primaryColor', settings.primaryColor); localStorage.setItem('primaryColorText', settings.primaryColorText); localStorage.setItem('secondaryColor', settings.secondaryColor); @@ -18,27 +16,14 @@ export function getLocalSettings(): Settings { if (name === undefined || name === 'undefined') { name = appName.value; } - - let db = localStorage.getItem('databaseName'); - if (db === undefined || db === 'undefined') { - db = databaseName.value; - } - let iconName = localStorage.getItem('icon'); if (iconName === undefined || iconName === 'undefined') { iconName = ''; } - let ws = localStorage.getItem('workspace'); - if (ws === undefined || ws === 'undefined') { - ws = workspace.value || ''; - } - return { icon: iconName, appName: name, - workspace: { name: '', description: '', uuid: ws }, - databaseName: db, primaryColor: localStorage.getItem('primaryColor'), primaryColorText: localStorage.getItem('primaryColorText'), secondaryColor: localStorage.getItem('secondaryColor'), @@ -49,8 +34,6 @@ export function getLocalSettings(): Settings { export function clearLocalStorage() { localStorage.removeItem('icon'); localStorage.removeItem('appName'); - localStorage.removeItem('workspace'); - localStorage.removeItem('databaseName'); localStorage.removeItem('primaryColor'); localStorage.removeItem('primaryColorText'); localStorage.removeItem('secondaryColor'); diff --git a/src/pages/ReportPage.vue b/src/pages/ReportPage.vue index cf7d8aa..dba1c20 100644 --- a/src/pages/ReportPage.vue +++ b/src/pages/ReportPage.vue @@ -147,7 +147,6 @@ import type { Group, Groups } from 'src/vueLib/models/group'; import { getLocalPageDefaults, setLocalPageDefaults } from 'src/localstorage/localStorage'; import html2pdf from 'html2pdf.js'; import type { PageDefault } from 'src/vueLib/models/pageDefaults'; -import { openDatabase } from 'src/vueLib/components/DatabaseCall'; const filter = ref(''); const group = ref([]); @@ -180,14 +179,8 @@ const columns = computed(() => [ }, ]); -onMounted(async () => { +onMounted(() => { loading.value = true; - await openDatabase() - .catch((err) => NotifyResponse(err, 'error')) - - .finally(() => { - loading.value = false; - }); appApi .get('/groups') .then((resp) => (groups.value = resp.data)) diff --git a/src/pages/StatsPage.vue b/src/pages/StatsPage.vue index 6be851e..996d1f1 100644 --- a/src/pages/StatsPage.vue +++ b/src/pages/StatsPage.vue @@ -52,7 +52,7 @@ import { appApi } from 'src/boot/axios'; import { i18n } from 'src/boot/lang'; import SiteTitle from 'src/vueLib/general/SiteTitle.vue'; import { useNotify } from 'src/vueLib/general/useNotify'; -import { databaseName, workspace } from 'src/vueLib/models/settings'; +import { useUserStore } from 'src/vueLib/login/userStore'; import { onMounted, ref } from 'vue'; const stats = ref(); @@ -71,8 +71,11 @@ const amounts = ref<{ const { NotifyResponse } = useNotify(); onMounted(async () => { - let path = databaseName.value; - if (workspace.value !== '') path = workspace.value + '/' + path; + const user = useUserStore().user; + const workspaceUuid = useUserStore().getWorkspaceUuid; + let path = user?.settings?.databaseName; + if (workspaceUuid !== undefined) path = workspaceUuid + '/' + path; + stats.value = await appApi .post('/stats', { database: path }) .then((resp) => { diff --git a/src/vueLib/components/DatabaseCall.ts b/src/vueLib/components/DatabaseCall.ts index e757bce..fc9eb19 100644 --- a/src/vueLib/components/DatabaseCall.ts +++ b/src/vueLib/components/DatabaseCall.ts @@ -1,10 +1,22 @@ import { appApi } from 'src/boot/axios'; -import { databaseName, workspace } from '../models/settings'; +import { useUserStore } from '../login/userStore'; +import type { User } from '../models/users'; +import { useNotify } from '../general/useNotify'; export async function openDatabase() { - let path = databaseName.value; - if (workspace.value !== '') { - path = workspace.value + '/' + path; + const user = useUserStore().user; + + if (!user) return; + const tempUser = (await getUser(user?.id)) as User | void; + + if (!tempUser) return; + let path = ''; + + path = tempUser.settings?.databaseName || ''; + + if (tempUser.workspaces) { + path = tempUser.workspaces.find((w) => w.id === tempUser.workspaceId)?.uuid || ''; + path = path + '/' + tempUser.settings?.databaseName; } return appApi.post('database/open', { @@ -12,3 +24,20 @@ export async function openDatabase() { create: true, }); } + +async function getUser(id: number): Promise { + const { NotifyResponse } = useNotify(); + return appApi + .get(`/users?id=${id}`) + .then((resp) => { + return resp.data[0]; + }) + .catch((err) => { + NotifyResponse(err, 'error'); + return null; + }); +} + +export async function Me() { + return appApi.get('/login/me'); +} diff --git a/src/vueLib/login/useLogin.ts b/src/vueLib/login/useLogin.ts index f4c2cb2..6a17a79 100644 --- a/src/vueLib/login/useLogin.ts +++ b/src/vueLib/login/useLogin.ts @@ -5,6 +5,7 @@ import type { Settings } from '../models/settings'; import { appName, logo } from '../models/settings'; import { clearLocalStorage, setLocalSettings } from 'src/localstorage/localStorage'; import { routerInstance } from 'src/router'; +import { Me } from '../components/DatabaseCall'; const refreshTime = 10000; let intervalId: ReturnType | null = null; @@ -31,12 +32,14 @@ export function useLogin() { setLocalSettings(sets); }); - const resp = await appApi.get('/login/me'); + const resp = await Me(); + await userStore .setUser({ id: resp.data.id, user: resp.data.user, role: { role: resp.data.role, permissions: [] }, + workspaceId: resp.data.workspace, }) .catch((err) => NotifyResponse(err, 'error')); @@ -60,31 +63,31 @@ export function useLogin() { } async function refresh() { - await appApi - .post('login/refresh', {}, { withCredentials: true }) - .then(() => { - appApi - .get('/login/me') - .then((resp) => { - userStore - .setUser({ - id: resp.data.id, - user: resp.data.user, - role: { role: resp.data.role, permissions: [] }, - }) - .catch((err) => NotifyResponse(err, 'error')); - if (!intervalId) { - startRefreshInterval(); - } - return true; - }) - .catch(() => {}); + await appApi.post('login/refresh', {}, { withCredentials: true }).catch(() => { + userStore.clearUser(); + return; + }); + + const resp = await Me(); + if (!resp) { + stopRefreshInterval(); + return false; + } + userStore + .setUser({ + id: resp.data.id, + user: resp.data.user, + role: { role: resp.data.role, permissions: [] }, + workspaceId: resp.data.workspace, + settings: resp.data.settings, }) - .catch(() => { - userStore.clearUser(); - }); - stopRefreshInterval(); - return false; + .catch((err) => NotifyResponse(err, 'error')); + + if (!intervalId) { + startRefreshInterval(); + } + + return true; } function startRefreshInterval() { diff --git a/src/vueLib/tables/events/EventsTable.ts b/src/vueLib/tables/events/EventsTable.ts index cf6fead..545b035 100644 --- a/src/vueLib/tables/events/EventsTable.ts +++ b/src/vueLib/tables/events/EventsTable.ts @@ -63,10 +63,10 @@ export function useEventTable() { const loading = ref(false); //updates Event list from database - function updateEvents() { + async function updateEvents() { loading.value = true; - appApi + await appApi .get('events') .then((resp) => { if (resp.data === null) { diff --git a/src/vueLib/tables/events/EventsTable.vue b/src/vueLib/tables/events/EventsTable.vue index ed7d1b5..87db858 100644 --- a/src/vueLib/tables/events/EventsTable.vue +++ b/src/vueLib/tables/events/EventsTable.vue @@ -116,7 +116,7 @@