mirror of
https://github.com/yangshun/tech-interview-handbook.git
synced 2025-07-28 20:52:00 +08:00
[questions][feat] add encounters sorting (#458)
Co-authored-by: Bryann Yeap Kok Keong <bryannyeapkk@gmail.com> Co-authored-by: Ai Ling <hong-ailing@hotmail.com> Co-authored-by: Zhang Ziqing <zhangziqing9926@gmail.com> Co-authored-by: Bryann Yeap Kok Keong <77266823+BryannYeap@users.noreply.github.com>
This commit is contained in:
@ -0,0 +1,5 @@
|
|||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "QuestionsQuestion" ADD COLUMN "numEncounters" INTEGER NOT NULL DEFAULT 0;
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "QuestionsQuestion_numEncounters_id_idx" ON "QuestionsQuestion"("numEncounters", "id");
|
@ -444,6 +444,7 @@ model QuestionsQuestion {
|
|||||||
questionType QuestionsQuestionType
|
questionType QuestionsQuestionType
|
||||||
lastSeenAt DateTime?
|
lastSeenAt DateTime?
|
||||||
upvotes Int @default(0)
|
upvotes Int @default(0)
|
||||||
|
numEncounters Int @default(0)
|
||||||
createdAt DateTime @default(now())
|
createdAt DateTime @default(now())
|
||||||
updatedAt DateTime @updatedAt
|
updatedAt DateTime @updatedAt
|
||||||
|
|
||||||
@ -455,6 +456,7 @@ model QuestionsQuestion {
|
|||||||
questionsListQuestionEntries QuestionsListQuestionEntry[]
|
questionsListQuestionEntries QuestionsListQuestionEntry[]
|
||||||
|
|
||||||
@@index([lastSeenAt, id])
|
@@index([lastSeenAt, id])
|
||||||
|
@@index([numEncounters, id])
|
||||||
@@index([upvotes, id])
|
@@index([upvotes, id])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,19 +41,21 @@ export const questionsQuestionEncounterUserRouter = createProtectedRouter()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
|
||||||
questionToUpdate.lastSeenAt === null ||
|
|
||||||
questionToUpdate.lastSeenAt < input.seenAt
|
|
||||||
) {
|
|
||||||
await tx.questionsQuestion.update({
|
await tx.questionsQuestion.update({
|
||||||
data: {
|
data: {
|
||||||
lastSeenAt: input.seenAt,
|
lastSeenAt: (questionToUpdate.lastSeenAt === null ||
|
||||||
|
questionToUpdate.lastSeenAt < input.seenAt)
|
||||||
|
? input.seenAt : undefined,
|
||||||
|
numEncounters: {
|
||||||
|
increment: 1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
where: {
|
where: {
|
||||||
id: input.questionId,
|
id: input.questionId,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
|
||||||
return questionEncounterCreated;
|
return questionEncounterCreated;
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -160,6 +162,8 @@ export const questionsQuestionEncounterUserRouter = createProtectedRouter()
|
|||||||
}),
|
}),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
let lastSeenVal = undefined;
|
||||||
|
|
||||||
if (questionToUpdate!.lastSeenAt === questionEncounterToDelete.seenAt) {
|
if (questionToUpdate!.lastSeenAt === questionEncounterToDelete.seenAt) {
|
||||||
const latestEncounter =
|
const latestEncounter =
|
||||||
await ctx.prisma.questionsQuestionEncounter.findFirst({
|
await ctx.prisma.questionsQuestionEncounter.findFirst({
|
||||||
@ -171,17 +175,20 @@ export const questionsQuestionEncounterUserRouter = createProtectedRouter()
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const lastSeenVal = latestEncounter ? latestEncounter!.seenAt : null;
|
lastSeenVal = latestEncounter ? latestEncounter!.seenAt : null;
|
||||||
|
}
|
||||||
|
|
||||||
await tx.questionsQuestion.update({
|
await tx.questionsQuestion.update({
|
||||||
data: {
|
data: {
|
||||||
lastSeenAt: lastSeenVal,
|
lastSeenAt: lastSeenVal,
|
||||||
|
numEncounters: {
|
||||||
|
increment: -1,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
where: {
|
where: {
|
||||||
id: questionToUpdate!.id,
|
id: questionToUpdate!.id,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
return questionEncounterDeleted;
|
return questionEncounterDeleted;
|
||||||
});
|
});
|
||||||
|
@ -27,9 +27,11 @@ export const questionsQuestionRouter = createRouter()
|
|||||||
async resolve({ ctx, input }) {
|
async resolve({ ctx, input }) {
|
||||||
const { cursor } = input;
|
const { cursor } = input;
|
||||||
|
|
||||||
const sortCondition =
|
let sortCondition = undefined;
|
||||||
input.sortType === SortType.TOP
|
|
||||||
? [
|
switch (input.sortType) {
|
||||||
|
case SortType.TOP:
|
||||||
|
sortCondition = [
|
||||||
{
|
{
|
||||||
upvotes: input.sortOrder,
|
upvotes: input.sortOrder,
|
||||||
},
|
},
|
||||||
@ -37,7 +39,9 @@ export const questionsQuestionRouter = createRouter()
|
|||||||
id: input.sortOrder,
|
id: input.sortOrder,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
: [
|
break;
|
||||||
|
case SortType.NEW:
|
||||||
|
sortCondition = [
|
||||||
{
|
{
|
||||||
lastSeenAt: input.sortOrder,
|
lastSeenAt: input.sortOrder,
|
||||||
},
|
},
|
||||||
@ -45,6 +49,18 @@ export const questionsQuestionRouter = createRouter()
|
|||||||
id: input.sortOrder,
|
id: input.sortOrder,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
break;
|
||||||
|
case SortType.ENCOUNTERS:
|
||||||
|
sortCondition = [
|
||||||
|
{
|
||||||
|
numEncounters: input.sortOrder,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
id: input.sortOrder,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
const questionsData = await ctx.prisma.questionsQuestion.findMany({
|
const questionsData = await ctx.prisma.questionsQuestion.findMany({
|
||||||
cursor: cursor ? { id: cursor } : undefined,
|
cursor: cursor ? { id: cursor } : undefined,
|
||||||
|
1
apps/portal/src/types/questions.d.ts
vendored
1
apps/portal/src/types/questions.d.ts
vendored
@ -88,4 +88,5 @@ export enum SortOrder {
|
|||||||
export enum SortType {
|
export enum SortType {
|
||||||
TOP,
|
TOP,
|
||||||
NEW,
|
NEW,
|
||||||
|
ENCOUNTERS,
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user