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
|
identity String? // The user informed by the controller
|
||||||
|
|
||||||
accessPointId Int?
|
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
|
userId Int? // The connected User
|
||||||
user User? @relation("wifidevice_to_user", fields: [userId], references: [id])
|
user User? @relation("wifidevice_to_user", fields: [userId], references: [id])
|
||||||
|
@ -199,7 +199,7 @@ model AccessPointStats {
|
||||||
sumUsage BigInt?
|
sumUsage BigInt?
|
||||||
|
|
||||||
accessPointId Int
|
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 {
|
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 { importUsers } from './importUsers'
|
||||||
import { addPAHost } from './addPAHost'
|
import { addPAHost } from './addPAHost'
|
||||||
import { delPAHost } from './delPAHost'
|
import { delPAHost } from './delPAHost'
|
||||||
|
import { deleteAccessPoint } from './deleteAccessPoint'
|
||||||
import { updateAccessPoint } from './updateAccessPoint'
|
import { updateAccessPoint } from './updateAccessPoint'
|
||||||
|
|
||||||
const Mutation = {
|
const Mutation = {
|
||||||
|
@ -21,6 +22,7 @@ const Mutation = {
|
||||||
importUsers,
|
importUsers,
|
||||||
addPAHost,
|
addPAHost,
|
||||||
delPAHost,
|
delPAHost,
|
||||||
|
deleteAccessPoint,
|
||||||
updateAccessPoint
|
updateAccessPoint
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,11 +25,6 @@ class AuthDirective extends SchemaDirectiveVisitor {
|
||||||
|
|
||||||
context.auth = user
|
context.auth = user
|
||||||
|
|
||||||
console.log({
|
|
||||||
user: user.updatePassword,
|
|
||||||
context: context.auth.updatePassword
|
|
||||||
})
|
|
||||||
|
|
||||||
if (user.pwdLastSet.toISOString() === pwdLastSet) {
|
if (user.pwdLastSet.toISOString() === pwdLastSet) {
|
||||||
if (
|
if (
|
||||||
expectedRoles.length === 0 ||
|
expectedRoles.length === 0 ||
|
||||||
|
|
|
@ -102,6 +102,9 @@ const typeDefs = gql`
|
||||||
"Update an Access Point"
|
"Update an Access Point"
|
||||||
updateAccessPoint(data: UpdateAccessPointInput): AccessPoint!
|
updateAccessPoint(data: UpdateAccessPointInput): AccessPoint!
|
||||||
@auth(roles: ["superAdmin"])
|
@auth(roles: ["superAdmin"])
|
||||||
|
|
||||||
|
"Delete an Access Point"
|
||||||
|
deleteAccessPoint(id: ID!): AccessPoint! @auth(roles: ["superAdmin"])
|
||||||
}
|
}
|
||||||
|
|
||||||
type Subscription {
|
type Subscription {
|
||||||
|
|
|
@ -31,6 +31,9 @@
|
||||||
/>
|
/>
|
||||||
<v-textarea v-model="notes" label="Observações" outlined clearable />
|
<v-textarea v-model="notes" label="Observações" outlined clearable />
|
||||||
<v-card-actions>
|
<v-card-actions>
|
||||||
|
<v-btn color="error darken-1" icon @click="onDeleteAccessPoint">
|
||||||
|
<v-icon>mdi-delete</v-icon>
|
||||||
|
</v-btn>
|
||||||
<v-spacer />
|
<v-spacer />
|
||||||
<v-btn color="primary" @click="onUpdateAccessPoint">
|
<v-btn color="primary" @click="onUpdateAccessPoint">
|
||||||
<v-icon left>mdi-check</v-icon>
|
<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' })
|
this.$router.push({ name: 'access-points' })
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.errors = e.graphQLErrors.map(error => error.message)
|
this.errors = e.graphQLErrors.map(error => error.message)
|
||||||
|
|
|
@ -117,6 +117,7 @@
|
||||||
<v-icon small>mdi-pencil</v-icon>
|
<v-icon small>mdi-pencil</v-icon>
|
||||||
</v-btn>
|
</v-btn>
|
||||||
</v-expand-x-transition>
|
</v-expand-x-transition>
|
||||||
|
|
||||||
<span>
|
<span>
|
||||||
{{ item.name }}
|
{{ item.name }}
|
||||||
</span>
|
</span>
|
||||||
|
|
Loading…
Reference in New Issue
Block a user