From b691bf2cf45fd3318773d821999234a0e9bf7d10 Mon Sep 17 00:00:00 2001 From: wbuezas <wbuezas@verdnatura.es> Date: Mon, 24 Mar 2025 13:02:19 +0100 Subject: [PATCH] Connections view --- src/pages/Admin/ConnectionsView.vue | 98 ++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 21 deletions(-) diff --git a/src/pages/Admin/ConnectionsView.vue b/src/pages/Admin/ConnectionsView.vue index 175f32c7..c5171edd 100644 --- a/src/pages/Admin/ConnectionsView.vue +++ b/src/pages/Admin/ConnectionsView.vue @@ -12,12 +12,49 @@ import { useAppStore } from 'stores/app'; import { storeToRefs } from 'pinia'; const { t } = useI18n(); -const jApi = inject('jApi'); +const api = inject('api'); const router = useRouter(); const userStore = useUserStore(); const appStore = useAppStore(); const { isHeaderMounted } = storeToRefs(appStore); +const filter = { + include: [ + { + relation: 'visitUser', + scope: { + include: [ + { + relation: 'visitAccess', + scope: { + fields: ['id', 'agentFk'], + include: [ + { + relation: 'visitAgent', + scope: { + fields: [ + 'platform', + 'browser', + 'version' + ] + } + } + ] + } + }, + { + relation: 'user', + scope: { + fields: ['id', 'nickname', 'name'] + } + } + ], + fields: ['userFk', 'stamp', 'accessFk'] + } + } + ], + order: 'lastUpdate DESC' +}; const connections = ref([]); const loading = ref(false); const intervalId = ref(null); @@ -25,20 +62,36 @@ const intervalId = ref(null); const getConnections = async () => { try { loading.value = true; - connections.value = await jApi.query( - `SELECT vu.userFk userId, vu.stamp, u.nickname, s.lastUpdate, - a.platform, a.browser, a.version, u.name user - FROM userSession s - JOIN visitUser vu ON vu.id = s.userVisitFk - JOIN visitAccess ac ON ac.id = vu.accessFk - JOIN visitAgent a ON a.id = ac.agentFk - JOIN visit v ON v.id = a.visitFk - JOIN account.user u ON u.id = vu.userFk - ORDER BY lastUpdate DESC` - ); - loading.value = false; + + const { data } = await api.get('/userSessions', { + params: { filter: JSON.stringify(filter) } + }); + + if (!data) { + connections.value = []; + return; + } + + const formattedConnections = data + .map(connection => { + const { visitUser = {}, ...rest } = connection; + + const { visitAccess, user, stamp } = visitUser; + const { visitAgent } = visitAccess || {}; + + return { + ...rest, + user, + stamp, + visitAgent + }; + }) + .filter(connection => connection.user); + connections.value = formattedConnections; } catch (error) { console.error('Error getting connections:', error); + } finally { + loading.value = false; } }; @@ -89,11 +142,11 @@ onBeforeUnmount(() => clearInterval(intervalId.value)); <CardList v-for="(connection, index) in connections" :key="index" - :to="{ name: 'accessLog', params: { id: connection.userId } }" + :to="{ name: 'accessLog', params: { id: connection.user?.id } }" > <template #content> <span class="text-bold q-mb-sm"> - {{ connection.nickname }} + {{ connection.user?.nickname }} </span> <span> {{ @@ -109,13 +162,14 @@ onBeforeUnmount(() => clearInterval(intervalId.value)); > <span v-if=" - connection.platform && - connection.browser && - connection.version + connection.visitAgent?.platform && + connection.visitAgent?.browser && + connection.visitAgent?.version " > - {{ connection.platform }} - {{ connection.browser }} - - {{ connection.version }} + {{ connection.visitAgent?.platform }} - + {{ connection.visitAgent?.browser }} - + {{ connection.visitAgent?.version }} </span> </template> <template #actions> @@ -123,7 +177,9 @@ onBeforeUnmount(() => clearInterval(intervalId.value)); icon="people" flat rounded - @click.stop.prevent="supplantUser(connection.user)" + @click.stop.prevent=" + supplantUser(connection.user?.name) + " > <QTooltip> {{ t('supplantUser') }}