From 249bcaca68d5be302fd8cf2bbad3fca4869c9a7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Omar=20L=C3=B3pez?= Date: Thu, 28 Nov 2024 14:45:40 -0700 Subject: [PATCH] fix: locked users admin list and bypass query (#17902) --- packages/prisma/extensions/exclude-locked-users.ts | 12 +++++++++++- .../routers/viewer/admin/listPaginated.handler.ts | 12 +++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/prisma/extensions/exclude-locked-users.ts b/packages/prisma/extensions/exclude-locked-users.ts index f4ccbd11df0a2e..dce5ae9a20bfea 100644 --- a/packages/prisma/extensions/exclude-locked-users.ts +++ b/packages/prisma/extensions/exclude-locked-users.ts @@ -25,6 +25,14 @@ export function excludeLockedUsersExtension() { }); } +function safeJSONStringify(x: any) { + try { + return JSON.stringify(x); + } catch { + return ""; + } +} + async function excludeLockedUsers( args: | Prisma.UserFindUniqueArgs @@ -35,8 +43,10 @@ async function excludeLockedUsers( query: (args: T) => Promise ) { args.where = args.where || {}; + const whereString = safeJSONStringify(args.where); + const shouldIncludeLocked = whereString.includes('"locked":'); // Unless explicitly specified, we exclude locked users - if (args.where.locked === undefined) { + if (!shouldIncludeLocked) { args.where.locked = false; } return query(args); diff --git a/packages/trpc/server/routers/viewer/admin/listPaginated.handler.ts b/packages/trpc/server/routers/viewer/admin/listPaginated.handler.ts index 534b11394805bb..226d31bd7fcdc0 100644 --- a/packages/trpc/server/routers/viewer/admin/listPaginated.handler.ts +++ b/packages/trpc/server/routers/viewer/admin/listPaginated.handler.ts @@ -17,9 +17,12 @@ const listPaginatedHandler = async ({ input }: GetOptions) => { const getTotalUsers = await prisma.user.count(); let searchFilters: Prisma.UserWhereInput = {}; + const bothLockedAndUnlockedWhere = { OR: [{ locked: false }, { locked: true }] }; if (searchTerm) { searchFilters = { + // To bypass the excludeLockedUsersExtension + AND: bothLockedAndUnlockedWhere, OR: [ { email: { @@ -33,16 +36,15 @@ const listPaginatedHandler = async ({ input }: GetOptions) => { }, ], }; + } else { + // To bypass the excludeLockedUsersExtension + searchFilters = bothLockedAndUnlockedWhere; } const users = await prisma.user.findMany({ cursor: cursor ? { id: cursor } : undefined, take: limit + 1, // We take +1 as itll be used for the next cursor - where: { - ...searchFilters, - // To bypass the excludeLockedUsersExtension - OR: [{ locked: false }, { locked: true }], - }, + where: searchFilters, orderBy: { id: "asc", },