Skip to content

Commit d110421

Browse files
committed
Add integration for question details
Signed-off-by: SeeuSim <[email protected]>
1 parent c1188c6 commit d110421

File tree

4 files changed

+39
-18
lines changed

4 files changed

+39
-18
lines changed

backend/question/src/controller/question-controller.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
import { Request, Response } from 'express';
1+
import { StatusCodes } from 'http-status-codes';
2+
import type { Request, Response } from 'express';
3+
24
import {
35
getQuestionsService,
46
getQuestionDetailsService,
@@ -10,7 +12,6 @@ import type {
1012
IGetQuestionPayload,
1113
IGetRandomQuestionPayload,
1214
} from '@/services/get/types';
13-
import { StatusCodes } from 'http-status-codes';
1415

1516
export const getQuestions = async (req: Request, res: Response): Promise<Response> => {
1617
const payload: IGetQuestionsPayload = {
@@ -23,7 +24,7 @@ export const getQuestions = async (req: Request, res: Response): Promise<Respons
2324

2425
try {
2526
const result = await getQuestionsService(payload);
26-
if (!result.data || result.code < 400) {
27+
if (!result.data || result.code >= 400) {
2728
return res.status(result.code).json({
2829
message: result.error?.message ?? 'An error occurred',
2930
});
@@ -43,7 +44,7 @@ export const getQuestionDetails = async (req: Request, res: Response): Promise<R
4344

4445
try {
4546
const result = await getQuestionDetailsService(payload);
46-
if (!result.data || result.code < 400) {
47+
if (!result.data || result.code >= 400) {
4748
return res.status(result.code).json({
4849
message: result.error?.message ?? 'An error occurred',
4950
});

frontend/src/components/providers/query-provider.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { QueryClientProvider } from '@tanstack/react-query';
33
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
44
import { queryClient } from '@/lib/query-client';
55

6-
const IS_SHOW_DEVTOOLS = false;
6+
const IS_SHOW_DEVTOOLS = true;
77

88
export const QueryProvider: FC<PropsWithChildren> = ({ children }) => {
99
return (

frontend/src/routes/questions/details/main.tsx

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { QueryClient, queryOptions, useSuspenseQuery } from '@tanstack/react-query';
2+
import { useMemo } from 'react';
23
import Markdown from 'react-markdown';
34
import { LoaderFunctionArgs, useLoaderData } from 'react-router-dom';
45
import rehypeKatex from 'rehype-katex';
@@ -32,8 +33,14 @@ export const loader =
3233
export const QuestionDetails = () => {
3334
const { questionId } = useLoaderData() as Awaited<ReturnType<ReturnType<typeof loader>>>;
3435
const { data: details } = useSuspenseQuery(questionDetailsQuery(questionId));
35-
const { crumbs } = useCrumbs({ path: '<CURRENT>', title: `${questionId}. ${details.title}` });
36-
usePageTitle(details.title);
36+
const questionDetails = useMemo(() => {
37+
return details.question;
38+
}, [details]);
39+
const { crumbs } = useCrumbs({
40+
path: '<CURRENT>',
41+
title: `${questionId}. ${questionDetails.title}`,
42+
});
43+
usePageTitle(details.question.title);
3744

3845
return (
3946
<WithNavBanner crumbs={[...crumbs]}>
@@ -44,19 +51,19 @@ export const QuestionDetails = () => {
4451
<div className='flex flex-col gap-4'>
4552
<div className='flex w-full items-center gap-4'>
4653
<CardTitle className='text-2xl'>
47-
{details.id}.&nbsp;{details.title}
54+
{questionDetails.id}.&nbsp;{questionDetails.title}
4855
</CardTitle>
4956
</div>
5057
<div className='flex flex-wrap items-center gap-1'>
5158
<Badge
52-
variant={details.difficulty.toLowerCase() as 'easy' | 'medium' | 'hard'}
59+
variant={questionDetails.difficulty.toLowerCase() as 'easy' | 'medium' | 'hard'}
5360
className='flex w-min grow-0'
5461
>
55-
{details.difficulty}
62+
{questionDetails.difficulty}
5663
</Badge>
5764
<Separator orientation='vertical' className='mx-2 h-4' />
5865
<span className='text-sm font-medium'>Topics:</span>
59-
{details.topics.map((v, i) => (
66+
{questionDetails.topic.map((v, i) => (
6067
<Badge
6168
variant='secondary'
6269
className='flex w-min grow-0 whitespace-nowrap'
@@ -88,7 +95,7 @@ export const QuestionDetails = () => {
8895
},
8996
}}
9097
>
91-
{details.description}
98+
{questionDetails.description}
9299
</Markdown>
93100
</CardContent>
94101
</ScrollArea>

frontend/src/services/question-service.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,31 @@
11
import { questionApiClient } from './api-clients';
2-
import { questionDetails, questions } from '@/assets/questions';
2+
import { questions } from '@/assets/questions';
33
import type { IGetQuestionsResponse } from '@/types/question-types';
44

55
const QUESTION_SERVICE_ROUTES = {
66
GET_QUESTIONS: '/questions',
77
GET_QUESTION_DETAILS: '/questions/<questionId>',
88
};
99

10-
type QuestionDetails = (typeof questionDetails)[number];
10+
// type QuestionDetails = (typeof questionDetails)[number];
11+
type IGetQuestionDetailsResponse = {
12+
question: {
13+
title: string;
14+
description: string;
15+
topic: Array<string>;
16+
difficulty: string;
17+
id?: string;
18+
};
19+
};
20+
21+
type IQuestionDetails = Required<IGetQuestionDetailsResponse>['question'];
1122

12-
export const getQuestionDetails = (questionId: number): Promise<QuestionDetails> => {
13-
return questionApiClient.get(
14-
QUESTION_SERVICE_ROUTES.GET_QUESTION_DETAILS.replace(/<questionId>/, String(questionId))
15-
);
23+
export const getQuestionDetails = (questionId: number): Promise<IGetQuestionDetailsResponse> => {
24+
return questionApiClient
25+
.get(QUESTION_SERVICE_ROUTES.GET_QUESTION_DETAILS.replace(/<questionId>/, String(questionId)))
26+
.then((v) => {
27+
return v.data as IGetQuestionDetailsResponse;
28+
});
1629
// // return questionApiClient.get
1730
// console.log(questionDetails.find(({ id }) => id === questionId));
1831
// return new Promise((resolve, _reject) => {

0 commit comments

Comments
 (0)