Skip to content

Commit 6e047a3

Browse files
committed
feat: saving completed quizzess records in db
1 parent ecc2a31 commit 6e047a3

File tree

4 files changed

+63
-10
lines changed

4 files changed

+63
-10
lines changed

prisma/schema.prisma

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,24 @@ model Account {
3838
}
3939

4040
model User {
41-
id String @id @default(cuid())
42-
name String?
43-
address String? @unique
44-
email String? @unique
45-
emailVerified DateTime?
46-
image String?
47-
createdAt DateTime @default(now())
48-
accounts Account[]
49-
Todo Todo[]
41+
id String @id @default(cuid())
42+
name String?
43+
address String? @unique
44+
email String? @unique
45+
emailVerified DateTime?
46+
image String?
47+
createdAt DateTime @default(now())
48+
accounts Account[]
49+
Todo Todo[]
50+
CompletedQuizzes CompletedQuizzes[]
51+
}
52+
53+
model CompletedQuizzes {
54+
id String @id @default(cuid())
55+
lesson String
56+
userId String
57+
completed Boolean @default(false)
58+
createdAt DateTime @default(now())
59+
updatedAt DateTime @updatedAt
60+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
5061
}

src/components/mdx/Quiz.tsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
getCorrectAnswersIndexes,
1919
haveSameElements,
2020
} from "@/utils/QuizHelpers";
21+
import { api } from "@/utils/api";
2122

2223
interface QuizProps {
2324
quiz: string;
@@ -123,7 +124,18 @@ const Quiz = (props: QuizProps): JSX.Element => {
123124
});
124125
};
125126

127+
// - Add
128+
const { mutate: quizzesAddMutate, isLoading: quizzesAddIsLoading } =
129+
api.completedQuizzes.add.useMutation({
130+
onSuccess: () => {
131+
return quizSuccessToast();
132+
},
133+
});
134+
126135
const quizSuccessToast = () => {
136+
// api.completedQuizzes.add.useMutation({
137+
// lesson: props.quiz,
138+
// });
127139
toast({
128140
title: "Amazing!",
129141
description: "You have passed the lesson!",
@@ -159,7 +171,11 @@ const Quiz = (props: QuizProps): JSX.Element => {
159171
return quizFailedToast(wrongAnswersCounter);
160172
}
161173

162-
return quizSuccessToast();
174+
// return quizSuccessToast();
175+
176+
quizzesAddMutate({
177+
lesson: props.quiz,
178+
});
163179
};
164180

165181
const cancelQuiz = () => {
@@ -254,6 +270,7 @@ const Quiz = (props: QuizProps): JSX.Element => {
254270
colorScheme="green"
255271
backgroundColor="green.400"
256272
onClick={submit}
273+
isLoading={quizzesAddIsLoading}
257274
>
258275
Submit
259276
</Button>

src/server/api/root.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { createTRPCRouter } from "@/server/api/trpc";
22
import { exampleRouter } from "@/server/api/routers/example";
33
import { todosRouter } from "@/server/api/routers/todos";
4+
import { completedQuizzesRouter } from "@/server/api/routers/completedquizzes";
45

56
/**
67
* This is the primary router for your server.
@@ -10,6 +11,7 @@ import { todosRouter } from "@/server/api/routers/todos";
1011
export const appRouter = createTRPCRouter({
1112
example: exampleRouter,
1213
todos: todosRouter,
14+
completedQuizzes: completedQuizzesRouter,
1315
});
1416

1517
// export type definition of API
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Imports
2+
// ========================================================
3+
import { z } from "zod";
4+
import { createTRPCRouter, protectedProcedure } from "@/server/api/trpc";
5+
6+
// Router
7+
// ========================================================
8+
export const completedQuizzesRouter = createTRPCRouter({
9+
/**
10+
* Add completed Quizz belonging to the session user
11+
*/
12+
add: protectedProcedure
13+
.input(z.object({ lesson: z.string() }))
14+
.mutation(async ({ input, ctx }) => {
15+
return await ctx.prisma.completedQuizzes.create({
16+
data: {
17+
lesson: input.lesson,
18+
userId: ctx.session.user.id,
19+
completed: true,
20+
},
21+
});
22+
}),
23+
});

0 commit comments

Comments
 (0)