Added ability to delete an AP

This commit is contained in:
Douglas Barone 2022-08-29 12:54:45 -04:00
parent df26fd27a0
commit 82587605d7
8 changed files with 111 additions and 7 deletions

View File

@ -0,0 +1,5 @@
-- DropForeignKey
ALTER TABLE "AccessPointStats" DROP CONSTRAINT "AccessPointStats_accessPointId_fkey";
-- AddForeignKey
ALTER TABLE "AccessPointStats" ADD CONSTRAINT "AccessPointStats_accessPointId_fkey" FOREIGN KEY ("accessPointId") REFERENCES "AccessPoint"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@ -105,7 +105,7 @@ model WifiDevice {
identity String? // The user informed by the controller
accessPointId Int?
accessPoint AccessPoint? @relation("wifidevice_to_ap", fields: [accessPointId], references: [id])
accessPoint AccessPoint? @relation("wifidevice_to_ap", fields: [accessPointId], references: [id], onDelete: SetNull)
userId Int? // The connected User
user User? @relation("wifidevice_to_user", fields: [userId], references: [id])
@ -199,7 +199,7 @@ model AccessPointStats {
sumUsage BigInt?
accessPointId Int
accessPoint AccessPoint @relation("accesspointstats_to_ap", fields: [accessPointId], references: [id])
accessPoint AccessPoint @relation("accesspointstats_to_ap", fields: [accessPointId], references: [id], onDelete: Cascade)
}
model Network {

View File

@ -0,0 +1,54 @@
import prisma from '../../prisma'
import { ACCESS_POINTS_UPDATED, pubsub } from '../../pubsub'
import { logError, logInfo } from '../../lib/logger'
import { getSubnetInfo } from '../../lib/subnetInfo'
export async function deleteAccessPoint(_, { id }, { auth }) {
const accessPoint = await prisma.accessPoint.findUnique({
where: { id: parseInt(id) }
})
if (!accessPoint) throw new Error('Access Point não encontrado')
if (getSubnetInfo(accessPoint.ip).shortName !== auth.campus) {
logError({
tags: ['accessPointEdited', 'accessPoints'],
message: `O usuário ${auth.displayName} (${
auth.sAMAccountName
}) tentou deletar o
AP ${
accessPoint.name || accessPoint.hostname
}, mas não tinha permissão.`
})
throw new Error(
`O AP ${
accessPoint.name || accessPoint.hostname
} não está na rede do campus ${
auth.campus
}. Você pode deletar APs da rede do seu campus.`
)
}
const updatedAccessPoint = await prisma.accessPoint.delete({
where: { id: parseInt(id) }
})
logInfo({
tags: ['accessPointDeleted', 'accessPoints'],
message: `O usuário ${auth.displayName} (${
auth.sAMAccountName
}) deletou o AP ${updatedAccessPoint.name || updatedAccessPoint.hostname}`,
data: updatedAccessPoint
})
const accessPoints = await prisma.accessPoint.findMany({
include: { wifiDevices: true }
})
pubsub.publish(ACCESS_POINTS_UPDATED, {
accessPointsUpdated: accessPoints
})
return updatedAccessPoint
}

View File

@ -8,6 +8,7 @@ import { deleteExpiredTokens } from './deleteExpiredTokens'
import { importUsers } from './importUsers'
import { addPAHost } from './addPAHost'
import { delPAHost } from './delPAHost'
import { deleteAccessPoint } from './deleteAccessPoint'
import { updateAccessPoint } from './updateAccessPoint'
const Mutation = {
@ -21,6 +22,7 @@ const Mutation = {
importUsers,
addPAHost,
delPAHost,
deleteAccessPoint,
updateAccessPoint
}

View File

@ -25,11 +25,6 @@ class AuthDirective extends SchemaDirectiveVisitor {
context.auth = user
console.log({
user: user.updatePassword,
context: context.auth.updatePassword
})
if (user.pwdLastSet.toISOString() === pwdLastSet) {
if (
expectedRoles.length === 0 ||

View File

@ -102,6 +102,9 @@ const typeDefs = gql`
"Update an Access Point"
updateAccessPoint(data: UpdateAccessPointInput): AccessPoint!
@auth(roles: ["superAdmin"])
"Delete an Access Point"
deleteAccessPoint(id: ID!): AccessPoint! @auth(roles: ["superAdmin"])
}
type Subscription {

View File

@ -31,6 +31,9 @@
/>
<v-textarea v-model="notes" label="Observações" outlined clearable />
<v-card-actions>
<v-btn color="error darken-1" icon @click="onDeleteAccessPoint">
<v-icon>mdi-delete</v-icon>
</v-btn>
<v-spacer />
<v-btn color="primary" @click="onUpdateAccessPoint">
<v-icon left>mdi-check</v-icon>
@ -96,6 +99,47 @@ export default {
}
})
this.$router.push({ name: 'access-points' })
} catch (e) {
this.errors = e.graphQLErrors.map(error => error.message)
} finally {
this.loading = false
}
},
async onDeleteAccessPoint() {
this.errors = []
this.loading = true
try {
if (
!confirm('Deletar este Access Point?') ||
!confirm(
`ATENÇÃO!
Esta ação desassociará todos os dispositivos que
se conectaram à este AP. Além disso, se o AP
ainda estiver registrado na controladora, ele
será incluído novamente automaticamente.
Continuar?`
)
)
return
await this.$apollo.mutate({
mutation: gql`
mutation ($id: ID!) {
deleteAccessPoint(id: $id) {
id
}
}
`,
variables: {
id: this.$route.params.id
}
})
this.$router.push({ name: 'access-points' })
} catch (e) {
this.errors = e.graphQLErrors.map(error => error.message)

View File

@ -117,6 +117,7 @@
<v-icon small>mdi-pencil</v-icon>
</v-btn>
</v-expand-x-transition>
<span>
{{ item.name }}
</span>