import { defineStore } from "pinia" import router from "#app/plugins/router"; import {Preferences} from "@capacitor/preferences"; export const useAuthStore = defineStore("auth", { state: () => ({ user: null as null | { user_id: string; email: string; tenant_id?: string; role?: string }, profile: null as null | any, tenants: [] as { tenant_id: string; role: string; tenants: { id: string; name: string } }[], permissions: [] as string[], activeTenant: null as any, activeTenantData: null as any, loading: true as boolean, }), actions: { async init(token) { await this.fetchMe(token) if(useCapacitor().getIsNative()) { navigateTo("/mobile") } else { navigateTo("/") } }, async login(email: string, password: string) { const { token } = await useNuxtApp().$api("/auth/login", { method: "POST", body: { email, password } }) if(useCapacitor().getIsNative()) { await Preferences.set({ key:"token", value: token, }) } else { useCookie("token").value = token // persistieren } await this.fetchMe(token) }, async logout() { try { await useNuxtApp().$api("/auth/logout", { method: "POST" }) } catch (e) { console.error("Logout fehlgeschlagen:", e) } this.user = null this.permissions = [] this.profile = null this.activeTenant = null this.tenants = [] if(useCapacitor().getIsNative()) { await Preferences.remove({ key: 'token' }); useCookie("token").value = null } else { useCookie("token").value = null } navigateTo("/login") }, async fetchMe(jwt= null) { try { const me = await useNuxtApp().$api("/api/me", { headers: { Authorization: `Bearer ${jwt}`, context: { jwt }} }) this.user = me.user this.permissions = me.permissions this.tenants = me.tenants this.tenants.sort(function (a, b) { if (a.id < b.id) return -1 if (a.id > b.id) return 1 }) this.profile = me.profile if(me.activeTenant > 0) { this.activeTenant = me.activeTenant this.activeTenantData = me.tenants.find(i => i.id === me.activeTenant) this.loading = false } else { } } catch (err: any) { if (err?.response?.status === 401) this.logout() } }, async switchTenant(tenant_id: string) { this.loading = true const res = await useNuxtApp().$api("/api/tenant/switch", { method: "POST", body: { tenant_id } }) console.log(res) const {token} = res if(await useCapacitor().getIsNative()) { await Preferences.set({ key:"token", value: token, }) } else { useCookie("token").value = token // persistieren } await this.init(token) if(useCapacitor().getIsNative()) { navigateTo("/mobile") } else { navigateTo("/") } }, hasPermission(key: string) { return this.permissions.includes(key) } } })