fix: admin leaderboard query (#1522)

Co-authored-by: Lucas Smith <me@lucasjamessmith.me>
This commit is contained in:
Ephraim Duncan
2024-12-13 04:50:52 +00:00
committed by GitHub
parent a21ee2cea6
commit 7d201f05d9
2 changed files with 24 additions and 57 deletions

View File

@@ -134,7 +134,7 @@ export const LeaderboardTable = ({
startTransition(() => { startTransition(() => {
updateSearchParams({ updateSearchParams({
sortBy: column, sortBy: column,
sortOrder: sortOrder === 'asc' ? 'desc' : 'asc', sortOrder: sortBy === column && sortOrder === 'asc' ? 'desc' : 'asc',
}); });
}); });
}; };

View File

@@ -1,5 +1,5 @@
import { prisma } from '@documenso/prisma'; import { prisma } from '@documenso/prisma';
import { Prisma } from '@documenso/prisma/client'; import { DocumentStatus, Prisma } from '@documenso/prisma/client';
export type SigningVolume = { export type SigningVolume = {
id: number; id: number;
@@ -43,34 +43,41 @@ export async function getSigningVolume({
], ],
}); });
const orderByClause = getOrderByClause({ sortBy, sortOrder });
const [subscriptions, totalCount] = await Promise.all([ const [subscriptions, totalCount] = await Promise.all([
prisma.subscription.findMany({ prisma.subscription.findMany({
where: whereClause, where: whereClause,
include: { include: {
User: { User: {
include: { select: {
name: true,
email: true,
Document: { Document: {
where: { where: {
status: 'COMPLETED', status: DocumentStatus.COMPLETED,
deletedAt: null, deletedAt: null,
teamId: null,
}, },
}, },
}, },
}, },
team: { team: {
include: { select: {
name: true,
document: { document: {
where: { where: {
status: 'COMPLETED', status: DocumentStatus.COMPLETED,
deletedAt: null, deletedAt: null,
}, },
}, },
}, },
}, },
}, },
orderBy: orderByClause, orderBy:
sortBy === 'name'
? [{ User: { name: sortOrder } }, { team: { name: sortOrder } }, { createdAt: 'desc' }]
: sortBy === 'createdAt'
? [{ createdAt: sortOrder }]
: undefined,
skip: Math.max(page - 1, 0) * perPage, skip: Math.max(page - 1, 0) * perPage,
take: perPage, take: perPage,
}), }),
@@ -82,10 +89,8 @@ export async function getSigningVolume({
const leaderboardWithVolume: SigningVolume[] = subscriptions.map((subscription) => { const leaderboardWithVolume: SigningVolume[] = subscriptions.map((subscription) => {
const name = const name =
subscription.User?.name || subscription.team?.name || subscription.User?.email || 'Unknown'; subscription.User?.name || subscription.team?.name || subscription.User?.email || 'Unknown';
const userSignedDocs = subscription.User?.Document?.length || 0; const userSignedDocs = subscription.User?.Document?.length || 0;
const teamSignedDocs = subscription.team?.document?.length || 0; const teamSignedDocs = subscription.team?.document?.length || 0;
return { return {
id: subscription.id, id: subscription.id,
name, name,
@@ -95,54 +100,16 @@ export async function getSigningVolume({
}; };
}); });
if (sortBy === 'signingVolume') {
leaderboardWithVolume.sort((a, b) => {
return sortOrder === 'desc'
? b.signingVolume - a.signingVolume
: a.signingVolume - b.signingVolume;
});
}
return { return {
leaderboard: leaderboardWithVolume, leaderboard: leaderboardWithVolume,
totalPages: Math.ceil(totalCount / perPage), totalPages: Math.ceil(totalCount / perPage),
}; };
} }
function getOrderByClause(options: {
sortBy: string;
sortOrder: 'asc' | 'desc';
}): Prisma.SubscriptionOrderByWithRelationInput | Prisma.SubscriptionOrderByWithRelationInput[] {
const { sortBy, sortOrder } = options;
if (sortBy === 'name') {
return [
{
User: {
name: sortOrder,
},
},
{
team: {
name: sortOrder,
},
},
];
}
if (sortBy === 'createdAt') {
return {
createdAt: sortOrder,
};
}
// Default: sort by signing volume
return [
{
User: {
Document: {
_count: sortOrder,
},
},
},
{
team: {
document: {
_count: sortOrder,
},
},
},
];
}