[questions][feat] pagination

pull/410/head
hpkoh 3 years ago
parent 508eea359e
commit 662d29a199

@ -24,9 +24,13 @@ export const questionsQuestionEncounterRouter = createProtectedRouter()
const locationCounts: Record<string, number> = {}; const locationCounts: Record<string, number> = {};
const roleCounts:Record<string, number> = {}; const roleCounts:Record<string, number> = {};
const latestSeenAt = questionEncountersData[0].seenAt;
for (let i = 0; i < questionEncountersData.length; i++) { for (let i = 0; i < questionEncountersData.length; i++) {
const encounter = questionEncountersData[i]; const encounter = questionEncountersData[i];
latestSeenAt = latestSeenAt < encounter.seenAt ? encounter.seenAt : latestSeenAt;
if (!(encounter.company!.name in companyCounts)) { if (!(encounter.company!.name in companyCounts)) {
companyCounts[encounter.company!.name] = 1; companyCounts[encounter.company!.name] = 1;
} }
@ -46,6 +50,7 @@ export const questionsQuestionEncounterRouter = createProtectedRouter()
const questionEncounter:AggregatedQuestionEncounter = { const questionEncounter:AggregatedQuestionEncounter = {
companyCounts, companyCounts,
latestSeenAt,
locationCounts, locationCounts,
roleCounts, roleCounts,
} }

@ -14,6 +14,8 @@ export const questionsQuestionRouter = createProtectedRouter()
input: z.object({ input: z.object({
companyNames: z.string().array(), companyNames: z.string().array(),
endDate: z.date().default(new Date()), endDate: z.date().default(new Date()),
idCursor: z.string().optional(),
lastSeenCursor: z.date().optional(),
locations: z.string().array(), locations: z.string().array(),
pageSize: z.number().default(50), pageSize: z.number().default(50),
questionTypes: z.nativeEnum(QuestionsQuestionType).array(), questionTypes: z.nativeEnum(QuestionsQuestionType).array(),
@ -21,18 +23,43 @@ export const questionsQuestionRouter = createProtectedRouter()
sortOrder: z.nativeEnum(SortOrder), sortOrder: z.nativeEnum(SortOrder),
sortType: z.nativeEnum(SortType), sortType: z.nativeEnum(SortType),
startDate: z.date().default(new Date(Date.now() - TWO_WEEK_IN_MS)), startDate: z.date().default(new Date(Date.now() - TWO_WEEK_IN_MS)),
upvoteCursor: z.string().optional(),
}), }),
async resolve({ ctx, input }) { async resolve({ ctx, input }) {
const sortCondition = const sortCondition =
input.sortType === SortType.TOP
? [
{
upvotes: input.sortOrder
},
{
id: input.sortOrder
}
]
: [
{
lastSeenAt: input.sortOrder,
},
{
id: input.sortOrder
}
];
const cursorCondition =
input.sortType === SortType.TOP input.sortType === SortType.TOP
? { ? {
upvotes: input.sortOrder, id: input.idCursor,
upvotes: input.upvoteCursor,
} }
: { : {
lastSeenAt: input.sortOrder, id: input.idCursor,
lastSeenAt: input.lastSeenCursor,
}; };
const questionsData = await ctx.prisma.questionsQuestion.findMany({ const questionsData = await ctx.prisma.questionsQuestion.findMany({
cursor: {
...cursorCondition,
},
include: { include: {
_count: { _count: {
select: { select: {
@ -55,9 +82,8 @@ export const questionsQuestionRouter = createProtectedRouter()
}, },
votes: true, votes: true,
}, },
orderBy: { orderBy: sortCondition,
...sortCondition, take: input.pageSize,
},
where: { where: {
...(input.questionTypes.length > 0 ...(input.questionTypes.length > 0
? { ? {
@ -117,16 +143,47 @@ export const questionsQuestionRouter = createProtectedRouter()
0, 0,
); );
const companyCounts: Record<string, number> = {};
const locationCounts: Record<string, number> = {};
const roleCounts:Record<string, number> = {};
let latestSeenAt = data.encounters[0].seenAt;
for (let i = 0; i < data.encounters.length; i++) {
const encounter = data.encounters[i];
latestSeenAt = latestSeenAt < encounter.seenAt ? encounter.seenAt : latestSeenAt;
if (!(encounter.company!.name in companyCounts)) {
companyCounts[encounter.company!.name] = 1;
}
companyCounts[encounter.company!.name] += 1;
if (!(encounter.location in locationCounts)) {
locationCounts[encounter.location] = 1;
}
locationCounts[encounter.location] += 1;
if (!(encounter.role in roleCounts)) {
roleCounts[encounter.role] = 1;
}
roleCounts[encounter.role] += 1;
}
const question: Question = { const question: Question = {
company: data.encounters[0].company!.name ?? 'Unknown company', aggregatedQuestionEncounters: {
companyCounts,
latestSeenAt,
locationCounts,
roleCounts,
},
content: data.content, content: data.content,
id: data.id, id: data.id,
location: data.encounters[0].location ?? 'Unknown location',
numAnswers: data._count.answers, numAnswers: data._count.answers,
numComments: data._count.comments, numComments: data._count.comments,
numVotes: votes, numVotes: votes,
role: data.encounters[0].role ?? 'Unknown role', seenAt: latestSeenAt,
seenAt: data.encounters[0].seenAt,
type: data.questionType, type: data.questionType,
updatedAt: data.updatedAt, updatedAt: data.updatedAt,
user: data.user?.name ?? '', user: data.user?.name ?? '',

@ -1,15 +1,13 @@
import type { QuestionsQuestionType } from '@prisma/client'; import type { QuestionsQuestionType } from '@prisma/client';
export type Question = { export type Question = {
aggregatedQuestionEncounters: AggregatedQuestionEncounter;
// TODO: company, location, role maps // TODO: company, location, role maps
company: string;
content: string; content: string;
id: string; id: string;
location: string;
numAnswers: number; numAnswers: number;
numComments: number; numComments: number;
numVotes: number; numVotes: number;
role: string;
seenAt: Date; seenAt: Date;
type: QuestionsQuestionType; type: QuestionsQuestionType;
updatedAt: Date; updatedAt: Date;
@ -18,6 +16,7 @@ export type Question = {
export type AggregatedQuestionEncounter = { export type AggregatedQuestionEncounter = {
companyCounts: Record<string, number>; companyCounts: Record<string, number>;
latestSeenAt: Date;
locationCounts: Record<string, number>; locationCounts: Record<string, number>;
roleCounts: Record<string, number>; roleCounts: Record<string, number>;
}; };

Loading…
Cancel
Save