[questions][feat] add encounters sorting

pull/458/head
hpkoh 3 years ago
parent a103879b5c
commit e757fdc962

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

@ -400,14 +400,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[]
@ -417,6 +418,7 @@ model QuestionsQuestion {
QuestionsListQuestionEntry QuestionsListQuestionEntry[] QuestionsListQuestionEntry QuestionsListQuestionEntry[]
@@index([lastSeenAt, id]) @@index([lastSeenAt, id])
@@index([numEncounters, id])
@@index([upvotes, id]) @@index([upvotes, id])
} }

@ -59,19 +59,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;
}); });
}, },
@ -178,6 +180,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({
@ -189,17 +193,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;
}); });

@ -31,24 +31,40 @@ export const questionsQuestionRouter = createRouter()
async resolve({ ctx, input }) { async resolve({ ctx, input }) {
const { cursor } = input; const { cursor } = input;
const sortCondition = let sortCondition;
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:

Loading…
Cancel
Save