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
JavaScript
;
/**
* @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);