diff --git a/server/src/lib/wifiDevices.js b/server/src/lib/wifiDevices.js index 28e0dfc..f6ef6ca 100644 --- a/server/src/lib/wifiDevices.js +++ b/server/src/lib/wifiDevices.js @@ -1,3 +1,4 @@ +import { subMinutes } from 'date-fns' import { getOnlineWifiDevices as getOnlineUnifiDevices } from './unifiController' import { getOnlineWifiDevices as getOnlineCiscoDevices } from './ciscoController' @@ -6,6 +7,7 @@ import prisma from '../prisma' import { pubsub, USER_PRESENCE_UPDATED } from '../pubsub' const DEBOUNCE_TIME_MS = 10000 +const RECENT_THRESHOLD_IN_MINUTES = 5 let working = false @@ -23,13 +25,31 @@ async function getOnlineDevices() { return onlineDevices } -// TODO: Add time threshold -async function setAllDevicesAsOffline() { - await prisma.wifiDevice.updateMany({ +async function updateDevicesStatus() { + const recent = prisma.wifiDevice.updateMany({ + where: { + status: 'OFFLINE', + lastSeen: { + gt: subMinutes(new Date(), RECENT_THRESHOLD_IN_MINUTES) + } + }, + data: { + status: 'RECENT' + } + }) + + const offline = prisma.wifiDevice.updateMany({ + where: { + lastSeen: { + lte: subMinutes(new Date(), RECENT_THRESHOLD_IN_MINUTES) + } + }, data: { status: 'OFFLINE' } }) + + return Promise.all([recent, offline]) } async function forceUserDisconnect(mac) { @@ -77,10 +97,10 @@ async function updateDevicesInfo() { try { const onlineDevices = await getOnlineDevices() - await setAllDevicesAsOffline() - await updateDB(onlineDevices) + await updateDevicesStatus() + pubsub.publish(USER_PRESENCE_UPDATED, { userPresenceUpdated: onlineDevices.length }) diff --git a/server/src/resolvers/Query.js b/server/src/resolvers/Query.js index 7f53595..bede4f3 100755 --- a/server/src/resolvers/Query.js +++ b/server/src/resolvers/Query.js @@ -114,7 +114,7 @@ const Query = { include: { wifiDevices: { orderBy: [{ lastSeen: 'desc' }] } } }) - search = search.toLowerCase() + search = search.toLowerCase().trim() const userPresences = usersWithWifiDevices .filter( diff --git a/server/src/resolvers/WifiDevice.js b/server/src/resolvers/WifiDevice.js index 8255dda..a1da188 100644 --- a/server/src/resolvers/WifiDevice.js +++ b/server/src/resolvers/WifiDevice.js @@ -1,7 +1,9 @@ const WifiDevice = { lastSeen: _ => _.lastSeen?.toISOString(), firstSeen: _ => _.firstSeen?.toISOString(), - isOnline: _ => _.status == 'ONLINE' + isOnline: _ => _.status == 'ONLINE', + isRecent: _ => _.status == 'RECENT', + isOffline: _ => _.status == 'OFFLINE' } export { WifiDevice } diff --git a/server/src/typeDefs.js b/server/src/typeDefs.js index 7c22e3b..3a42f61 100644 --- a/server/src/typeDefs.js +++ b/server/src/typeDefs.js @@ -168,6 +168,8 @@ const typeDefs = gql` apName: String status: Status isOnline: Boolean + isRecent: Boolean + isOffline: Boolean } type UserPresence { @@ -177,6 +179,7 @@ const typeDefs = gql` enum Status { ONLINE + RECENT OFFLINE } diff --git a/web/src/components/UserPresenceStatusList.vue b/web/src/components/UserPresenceStatusList.vue index bb8d20c..93e8013 100644 --- a/web/src/components/UserPresenceStatusList.vue +++ b/web/src/components/UserPresenceStatusList.vue @@ -17,7 +17,10 @@ @@ -42,25 +45,41 @@ {{ userPresence.user.displayName }} - - Off-line - - - On-line - - - Próximo ao AP - {{ userPresence.wifiDevices[0].apName }} - - - - Visto {{ userPresence.wifiDevices[0].lastSeen | from }} - + + + + + + @@ -114,4 +133,7 @@ export default { .online { border-left-color: #117d4c; } +.recent { + border-left-color: #ffc107; +} diff --git a/web/src/views/UserPresence.vue b/web/src/views/UserPresence.vue index 12e99fa..f7fe9f2 100644 --- a/web/src/views/UserPresence.vue +++ b/web/src/views/UserPresence.vue @@ -153,6 +153,8 @@ export default { id lastSeen isOnline + isRecent + isOffline controller } }