mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
24 lines
1.4 KiB
JavaScript
24 lines
1.4 KiB
JavaScript
const { DataTypes } = require("sequelize");
|
|
const sequelize = require("../../config/db.config");
|
|
|
|
const QuizAttempt = sequelize.define("QuizAttempt", {
|
|
attempt_id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true },
|
|
uuid: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, unique: true },
|
|
user_id: { type: DataTypes.BIGINT, allowNull: false },
|
|
// polymorphic: belongs to either unit_quiz OR course_assessment
|
|
quiz_id: { type: DataTypes.BIGINT, allowNull: true }, // → unit_quizzes
|
|
assessment_id: { type: DataTypes.BIGINT, allowNull: true }, // → course_assessments
|
|
course_id: { type: DataTypes.BIGINT, allowNull: true }, // denormalized — for fast per-course queries
|
|
answers: { type: DataTypes.JSONB, allowNull: false, defaultValue: {} },
|
|
attempt_number: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 1 }, // 1-based per user+quiz
|
|
total_points: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 },
|
|
earned_points: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 },
|
|
score: { type: DataTypes.INTEGER, allowNull: false, defaultValue: 0 }, // percentage 0-100
|
|
passing_score: { type: DataTypes.INTEGER, allowNull: true }, // snapshot at submit time
|
|
passed: { type: DataTypes.BOOLEAN, allowNull: false, defaultValue: false },
|
|
}, {
|
|
tableName: "quiz_attempts",
|
|
timestamps: true,
|
|
});
|
|
|
|
module.exports = QuizAttempt; |