From 31d067f99deec5bffc37ea3f77b608a0b3875932 Mon Sep 17 00:00:00 2001 From: Douglas Barone Date: Thu, 26 Nov 2020 14:56:01 -0400 Subject: [PATCH] Update Prisma. Bugfix: set user correct in non identified devices --- pti.code-workspace | 13 +++++ server/package-lock.json | 68 ++++++++++++------------ server/package.json | 4 +- server/src/classes/ResetToken.js | 2 +- server/src/classes/User.js | 2 +- server/src/resolvers/Query.js | 11 +++- server/src/resolvers/ResetToken.js | 4 +- server/src/resolvers/User.js | 2 +- server/src/typeDefs.js | 3 +- server/src/utils/ciscoController.js | 2 +- server/src/utils/wifiUtils.js | 33 ++++++++---- web/src/views/WifiDevices.vue | 82 +++++++++++++++++++++-------- 12 files changed, 148 insertions(+), 78 deletions(-) create mode 100644 pti.code-workspace diff --git a/pti.code-workspace b/pti.code-workspace new file mode 100644 index 0000000..e5d9b29 --- /dev/null +++ b/pti.code-workspace @@ -0,0 +1,13 @@ +{ + "folders": [ + { + "path": "web" + }, + { + "path": "server" + }, + { + "path": "." + } + ] +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index aa84098..3e6c54b 100755 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -10,7 +10,7 @@ "license": "ISC", "dependencies": { "@babel/polyfill": "^7.12.1", - "@prisma/client": "^2.11.0", + "@prisma/client": "^2.12.1", "activedirectory2": "^2.1.0", "apollo-server": "^2.19.0", "apollo-server-plugin-response-cache": "^0.5.6", @@ -32,7 +32,7 @@ "@babel/node": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", "@babel/preset-env": "^7.0.0", - "@prisma/cli": "^2.11.0", + "@prisma/cli": "^2.12.1", "nodemon": "^2.0.6" } }, @@ -2286,33 +2286,33 @@ "devOptional": true }, "node_modules/@prisma/cli": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@prisma/cli/-/cli-2.11.0.tgz", - "integrity": "sha512-RphW+1SPrEKgpuE5RFM0mv3BeVTF8MCRIyBt35Z9Z/E4YI30qgEWfZu6VfsNDarHRsFiJRKC73wx/aMQ2rLp4g==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@prisma/cli/-/cli-2.12.1.tgz", + "integrity": "sha512-obkwK95dEeifCdVehG0rS0BlPQGLsOtc9U1MgbrjNX3MnhXQdwROnvymfPB3DBlNyoLoHGklPgi9UlwBokNXcQ==", "devOptional": true, "hasInstallScript": true, "dependencies": { - "@prisma/bar": "0.0.1", - "@prisma/engines": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918" + "@prisma/bar": "^0.0.1", + "@prisma/engines": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58" }, "bin": { "prisma": "build/index.js", "prisma2": "build/index.js" }, "engines": { - "node": ">=10" + "node": ">=10.4" } }, "node_modules/@prisma/client": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.11.0.tgz", - "integrity": "sha512-BF7K/yi5fAnrt7MelQqUueJyl06IGmIxf+7f5RxFSvyO6xZMbOYxhW21kV2wt10mOIS0khQbo0xY6w/8jViJuQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.12.1.tgz", + "integrity": "sha512-HP4/E9sRdxw/FB7XP4EeRa5ri8Lp1U/L7G4VAA95aM8C+8ARioQHMNDpEjC83NrOrOr4EcaZV5pXDDQL1H+F0g==", "hasInstallScript": true, "dependencies": { - "@prisma/engines-version": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918" + "@prisma/engines-version": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58" }, "engines": { - "node": ">=10" + "node": ">=10.4" }, "peerDependencies": { "@prisma/cli": "*" @@ -2324,16 +2324,16 @@ } }, "node_modules/@prisma/engines": { - "version": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918.tgz", - "integrity": "sha512-0WaUybWM7J5zQuG/zYLbV+ZKx9/nzS7Ruu7Y0K2lXJKy3Z9koeVttq+Xt7tVmUX9TLgI1Rwhb9R2e1JMNDWbsw==", + "version": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58.tgz", + "integrity": "sha512-F6RmUZ5JpPWxmGvVDji8c4gepHIGkvYbtuFi0IoDDJVaCVo8yS656stciKFyswI6/BLWXa0X47/MIMbz6nzw7g==", "devOptional": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { - "version": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918.tgz", - "integrity": "sha512-qlkW4dKoW1dUnperWPuhFriZ/NTHlsKLhBbebxRa8qMuD3o37SvWIDGLjFOQx1N0Eb4H04rI3XxgjkWLFVlZCw==" + "version": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58.tgz", + "integrity": "sha512-IHb/Jag1Wmoq5tLZhOHP5zqLHEXqQEfrHb6l0drIBSvh2AF7yWQ3yyuD0ZEb1Nq37SvbBgop5wrWMOU8YWFTGQ==" }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", @@ -10741,33 +10741,33 @@ "devOptional": true }, "@prisma/cli": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@prisma/cli/-/cli-2.11.0.tgz", - "integrity": "sha512-RphW+1SPrEKgpuE5RFM0mv3BeVTF8MCRIyBt35Z9Z/E4YI30qgEWfZu6VfsNDarHRsFiJRKC73wx/aMQ2rLp4g==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@prisma/cli/-/cli-2.12.1.tgz", + "integrity": "sha512-obkwK95dEeifCdVehG0rS0BlPQGLsOtc9U1MgbrjNX3MnhXQdwROnvymfPB3DBlNyoLoHGklPgi9UlwBokNXcQ==", "devOptional": true, "requires": { - "@prisma/bar": "0.0.1", - "@prisma/engines": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918" + "@prisma/bar": "^0.0.1", + "@prisma/engines": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58" } }, "@prisma/client": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.11.0.tgz", - "integrity": "sha512-BF7K/yi5fAnrt7MelQqUueJyl06IGmIxf+7f5RxFSvyO6xZMbOYxhW21kV2wt10mOIS0khQbo0xY6w/8jViJuQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-2.12.1.tgz", + "integrity": "sha512-HP4/E9sRdxw/FB7XP4EeRa5ri8Lp1U/L7G4VAA95aM8C+8ARioQHMNDpEjC83NrOrOr4EcaZV5pXDDQL1H+F0g==", "requires": { - "@prisma/engines-version": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918" + "@prisma/engines-version": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58" } }, "@prisma/engines": { - "version": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918.tgz", - "integrity": "sha512-0WaUybWM7J5zQuG/zYLbV+ZKx9/nzS7Ruu7Y0K2lXJKy3Z9koeVttq+Xt7tVmUX9TLgI1Rwhb9R2e1JMNDWbsw==", + "version": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58.tgz", + "integrity": "sha512-F6RmUZ5JpPWxmGvVDji8c4gepHIGkvYbtuFi0IoDDJVaCVo8yS656stciKFyswI6/BLWXa0X47/MIMbz6nzw7g==", "devOptional": true }, "@prisma/engines-version": { - "version": "2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.11.0-10.58369335532e47bdcec77a2f1e7c1fb83a463918.tgz", - "integrity": "sha512-qlkW4dKoW1dUnperWPuhFriZ/NTHlsKLhBbebxRa8qMuD3o37SvWIDGLjFOQx1N0Eb4H04rI3XxgjkWLFVlZCw==" + "version": "2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-2.12.0-18.cf0680a1bfe8d5e743dc659cc7f08009f9587d58.tgz", + "integrity": "sha512-IHb/Jag1Wmoq5tLZhOHP5zqLHEXqQEfrHb6l0drIBSvh2AF7yWQ3yyuD0ZEb1Nq37SvbBgop5wrWMOU8YWFTGQ==" }, "@protobufjs/aspromise": { "version": "1.1.2", diff --git a/server/package.json b/server/package.json index 5d5e058..5395831 100755 --- a/server/package.json +++ b/server/package.json @@ -30,12 +30,12 @@ "@babel/node": "^7.0.0", "@babel/plugin-proposal-object-rest-spread": "^7.0.0", "@babel/preset-env": "^7.0.0", - "@prisma/cli": "^2.11.0", + "@prisma/cli": "^2.12.1", "nodemon": "^2.0.6" }, "dependencies": { "@babel/polyfill": "^7.12.1", - "@prisma/client": "^2.11.0", + "@prisma/client": "^2.12.1", "activedirectory2": "^2.1.0", "apollo-server": "^2.19.0", "apollo-server-plugin-response-cache": "^0.5.6", diff --git a/server/src/classes/ResetToken.js b/server/src/classes/ResetToken.js index 0b57401..00bc2e8 100755 --- a/server/src/classes/ResetToken.js +++ b/server/src/classes/ResetToken.js @@ -82,7 +82,7 @@ class ResetToken { } const user = await prisma.resetToken - .findOne({ + .findUnique({ where: { id: resetToken.id } }) .user() diff --git a/server/src/classes/User.js b/server/src/classes/User.js index b486054..e6a1681 100755 --- a/server/src/classes/User.js +++ b/server/src/classes/User.js @@ -17,7 +17,7 @@ class User { */ async init() { try { - let user = await prisma.user.findOne({ + let user = await prisma.user.findUnique({ where: { sAMAccountName: this.username } }) diff --git a/server/src/resolvers/Query.js b/server/src/resolvers/Query.js index 0ba9797..f62e323 100755 --- a/server/src/resolvers/Query.js +++ b/server/src/resolvers/Query.js @@ -91,12 +91,19 @@ const Query = { } }, - wifiDevices: async (_, { identifiedOnly }) => { + wifiDevices: async (_, { identifiedOnly, nonIdentifiedOnly }) => { + if (identifiedOnly && nonIdentifiedOnly) + throw new Error('Invalid combination of filters') + updateDBWithOnlineDevices() return prisma.wifiDevice.findMany({ orderBy: [{ lastSeen: 'desc' }], - where: identifiedOnly ? { NOT: { userId: null } } : {}, + where: identifiedOnly + ? { NOT: { userId: null } } + : nonIdentifiedOnly + ? { userId: null } + : {}, include: { user: true } }) }, diff --git a/server/src/resolvers/ResetToken.js b/server/src/resolvers/ResetToken.js index 3bce67a..e19c72a 100755 --- a/server/src/resolvers/ResetToken.js +++ b/server/src/resolvers/ResetToken.js @@ -2,10 +2,10 @@ import prisma from '../prisma' const ResetToken = { creator(_) { - return prisma.resetToken.findOne({ where: { id: _.id } }).creator() + return prisma.resetToken.findUnique({ where: { id: _.id } }).creator() }, user(_) { - return prisma.resetToken.findOne({ where: { id: _.id } }).user() + return prisma.resetToken.findUnique({ where: { id: _.id } }).user() }, expiration: _ => _.expiration.toISOString(), createdAt: _ => _.createdAt.toISOString() diff --git a/server/src/resolvers/User.js b/server/src/resolvers/User.js index dd27072..b5a813b 100755 --- a/server/src/resolvers/User.js +++ b/server/src/resolvers/User.js @@ -39,7 +39,7 @@ const User = { return [] return prisma.user - .findOne({ + .findUnique({ where: { sAMAccountName: _.sAMAccountName } diff --git a/server/src/typeDefs.js b/server/src/typeDefs.js index f7bf2b7..153bffa 100644 --- a/server/src/typeDefs.js +++ b/server/src/typeDefs.js @@ -25,7 +25,8 @@ const typeDefs = gql` wifiDevices( search: String = "" - identifiedOnly: Boolean = true + identifiedOnly: Boolean = false + nonIdentifiedOnly: Boolean = false ): [WifiDevice]! userPresence(search: String = ""): [UserPresence!] @auth(roles: ["watcher"]) diff --git a/server/src/utils/ciscoController.js b/server/src/utils/ciscoController.js index a96f3a4..90206df 100644 --- a/server/src/utils/ciscoController.js +++ b/server/src/utils/ciscoController.js @@ -46,7 +46,7 @@ export async function getOnlineWifiDevices() { const onlineDevices = await getDevices() const hydratedOnlineDevices = onlineDevices.map(client => ({ - user: client.Name == 'unknown' ? undefined : client.Name, + user: client.Name == 'unknown' ? null : client.Name, oui: ouiFinder(client.macaddr), mac: client.macaddr, hostname: client.HN == 'unknown' ? undefined : client.HN, diff --git a/server/src/utils/wifiUtils.js b/server/src/utils/wifiUtils.js index 82e04c8..5eecbce 100644 --- a/server/src/utils/wifiUtils.js +++ b/server/src/utils/wifiUtils.js @@ -29,22 +29,33 @@ async function updateDBWithOnlineDevices() { const onlineDevices = [...onlineUnifiDevices, ...onlineCiscoDevices] - for (const onlineDevice of onlineDevices) { - const device = { - ...onlineDevice, - user: onlineDevice.user - ? { connect: { sAMAccountName: onlineDevice.user } } - : undefined - } + for (const device of onlineDevices) { + if (!device.user) + await prisma.$executeRaw( + 'UPDATE "WifiDevice" SET "userId" = null WHERE mac = $1', + device.mac + ) try { await prisma.wifiDevice.upsert({ - where: { mac: onlineDevice.mac }, - create: { ...device, firstSeen: device.firstSeen || new Date() }, - update: device + where: { mac: device.mac }, + create: { + ...device, + firstSeen: device.firstSeen || new Date(), + user: device.user + ? { connect: { sAMAccountName: device.user } } + : undefined + }, + update: { + ...device, + user: device.user + ? { connect: { sAMAccountName: device.user } } + : undefined + } }) } catch (e) { - if (e.code != 'P2016') console.log('[wifiDevice upsert error]', e) + if (!['P2016'].includes(e.code)) + console.log('[wifiDevice upsert error]', e) } } diff --git a/web/src/views/WifiDevices.vue b/web/src/views/WifiDevices.vue index 1749852..f010a42 100644 --- a/web/src/views/WifiDevices.vue +++ b/web/src/views/WifiDevices.vue @@ -1,44 +1,78 @@