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),
+ };
}