diff --git a/crm/api/session.py b/crm/api/session.py index 5dcf6178..eadf1e31 100644 --- a/crm/api/session.py +++ b/crm/api/session.py @@ -2,6 +2,18 @@ import frappe @frappe.whitelist() -def get_user_info(): - user = frappe.db.get_value("User", frappe.session.user, ["name", "full_name", "first_name", "last_name", "user_image", ], as_dict=1) - return user \ No newline at end of file +def get_users(): + if frappe.session.user == "Guest": + frappe.throw("Authentication failed", exc=frappe.AuthenticationError) + + users = frappe.qb.get_query( + "User", + fields=["name", "email", "enabled", "user_image", "full_name", "user_type"], + order_by="full_name asc", + distinct=True, + ).run(as_dict=1) + + for user in users: + if frappe.session.user == user.name: + user.session_user = True + return users \ No newline at end of file diff --git a/frontend/src/components/UserDropdown.vue b/frontend/src/components/UserDropdown.vue index eb045299..414a7652 100644 --- a/frontend/src/components/UserDropdown.vue +++ b/frontend/src/components/UserDropdown.vue @@ -27,16 +27,19 @@ diff --git a/frontend/src/router.js b/frontend/src/router.js index c1670d89..32ab8550 100644 --- a/frontend/src/router.js +++ b/frontend/src/router.js @@ -1,4 +1,5 @@ import { createRouter, createWebHistory } from 'vue-router' +import { usersStore } from '@/stores/users' import { sessionStore } from '@/stores/session' const routes = [ @@ -49,14 +50,14 @@ let router = createRouter({ }) router.beforeEach(async (to, from, next) => { - const session = sessionStore() + const { users } = usersStore() + const { isLoggedIn } = sessionStore() - // Initialize session - await session.init() + await users.promise - if (to.name === 'Login' && session.isLoggedIn) { + if (to.name === 'Login' && isLoggedIn) { next({ name: 'Leads' }) - } else if (to.name !== 'Login' && !session.isLoggedIn) { + } else if (to.name !== 'Login' && !isLoggedIn) { next({ name: 'Login' }) } else if (to.matched.length === 0) { next({ name: 'Invalid Page' }) diff --git a/frontend/src/stores/session.js b/frontend/src/stores/session.js index dea1ade7..3a5c2b80 100644 --- a/frontend/src/stores/session.js +++ b/frontend/src/stores/session.js @@ -1,14 +1,22 @@ import { defineStore } from 'pinia' import { createResource } from 'frappe-ui' +import { usersStore } from './users' import router from '@/router' -import { computed } from 'vue' +import { ref, computed } from 'vue' export const sessionStore = defineStore('crm-session', () => { - const sessionUser = createResource({ - url: 'crm.api.session.get_user_info', - }) + const { users } = usersStore() - const user = computed(() => sessionUser.data || null) + function sessionUser() { + let cookies = new URLSearchParams(document.cookie.split('; ').join('&')) + let _sessionUser = cookies.get('user_id') + if (_sessionUser === 'Guest') { + _sessionUser = null + } + return _sessionUser + } + + let user = ref(sessionUser()) const isLoggedIn = computed(() => !!user.value) const login = createResource({ @@ -17,6 +25,9 @@ export const sessionStore = defineStore('crm-session', () => { throw new Error('Invalid email or password') }, onSuccess() { + users.reload() + user.value = sessionUser() + login.reset() router.replace({ path: '/' }) }, }) @@ -24,23 +35,16 @@ export const sessionStore = defineStore('crm-session', () => { const logout = createResource({ url: 'logout', onSuccess() { + users.reset() + user.value = null router.replace({ name: 'Login' }) }, }) - async function init() { - try { - await sessionUser.fetch() - } catch { - sessionUser.data = null - } - } - return { user, isLoggedIn, login, logout, - init, } }) diff --git a/frontend/src/stores/users.js b/frontend/src/stores/users.js new file mode 100644 index 00000000..ee5910e1 --- /dev/null +++ b/frontend/src/stores/users.js @@ -0,0 +1,48 @@ +import { defineStore } from 'pinia' +import { createResource } from 'frappe-ui' +import { sessionStore } from './session' +import { reactive } from 'vue' + +export const usersStore = defineStore('crm-users', () => { + const session = sessionStore() + + let usersByName = reactive({}) + + const users = createResource({ + url: 'crm.api.session.get_users', + cache: 'Users', + initialData: [], + transform(users) { + for (let user of users) { + usersByName[user.name] = user + } + return users + }, + onError(error) { + if (error && error.exc_type === 'AuthenticationError') { + router.push('/login') + } + }, + }) + + function getUser(email) { + if (!email || email === 'sessionUser') { + email = session.user + } + if (!usersByName[email]) { + usersByName[email] = { + name: email, + email: email, + full_name: email.split('@')[0], + user_image: null, + role: null, + } + } + return usersByName[email] + } + + return { + users, + getUser, + } +})