|
|
@ -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 ?? '',
|
|
|
|