From 8e4e4e7da9dd58b01b1981fa374655c27aaed738 Mon Sep 17 00:00:00 2001 From: Douglas Barone Date: Mon, 21 Dec 2020 08:39:59 -0400 Subject: [PATCH] Organize queries into individual files --- server/src/resolvers/Mutation.js | 2 +- server/src/resolvers/Query.js | 156 --------------------- server/src/resolvers/Query/basicUser.js | 14 ++ server/src/resolvers/Query/groups.js | 8 ++ server/src/resolvers/Query/index.js | 25 ++++ server/src/resolvers/Query/logs.js | 8 ++ server/src/resolvers/Query/me.js | 3 + server/src/resolvers/Query/stats.js | 3 + server/src/resolvers/Query/user.js | 12 ++ server/src/resolvers/Query/userPresence.js | 42 ++++++ server/src/resolvers/Query/users.js | 29 ++++ server/src/resolvers/Query/wifiDevices.js | 16 +++ server/src/resolvers/Query/wifiUsers.js | 14 ++ 13 files changed, 175 insertions(+), 157 deletions(-) delete mode 100755 server/src/resolvers/Query.js create mode 100644 server/src/resolvers/Query/basicUser.js create mode 100644 server/src/resolvers/Query/groups.js create mode 100644 server/src/resolvers/Query/index.js create mode 100644 server/src/resolvers/Query/logs.js create mode 100644 server/src/resolvers/Query/me.js create mode 100644 server/src/resolvers/Query/stats.js create mode 100644 server/src/resolvers/Query/user.js create mode 100644 server/src/resolvers/Query/userPresence.js create mode 100644 server/src/resolvers/Query/users.js create mode 100644 server/src/resolvers/Query/wifiDevices.js create mode 100644 server/src/resolvers/Query/wifiUsers.js diff --git a/server/src/resolvers/Mutation.js b/server/src/resolvers/Mutation.js index 8da649d..c9313ff 100755 --- a/server/src/resolvers/Mutation.js +++ b/server/src/resolvers/Mutation.js @@ -4,7 +4,7 @@ import { ResetToken } from '../classes/ResetToken' import { updateDevicesInfo } from '../lib/wifiDevices' import { updateUserIdMappings } from '../lib/paloalto' -import { logInfo, logSuccess } from '../lib/logger' +import { logInfo } from '../lib/logger' const Mutation = { async login(_, { data }) { diff --git a/server/src/resolvers/Query.js b/server/src/resolvers/Query.js deleted file mode 100755 index 98e13f6..0000000 --- a/server/src/resolvers/Query.js +++ /dev/null @@ -1,156 +0,0 @@ -import { User } from '../classes/User' - -import prisma from '../prisma' - -const parseSAMAccountName = sAMAccountName => - sAMAccountName ? sAMAccountName.replace('.', ' ') : '' - -const Query = { - async me(_, args, { auth }) { - return auth - }, - - async basicUser(_, { sAMAccountName }) { - if (sAMAccountName === '') throw new Error('Argumento inválido') - - const user = await new User(sAMAccountName).init() - - if (!user) throw new Error('Usuário não encontrado.') - - return { - sAMAccountName: user.sAMAccountName, - displayName: user.displayName, - thumbnailPhoto: user.thumbnailPhoto, - roles: user.roles - } - }, - - async users( - _, - { where: { cn, displayName, sAMAccountName }, limit, onlyStudents }, - { ad } - ) { - const parsedSAMAccountName = parseSAMAccountName(sAMAccountName) - - const studentGroup = process.env.STUDENT_GROUP || 'Estudantes' - - const search = `|(cn=*${parsedSAMAccountName}*)(cn=*${cn}*)(displayName=*${displayName}*)` - - const filter = onlyStudents - ? `(&(memberOf=CN=${studentGroup},OU=Groups,DC=ifms,DC=edu,DC=br)(${search}))` - : `(${search})` - - try { - const users = await ad.findUsers({ - filter, - sizeLimit: limit - }) - - return users.map(user => ({ ...user, roles: [] })) || [] - } catch (e) { - throw new Error('Não foi possível realizar a busca.') - } - }, - - async user(_, { sAMAccountName }) { - if (!sAMAccountName) - throw new Error('Busca vazia. Informe uma conta de usuário.') - try { - const user = await new User(sAMAccountName).init() - return user || new Error('Usuário não encontrado') - } catch (e) { - throw new Error(e.message) - } - }, - - async groups(_, { where, limit }, { ad }) { - const groups = await ad.findGroups({ - filter: `(|(cn=*${where.cn}*)(name=*${where.name}*)(dn=*${where.dn}*))`, - sizeLimit: limit - }) - - return groups || [] - }, - - async stats() { - return {} - }, - - async wifiDevices(_, { identifiedOnly, nonIdentifiedOnly }) { - if (identifiedOnly && nonIdentifiedOnly) - throw new Error('Invalid combination of filters') - - return prisma.wifiDevice.findMany({ - orderBy: [{ lastSeen: 'desc' }], - where: identifiedOnly - ? { NOT: { userId: null } } - : nonIdentifiedOnly - ? { userId: null } - : {}, - include: { user: true } - }) - }, - - async wifiUsers() { - const wifiUsers = await prisma.user.findMany({ - where: { wifiDevices: { some: { id: { not: undefined } } } }, - include: { wifiDevices: true } - }) - - return wifiUsers.sort( - (a, b) => - b.wifiDevices.filter(device => device.status == 'ONLINE').length - - a.wifiDevices.filter(device => device.status == 'ONLINE').length - ) - }, - - async userPresence(_, { search }) { - if (!search) search = '' - - const usersWithWifiDevices = await prisma.user.findMany({ - where: { - wifiDevices: { some: { lastSeen: { not: null } } } - }, - include: { wifiDevices: { orderBy: [{ lastSeen: 'desc' }] } } - }) - - search = search.toLowerCase().trim() - - const filteredUsers = search - ? usersWithWifiDevices.filter( - user => - user.displayName.toLowerCase().includes(search) || - user.sAMAccountName.toLowerCase().includes(search) || - user.wifiDevices.some( - device => - device.apName.toLowerCase().includes(search) || - device.ip.startsWith(search) - ) - ) - : usersWithWifiDevices - - const sortedUsers = filteredUsers.sort((a, b) => - a.wifiDevices[0].lastSeen > b.wifiDevices[0].lastSeen ? -1 : 1 - ) - - return sortedUsers - .map(userPresence => ({ - id: userPresence.id, - displayName: userPresence.displayName, - thumbnailPhoto: userPresence.thumbnailPhoto, - lastSeen: userPresence.wifiDevices[0].lastSeen, - status: userPresence.wifiDevices[0].status, - apName: userPresence.wifiDevices[0].apName - })) - .slice(0, 200) - }, - - async logs() { - return await prisma.log.findMany({ - orderBy: { timestamp: 'desc' }, - take: 500 - }) - } -} - -export { Query } diff --git a/server/src/resolvers/Query/basicUser.js b/server/src/resolvers/Query/basicUser.js new file mode 100644 index 0000000..e19ae3a --- /dev/null +++ b/server/src/resolvers/Query/basicUser.js @@ -0,0 +1,14 @@ +export async function basicUser(parent, { sAMAccountName }) { + if (sAMAccountName === '') throw new Error('Argumento inválido') + + const user = await new User(sAMAccountName).init() + + if (!user) throw new Error('Usuário não encontrado.') + + return { + sAMAccountName: user.sAMAccountName, + displayName: user.displayName, + thumbnailPhoto: user.thumbnailPhoto, + roles: user.roles + } +} diff --git a/server/src/resolvers/Query/groups.js b/server/src/resolvers/Query/groups.js new file mode 100644 index 0000000..6f994be --- /dev/null +++ b/server/src/resolvers/Query/groups.js @@ -0,0 +1,8 @@ +export async function groups(_, { where, limit }, { ad }) { + const groups = await ad.findGroups({ + filter: `(|(cn=*${where.cn}*)(name=*${where.name}*)(dn=*${where.dn}*))`, + sizeLimit: limit + }) + + return groups || [] +} diff --git a/server/src/resolvers/Query/index.js b/server/src/resolvers/Query/index.js new file mode 100644 index 0000000..fdcc980 --- /dev/null +++ b/server/src/resolvers/Query/index.js @@ -0,0 +1,25 @@ +import { basicUser } from './basicUser' +import { groups } from './groups' +import { logs } from './logs' +import { me } from './me' +import { stats } from './stats' +import { user } from './user' +import { userPresence } from './userPresence' +import { users } from './users' +import { wifiDevices } from './wifiDevices' +import { wifiUsers } from './wifiUsers' + +const Query = { + basicUser, + groups, + logs, + me, + stats, + user, + userPresence, + users, + wifiDevices, + wifiUsers +} + +export { Query } diff --git a/server/src/resolvers/Query/logs.js b/server/src/resolvers/Query/logs.js new file mode 100644 index 0000000..a35bdfb --- /dev/null +++ b/server/src/resolvers/Query/logs.js @@ -0,0 +1,8 @@ +import prisma from '../../prisma' + +export async function logs() { + return await prisma.log.findMany({ + orderBy: { timestamp: 'desc' }, + take: 500 + }) +} diff --git a/server/src/resolvers/Query/me.js b/server/src/resolvers/Query/me.js new file mode 100644 index 0000000..e39ba6a --- /dev/null +++ b/server/src/resolvers/Query/me.js @@ -0,0 +1,3 @@ +export async function me(parent, args, { auth }) { + return auth +} diff --git a/server/src/resolvers/Query/stats.js b/server/src/resolvers/Query/stats.js new file mode 100644 index 0000000..750275f --- /dev/null +++ b/server/src/resolvers/Query/stats.js @@ -0,0 +1,3 @@ +export async function stats() { + return {} +} diff --git a/server/src/resolvers/Query/user.js b/server/src/resolvers/Query/user.js new file mode 100644 index 0000000..c10a704 --- /dev/null +++ b/server/src/resolvers/Query/user.js @@ -0,0 +1,12 @@ +import { User } from '../../classes/User' + +export async function user(parent, { sAMAccountName }) { + if (!sAMAccountName) + throw new Error('Busca vazia. Informe uma conta de usuário.') + try { + const user = await new User(sAMAccountName).init() + return user || new Error('Usuário não encontrado') + } catch (e) { + throw new Error(e.message) + } +} diff --git a/server/src/resolvers/Query/userPresence.js b/server/src/resolvers/Query/userPresence.js new file mode 100644 index 0000000..a9262be --- /dev/null +++ b/server/src/resolvers/Query/userPresence.js @@ -0,0 +1,42 @@ +import prisma from '../../prisma' + +export async function userPresence(_, { search }) { + if (!search) search = '' + + const usersWithWifiDevices = await prisma.user.findMany({ + where: { + wifiDevices: { some: { lastSeen: { not: null } } } + }, + include: { wifiDevices: { orderBy: [{ lastSeen: 'desc' }] } } + }) + + search = search.toLowerCase().trim() + + const filteredUsers = search + ? usersWithWifiDevices.filter( + user => + user.displayName.toLowerCase().includes(search) || + user.sAMAccountName.toLowerCase().includes(search) || + user.wifiDevices.some( + device => + device.apName.toLowerCase().includes(search) || + device.ip.startsWith(search) + ) + ) + : usersWithWifiDevices + + const sortedUsers = filteredUsers.sort((a, b) => + a.wifiDevices[0].lastSeen > b.wifiDevices[0].lastSeen ? -1 : 1 + ) + + return sortedUsers + .map(userPresence => ({ + id: userPresence.id, + displayName: userPresence.displayName, + thumbnailPhoto: userPresence.thumbnailPhoto, + lastSeen: userPresence.wifiDevices[0].lastSeen, + status: userPresence.wifiDevices[0].status, + apName: userPresence.wifiDevices[0].apName + })) + .slice(0, 200) +} diff --git a/server/src/resolvers/Query/users.js b/server/src/resolvers/Query/users.js new file mode 100644 index 0000000..55847b7 --- /dev/null +++ b/server/src/resolvers/Query/users.js @@ -0,0 +1,29 @@ +const parseSAMAccountName = sAMAccountName => + sAMAccountName ? sAMAccountName.replace('.', ' ') : '' + +export async function users( + parent, + { where: { cn, displayName, sAMAccountName }, limit, onlyStudents }, + { ad } +) { + const parsedSAMAccountName = parseSAMAccountName(sAMAccountName) + + const studentGroup = process.env.STUDENT_GROUP || 'Estudantes' + + const search = `|(cn=*${parsedSAMAccountName}*)(cn=*${cn}*)(displayName=*${displayName}*)` + + const filter = onlyStudents + ? `(&(memberOf=CN=${studentGroup},OU=Groups,DC=ifms,DC=edu,DC=br)(${search}))` + : `(${search})` + + try { + const users = await ad.findUsers({ + filter, + sizeLimit: limit + }) + + return users.map(user => ({ ...user, roles: [] })) || [] + } catch (e) { + throw new Error('Não foi possível realizar a busca.') + } +} diff --git a/server/src/resolvers/Query/wifiDevices.js b/server/src/resolvers/Query/wifiDevices.js new file mode 100644 index 0000000..aef3f6c --- /dev/null +++ b/server/src/resolvers/Query/wifiDevices.js @@ -0,0 +1,16 @@ +import prisma from '../../prisma' + +export async function wifiDevices(_, { identifiedOnly, nonIdentifiedOnly }) { + if (identifiedOnly && nonIdentifiedOnly) + throw new Error('Invalid combination of filters') + + return prisma.wifiDevice.findMany({ + orderBy: [{ lastSeen: 'desc' }], + where: identifiedOnly + ? { NOT: { userId: null } } + : nonIdentifiedOnly + ? { userId: null } + : {}, + include: { user: true } + }) +} diff --git a/server/src/resolvers/Query/wifiUsers.js b/server/src/resolvers/Query/wifiUsers.js new file mode 100644 index 0000000..36f31c3 --- /dev/null +++ b/server/src/resolvers/Query/wifiUsers.js @@ -0,0 +1,14 @@ +import prisma from '../../prisma' + +export async function wifiUsers() { + const wifiUsers = await prisma.user.findMany({ + where: { wifiDevices: { some: { id: { not: undefined } } } }, + include: { wifiDevices: true } + }) + + return wifiUsers.sort( + (a, b) => + b.wifiDevices.filter(device => device.status == 'ONLINE').length - + a.wifiDevices.filter(device => device.status == 'ONLINE').length + ) +}