Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

クイズ採点機能の修正 #82

Merged
merged 7 commits into from
Oct 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
/*
Warnings:

- Added the required column `answer` to the `class_user_quizzes` table without a default value. This is not possible if the table is not empty.

*/
-- CreateEnum
CREATE TYPE "Answer" AS ENUM ('a', 'b', 'c', 'd');

-- AlterTable
ALTER TABLE "class_user_quizzes" ADD COLUMN "answer" "Answer" NOT NULL;
8 changes: 8 additions & 0 deletions prisma/schema.prisma
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,18 @@ model Quiz {
@@map("quizzes")
}

enum Answer {
a
b
c
d
}

model ClassUserQuiz {
result Boolean?
created_at DateTime @default(now())
updated_at DateTime @updatedAt
answer Answer

u_id BigInt @map("uid")
c_id BigInt @map("cid")
Expand Down
41 changes: 21 additions & 20 deletions src/modules/quiz/langchain/langchain.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { LangchainConfig } from '@common/configs/config.interface';
import { ConfigService } from '@nestjs/config';
import { ChatOpenAI } from '@langchain/openai';
import { QuizContent } from '../dto/create-update.dto';
import { Answer } from '@prisma/client';

@Injectable()
export class LangchainService {
Expand Down Expand Up @@ -60,52 +61,52 @@ export class LangchainService {
{{
question: '관계 데이터베이스 관리 시스템(RDBMS)과 NoSQL에 대한 설명으로 옳은 것은?',
answer: {{
a: 'RDBMS는 NoSQL보다 약한 스키마를 요구한다.',
b: 'NoSQL은 RDBMS보다 엄격한 일관성 모델을 보장한다.',
c: 'NoSQL은 RDBMS보다 정형 데이터를 저장하기에 적합하다.',
d: 'NoSQL 데이터 모델로 키-값(key-value), 문서 기반(document-based), 그래프 기반(graph-based) 모델이 있다.',
${Answer.a}: 'RDBMS는 NoSQL보다 약한 스키마를 요구한다.',
${Answer.b}: 'NoSQL은 RDBMS보다 엄격한 일관성 모델을 보장한다.',
${Answer.c}: 'NoSQL은 RDBMS보다 정형 데이터를 저장하기에 적합하다.',
${Answer.d}: 'NoSQL 데이터 모델로 키-값(key-value), 문서 기반(document-based), 그래프 기반(graph-based) 모델이 있다.',
}},
commentary: {{
correctAnswer: 'd',
correctAnswer: '${Answer.d}',
content: 'RDBMS는 NoSQL보다 구체적이고 엄격한 스키마를 요구하며, NoSQL보다 엄격하게 일관성을 보장한다. 또 RDBMS가 정형 데이터를 저장하기에 적합하다. D는 올바른 설명이다.',
}},
}},
{{
question: 'Python의 주요 특징 중 하나는 무엇인가요?',
answer: {{
a: 'Python은 정적 타이핑을 지원한다.',
b: 'Python은 객체 지향 언어이다.',
c: 'Python은 컴파일 언어이다.',
d: 'Python은 다중 스레딩을 지원하지 않는다.',
${Answer.a}: 'Python은 정적 타이핑을 지원한다.',
${Answer.b}: 'Python은 객체 지향 언어이다.',
${Answer.c}: 'Python은 컴파일 언어이다.',
${Answer.d}: 'Python은 다중 스레딩을 지원하지 않는다.',
}},
commentary: {{
correctAnswer: 'b',
correctAnswer: '${Answer.b}',
content: 'Python은 객체 지향 프로그래밍을 지원하는 동적 타이핑 언어입니다. B가 올바른 설명입니다.',
}},
}},
{{
question: '다음 중 프로그래밍 언어가 아닌 것은?',
answer: {{
a: 'Java',
b: 'Python',
c: 'HTML',
d: 'C++',
${Answer.a}: 'Java',
${Answer.b}: 'Python',
${Answer.c}: 'HTML',
${Answer.d}: 'C++',
}},
commentary: {{
correctAnswer: 'c',
correctAnswer: '${Answer.c}',
content: 'HTML은 마크업 언어로, 프로그래밍 언어가 아닙니다. C가 올바른 설명입니다.',
}}
}},
{{
question: 'CSS의 주요 목적은 무엇인가요?',
answer: {{
a: '웹 페이지의 기능을 정의한다.',
b: '웹 페이지의 스타일을 정의한다.',
c: '서버와 클라이언트 간의 통신을 담당한다.',
d: '데이터베이스를 관리한다.',
${Answer.a}: '웹 페이지의 기능을 정의한다.',
${Answer.b}: '웹 페이지의 스타일을 정의한다.',
${Answer.c}: '서버와 클라이언트 간의 통신을 담당한다.',
${Answer.d}: '데이터베이스를 관리한다.',
}},
commentary: {{
correctAnswer: 'b',
correctAnswer: '${Answer.b}',
content: 'CSS는 웹 페이지의 스타일을 정의하는 언어입니다. B가 올바른 설명입니다.',
}}
}},
Expand Down
13 changes: 11 additions & 2 deletions src/modules/set-quiz/dto/mark.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,17 @@ import {
import { ApiProperty } from '@nestjs/swagger';
import { Transform, Type } from 'class-transformer';
import { MAX_QUIZ_DATA_SIZE } from './create.dto';
import { Answer } from '@prisma/client';

@ValidatorConstraint({ async: true })
class IsQuizResultArrayConstraint {
async validate(value: any) {
if (!Array.isArray(value)) return false;
return value.every(
(v) =>
typeof v.q_id === 'bigint' &&
typeof v.result === 'boolean',
typeof v?.q_id === 'bigint' &&
typeof v?.result === 'boolean' &&
Object.values(Answer).includes(v?.answer),
);
}

Expand Down Expand Up @@ -65,6 +67,12 @@ export class QuizResult {
example: true,
})
result: boolean;

@IsNotEmpty()
@ApiProperty({
example: Answer.a,
})
answer: Answer;
}

export class MarkSetQuizDto {
Expand All @@ -86,6 +94,7 @@ export class MarkSetQuizDto {
{
q_id: 1,
result: true,
answer: Answer.a,
},
],
})
Expand Down
5 changes: 5 additions & 0 deletions src/modules/set-quiz/entity/quiz-result.entity.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { ApiProperty } from '@nestjs/swagger';
import { Answer } from '@prisma/client';

class QuizContent {
@ApiProperty({
Expand All @@ -18,6 +19,9 @@ class QuizResult {

@ApiProperty()
result: boolean;

@ApiProperty()
answer: Answer;
}

export class QuizResultEntity {
Expand All @@ -34,6 +38,7 @@ export class QuizResultEntity {
question: 'What is the capital of Japan?',
},
result: true,
answer: Answer.a,
},
],
})
Expand Down
1 change: 1 addition & 0 deletions src/modules/set-quiz/set-quiz.controller.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ describe('SetQuizController', () => {
{
q_id: BigInt(1),
result: true,
answer: 'a',
},
],
});
Expand Down
3 changes: 3 additions & 0 deletions src/modules/set-quiz/set-quiz.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ export class SetQuizRepository {
},
select: {
result: true,
answer: true,
class_user: {
select: {
u_id: true,
Expand All @@ -95,6 +96,7 @@ export class SetQuizRepository {
},
select: {
result: true,
answer: true,
class_user: {
select: {
u_id: true,
Expand Down Expand Up @@ -155,6 +157,7 @@ export class SetQuizRepository {
},
select: {
result: true,
answer: true,
q_id: true,
quizList: {
select: {
Expand Down
1 change: 1 addition & 0 deletions src/modules/set-quiz/set-quiz.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,7 @@ export class SetQuizService {
question,
},
result: r.result,
answer: r.answer,
};
});

Expand Down
Loading