Organize queries into individual files

This commit is contained in:
Douglas Barone 2020-12-21 08:39:59 -04:00
parent dcbbceb685
commit 8e4e4e7da9
13 changed files with 175 additions and 157 deletions

View File

@ -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 }) {

View File

@ -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 }

View File

@ -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
}
}

View File

@ -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 || []
}

View File

@ -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 }

View File

@ -0,0 +1,8 @@
import prisma from '../../prisma'
export async function logs() {
return await prisma.log.findMany({
orderBy: { timestamp: 'desc' },
take: 500
})
}

View File

@ -0,0 +1,3 @@
export async function me(parent, args, { auth }) {
return auth
}

View File

@ -0,0 +1,3 @@
export async function stats() {
return {}
}

View File

@ -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)
}
}

View File

@ -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)
}

View File

@ -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.')
}
}

View File

@ -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 }
})
}

View File

@ -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
)
}