Files
FEDEO/stores/auth.ts

122 lines
3.6 KiB
TypeScript

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)
navigateTo("/")
},
async login(email: string, password: string) {
const { token } = await useNuxtApp().$api("/auth/login", {
method: "POST",
body: { email, password }
})
if(await 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' });
} 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
}}
})
console.log(me)
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) {
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)
navigateTo("/")
},
hasPermission(key: string) {
return this.permissions.includes(key)
}
}
})