From 2d2c02144649bf35dcdd9337f261c5fffef80ca2 Mon Sep 17 00:00:00 2001 From: Markus Thielker Date: Sat, 4 Jan 2025 13:30:14 +0100 Subject: [PATCH] NORY-45: prepare custom query for pagination --- dashboard/src/app/(inside)/user/page.tsx | 6 ++--- dashboard/src/lib/action/identity.ts | 28 ++++++++++++++++++++---- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/dashboard/src/app/(inside)/user/page.tsx b/dashboard/src/app/(inside)/user/page.tsx index fe2d034..92eee5e 100644 --- a/dashboard/src/app/(inside)/user/page.tsx +++ b/dashboard/src/app/(inside)/user/page.tsx @@ -16,9 +16,9 @@ export default async function UserPage( const page = params.page ? Number(params.page) : 1; const query = params.query ? params.query as string : ''; - let pageSize = 250; + let pageSize = 50; - const initialData = await queryIdentities({ page, pageSize, query }); + const { data, pageCount } = await queryIdentities({ page, pageSize, query }); return (
@@ -34,7 +34,7 @@ export default async function UserPage( queryParamKey="query" placeholder="Search for identifiers (Email, Username...)"/>
diff --git a/dashboard/src/lib/action/identity.ts b/dashboard/src/lib/action/identity.ts index 9e1054c..4a93084 100644 --- a/dashboard/src/lib/action/identity.ts +++ b/dashboard/src/lib/action/identity.ts @@ -15,14 +15,14 @@ import { eq, ilike, or, sql } from 'drizzle-orm'; interface QueryIdentitiesProps { page: number, - pageSize?: number, + pageSize: number, query?: string, } export async function queryIdentities({ page, pageSize, query }: QueryIdentitiesProps) { const db = await getDB(); - const results = await db.select() + const result = await db.select() .from(identities) .leftJoin(identityVerifiableAddresses, eq(identities.id, identityVerifiableAddresses.identityId)) .leftJoin(identityRecoveryAddresses, eq(identities.id, identityRecoveryAddresses.identityId)) @@ -30,14 +30,34 @@ export async function queryIdentities({ page, pageSize, query }: QueryIdentities sql`${identities.traits}::text ILIKE ${`%${query}%`}`, ilike(identityVerifiableAddresses.value, `%${query}%`), - )); + )) + .limit(pageSize) + .offset((page - 1) * pageSize); - return results.map((it) => { + const resultCount = await db.$count( + db.select() + .from(identities) + .leftJoin(identityVerifiableAddresses, eq(identities.id, identityVerifiableAddresses.identityId)) + .leftJoin(identityRecoveryAddresses, eq(identities.id, identityRecoveryAddresses.identityId)) + .where(or( + sql`${identities.traits}::text ILIKE + ${`%${query}%`}`, + ilike(identityVerifiableAddresses.value, `%${query}%`), + )) + .as('subquery'), + ); + + const resultTyped = result.map((it) => { const typed = it.identities as unknown as Identity; typed.verifiable_addresses = [it.identity_verifiable_addresses] as unknown as VerifiableIdentityAddress[]; typed.recovery_addresses = [it.identity_verifiable_addresses] as unknown as RecoveryIdentityAddress[]; return typed; }); + + return { + data: resultTyped, + pageCount: Math.ceil(resultCount / pageSize), + }; }