Organize queries into individual files
This commit is contained in:
parent
dcbbceb685
commit
8e4e4e7da9
|
@ -4,7 +4,7 @@ import { ResetToken } from '../classes/ResetToken'
|
||||||
|
|
||||||
import { updateDevicesInfo } from '../lib/wifiDevices'
|
import { updateDevicesInfo } from '../lib/wifiDevices'
|
||||||
import { updateUserIdMappings } from '../lib/paloalto'
|
import { updateUserIdMappings } from '../lib/paloalto'
|
||||||
import { logInfo, logSuccess } from '../lib/logger'
|
import { logInfo } from '../lib/logger'
|
||||||
|
|
||||||
const Mutation = {
|
const Mutation = {
|
||||||
async login(_, { data }) {
|
async login(_, { data }) {
|
||||||
|
|
|
@ -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 }
|
|
14
server/src/resolvers/Query/basicUser.js
Normal file
14
server/src/resolvers/Query/basicUser.js
Normal 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
|
||||||
|
}
|
||||||
|
}
|
8
server/src/resolvers/Query/groups.js
Normal file
8
server/src/resolvers/Query/groups.js
Normal 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 || []
|
||||||
|
}
|
25
server/src/resolvers/Query/index.js
Normal file
25
server/src/resolvers/Query/index.js
Normal 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 }
|
8
server/src/resolvers/Query/logs.js
Normal file
8
server/src/resolvers/Query/logs.js
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
import prisma from '../../prisma'
|
||||||
|
|
||||||
|
export async function logs() {
|
||||||
|
return await prisma.log.findMany({
|
||||||
|
orderBy: { timestamp: 'desc' },
|
||||||
|
take: 500
|
||||||
|
})
|
||||||
|
}
|
3
server/src/resolvers/Query/me.js
Normal file
3
server/src/resolvers/Query/me.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export async function me(parent, args, { auth }) {
|
||||||
|
return auth
|
||||||
|
}
|
3
server/src/resolvers/Query/stats.js
Normal file
3
server/src/resolvers/Query/stats.js
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
export async function stats() {
|
||||||
|
return {}
|
||||||
|
}
|
12
server/src/resolvers/Query/user.js
Normal file
12
server/src/resolvers/Query/user.js
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
42
server/src/resolvers/Query/userPresence.js
Normal file
42
server/src/resolvers/Query/userPresence.js
Normal 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)
|
||||||
|
}
|
29
server/src/resolvers/Query/users.js
Normal file
29
server/src/resolvers/Query/users.js
Normal 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.')
|
||||||
|
}
|
||||||
|
}
|
16
server/src/resolvers/Query/wifiDevices.js
Normal file
16
server/src/resolvers/Query/wifiDevices.js
Normal 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 }
|
||||||
|
})
|
||||||
|
}
|
14
server/src/resolvers/Query/wifiUsers.js
Normal file
14
server/src/resolvers/Query/wifiUsers.js
Normal 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
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user