[questions][feat] add encounters transaction for crud

pull/409/head
hpkoh 3 years ago
parent 134977d05a
commit 6f12b1ccb2

@ -1,7 +1,8 @@
// Refer to the Prisma schema docs: https://pris.ly/d/prisma-schema
generator client {
provider = "prisma-client-js"
provider = "prisma-client-js"
previewFeatures = ["interactiveTransactions"]
}
datasource db {

@ -4,6 +4,8 @@ import { TRPCError } from '@trpc/server';
import { createProtectedRouter } from './context';
import type { AggregatedQuestionEncounter } from '~/types/questions';
import { SortOrder } from '~/types/questions';
export const questionsQuestionEncounterRouter = createProtectedRouter()
.query('getAggregatedEncounters', {
@ -63,11 +65,31 @@ export const questionsQuestionEncounterRouter = createProtectedRouter()
async resolve({ ctx, input }) {
const userId = ctx.session?.user?.id;
return await ctx.prisma.questionsQuestionEncounter.create({
data: {
...input,
userId,
},
return await ctx.prisma.$transaction(async (tx) => {
const questionToUpdate = await tx.questionsQuestion.findUnique({
where: {
id: input.questionId,
},
});
const questionEncounterCreated = await tx.questionsQuestionEncounter.create({
data: {
...input,
userId,
},
});
if (questionToUpdate < input.seenAt) {
await tx.questionsQuestion.update({
data: {
lastSeenAt : input.seenAt,
},
where: {
id: input.questionId,
},
});
}
return questionEncounterCreated;
});
},
})
@ -96,14 +118,48 @@ export const questionsQuestionEncounterRouter = createProtectedRouter()
});
}
return await ctx.prisma.questionsQuestionEncounter.update({
data: {
...input,
},
where: {
id: input.id,
},
return await ctx.prisma.$transaction(async (tx) => {
const questionToUpdate = await tx.questionsQuestion.findUnique({
where: {
id: questionEncounterToUpdate.questionId,
},
});
const questionEncounterUpdated = await ctx.prisma.questionsQuestionEncounter.update({
data: {
...input,
},
where: {
id: input.id,
},
});
if (questionToUpdate.lastSeenAt === questionEncounterToUpdate.seenAt) {
const latestEncounter = await ctx.prisma.questionsQuestionEncounter.findFirst({
orderBy: {
seenAt: SortOrder.DESC,
},
where: {
questionId: questionToUpdate.questionId,
},
});
const lastSeenVal = latestEncounter ? latestEncounter!.seenAt : null;
await tx.questionsQuestion.update({
data: {
lastSeenAt : lastSeenVal,
},
where: {
id: questionToUpdate.questionId,
},
});
}
return questionEncounterUpdated;
});
},
})
.mutation('delete', {
@ -126,10 +182,42 @@ export const questionsQuestionEncounterRouter = createProtectedRouter()
});
}
return await ctx.prisma.questionsQuestionEncounter.delete({
where: {
id: input.id,
},
return await ctx.prisma.$transaction(async (tx) => {
const questionToUpdate = await tx.questionsQuestion.findUnique({
where: {
id: questionEncounterToDelete.questionId,
},
});
const questionEncounterDeleted = await ctx.prisma.questionsQuestionEncounter.delete({
where: {
id: input.id,
},
});
if (questionToUpdate.lastSeenAt === questionEncounterToDelete.seenAt) {
const latestEncounter = await ctx.prisma.questionsQuestionEncounter.findFirst({
orderBy: {
seenAt: SortOrder.DESC,
},
where: {
questionId: questionToUpdate.questionId,
},
});
const lastSeenVal = latestEncounter ? latestEncounter!.seenAt : null;
await tx.questionsQuestion.update({
data: {
lastSeenAt : lastSeenVal,
},
where: {
id: questionToUpdate.questionId,
},
});
}
return questionEncounterDeleted;
});
},
});
Loading…
Cancel
Save