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 { updateUserIdMappings } from '../lib/paloalto'
|
||||
import { logInfo, logSuccess } from '../lib/logger'
|
||||
import { logInfo } from '../lib/logger'
|
||||
|
||||
const Mutation = {
|
||||
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