[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:
hpkoh
2022-10-31 12:56:45 +08:00
committed by GitHub
parent 27095e3747
commit 6bfa1ff61e
5 changed files with 72 additions and 41 deletions

View File

@ -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");

View File

@ -438,14 +438,15 @@ enum QuestionsQuestionType {
} }
model QuestionsQuestion { model QuestionsQuestion {
id String @id @default(cuid()) id String @id @default(cuid())
userId String? userId String?
content String @db.Text content String @db.Text
questionType QuestionsQuestionType questionType QuestionsQuestionType
lastSeenAt DateTime? lastSeenAt DateTime?
upvotes Int @default(0) upvotes Int @default(0)
createdAt DateTime @default(now()) numEncounters Int @default(0)
updatedAt DateTime @updatedAt createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User? @relation(fields: [userId], references: [id], onDelete: SetNull) user User? @relation(fields: [userId], references: [id], onDelete: SetNull)
encounters QuestionsQuestionEncounter[] encounters QuestionsQuestionEncounter[]
@ -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])
} }

View File

@ -41,19 +41,21 @@ export const questionsQuestionEncounterUserRouter = createProtectedRouter()
}); });
} }
if (
questionToUpdate.lastSeenAt === null || await tx.questionsQuestion.update({
questionToUpdate.lastSeenAt < input.seenAt data: {
) { lastSeenAt: (questionToUpdate.lastSeenAt === null ||
await tx.questionsQuestion.update({ questionToUpdate.lastSeenAt < input.seenAt)
data: { ? input.seenAt : undefined,
lastSeenAt: input.seenAt, numEncounters: {
increment: 1,
}, },
where: { },
id: input.questionId, where: {
}, 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;
}); });

View File

@ -27,24 +27,40 @@ 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:
upvotes: input.sortOrder, sortCondition = [
}, {
{ upvotes: input.sortOrder,
id: input.sortOrder, },
}, {
] id: input.sortOrder,
: [ },
{ ]
lastSeenAt: input.sortOrder, break;
}, case SortType.NEW:
{ sortCondition = [
id: input.sortOrder, {
}, lastSeenAt: 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,

View File

@ -88,4 +88,5 @@ export enum SortOrder {
export enum SortType { export enum SortType {
TOP, TOP,
NEW, NEW,
ENCOUNTERS,
} }