Added ability to delete an AP
This commit is contained in:
parent
df26fd27a0
commit
82587605d7
|
@ -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;
|
|
@ -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 {
|
||||
|
|
54
server/src/resolvers/Mutation/deleteAccessPoint.js
Normal file
54
server/src/resolvers/Mutation/deleteAccessPoint.js
Normal 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ê só 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
|
||||
}
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
|
@ -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 ||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
já 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)
|
||||
|
|
|
@ -117,6 +117,7 @@
|
|||
<v-icon small>mdi-pencil</v-icon>
|
||||
</v-btn>
|
||||
</v-expand-x-transition>
|
||||
|
||||
<span>
|
||||
{{ item.name }}
|
||||
</span>
|
||||
|
|
Loading…
Reference in New Issue
Block a user