UNPKG

mcp-quiz-server

Version:

🧠 AI-Powered Quiz Management via Model Context Protocol (MCP) - Create, manage, and take quizzes directly from VS Code, Claude, and other AI agents.

122 lines (121 loc) • 4.89 kB
"use strict"; /** * @moduleName: Result Entity Model * @version: 1.0.0 * @since: 2025-07-22 * @lastUpdated: 2025-07-22 * @projectSummary: TypeORM entity model for individual question results within a quiz attempt * @techStack: TypeORM, TypeScript, Decorators, JSON Support * @dependency: typeorm, reflect-metadata * @interModuleDependency: ./QuizResult, ./Question * @requirementsTraceability: * {@link Requirements.REQ_DATA_002} (Append-Only Results Storage) * @briefDescription: Individual question result entity tracking user answers, correctness, and timing data * @contributors: Jorge the Database Architect * @vulnerabilitiesAssessment: * - User answer stored securely as text * - Timing data for analytics * - Foreign key relationships enforced * - Answer validation methods included */ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var Result_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.Result = void 0; const typeorm_1 = require("typeorm"); const QuizResult_1 = require("./QuizResult"); const Question_1 = require("./Question"); let Result = Result_1 = class Result { // Helper methods calculatePoints() { var _a; return this.isCorrect ? ((_a = this.question) === null || _a === void 0 ? void 0 : _a.points) || 1 : 0; } toJSON() { var _a; return { id: this.id, quizResultId: this.quizResultId, questionId: this.questionId, userAnswer: this.userAnswer, isCorrect: this.isCorrect, timeSpent: this.timeSpent, pointsEarned: this.pointsEarned, answeredAt: this.answeredAt, question: (_a = this.question) === null || _a === void 0 ? void 0 : _a.toJSON(), metadata: this.metadata, }; } // Static factory method static create(data) { const result = new Result_1(); result.questionId = data.questionId; result.userAnswer = data.userAnswer; result.isCorrect = data.isCorrect; result.timeSpent = data.timeSpent; result.pointsEarned = data.pointsEarned || (data.isCorrect ? 1 : 0); return result; } }; exports.Result = Result; __decorate([ (0, typeorm_1.PrimaryGeneratedColumn)('uuid'), __metadata("design:type", String) ], Result.prototype, "id", void 0); __decorate([ (0, typeorm_1.Column)({ type: 'uuid' }), __metadata("design:type", String) ], Result.prototype, "quizResultId", void 0); __decorate([ (0, typeorm_1.Column)({ type: 'uuid' }), __metadata("design:type", String) ], Result.prototype, "questionId", void 0); __decorate([ (0, typeorm_1.Column)({ type: 'text' }), __metadata("design:type", String) ], Result.prototype, "userAnswer", void 0); __decorate([ (0, typeorm_1.Column)({ type: 'boolean' }), __metadata("design:type", Boolean) ], Result.prototype, "isCorrect", void 0); __decorate([ (0, typeorm_1.Column)({ type: 'integer', nullable: true }), __metadata("design:type", Number) ], Result.prototype, "timeSpent", void 0); __decorate([ (0, typeorm_1.Column)({ type: 'integer', default: 0 }), __metadata("design:type", Number) ], Result.prototype, "pointsEarned", void 0); __decorate([ (0, typeorm_1.Column)({ type: 'json', nullable: true }), __metadata("design:type", Object) ], Result.prototype, "metadata", void 0); __decorate([ (0, typeorm_1.CreateDateColumn)(), __metadata("design:type", Date) ], Result.prototype, "answeredAt", void 0); __decorate([ (0, typeorm_1.ManyToOne)(() => QuizResult_1.QuizResult, quizResult => quizResult.results, { onDelete: 'CASCADE', }), (0, typeorm_1.JoinColumn)({ name: 'quizResultId' }), __metadata("design:type", QuizResult_1.QuizResult) ], Result.prototype, "quizResult", void 0); __decorate([ (0, typeorm_1.ManyToOne)(() => Question_1.Question, { eager: true, }), (0, typeorm_1.JoinColumn)({ name: 'questionId' }), __metadata("design:type", Question_1.Question) ], Result.prototype, "question", void 0); exports.Result = Result = Result_1 = __decorate([ (0, typeorm_1.Entity)('results') ], Result);