add a lot of changes
This commit is contained in:
134
backend/models/QuizAnswer.js
Normal file
134
backend/models/QuizAnswer.js
Normal file
@@ -0,0 +1,134 @@
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
module.exports = (sequelize, DataTypes) => {
|
||||
const QuizAnswer = sequelize.define('QuizAnswer', {
|
||||
id: {
|
||||
type: DataTypes.CHAR(36),
|
||||
primaryKey: true,
|
||||
defaultValue: () => uuidv4(),
|
||||
allowNull: false,
|
||||
comment: 'UUID primary key'
|
||||
},
|
||||
quizSessionId: {
|
||||
type: DataTypes.CHAR(36),
|
||||
allowNull: false,
|
||||
field: 'quiz_session_id',
|
||||
validate: {
|
||||
notEmpty: {
|
||||
msg: 'Quiz session ID is required'
|
||||
},
|
||||
isUUID: {
|
||||
args: 4,
|
||||
msg: 'Quiz session ID must be a valid UUID'
|
||||
}
|
||||
},
|
||||
comment: 'Foreign key to quiz_sessions table'
|
||||
},
|
||||
questionId: {
|
||||
type: DataTypes.CHAR(36),
|
||||
allowNull: false,
|
||||
field: 'question_id',
|
||||
validate: {
|
||||
notEmpty: {
|
||||
msg: 'Question ID is required'
|
||||
},
|
||||
isUUID: {
|
||||
args: 4,
|
||||
msg: 'Question ID must be a valid UUID'
|
||||
}
|
||||
},
|
||||
comment: 'Foreign key to questions table'
|
||||
},
|
||||
selectedOption: {
|
||||
type: DataTypes.STRING(255),
|
||||
allowNull: false,
|
||||
field: 'selected_option',
|
||||
validate: {
|
||||
notEmpty: {
|
||||
msg: 'Selected option is required'
|
||||
}
|
||||
},
|
||||
comment: 'The option selected by the user'
|
||||
},
|
||||
isCorrect: {
|
||||
type: DataTypes.BOOLEAN,
|
||||
allowNull: false,
|
||||
field: 'is_correct',
|
||||
comment: 'Whether the selected answer was correct'
|
||||
},
|
||||
pointsEarned: {
|
||||
type: DataTypes.INTEGER.UNSIGNED,
|
||||
allowNull: false,
|
||||
defaultValue: 0,
|
||||
field: 'points_earned',
|
||||
validate: {
|
||||
min: {
|
||||
args: [0],
|
||||
msg: 'Points earned must be non-negative'
|
||||
}
|
||||
},
|
||||
comment: 'Points earned for this answer'
|
||||
},
|
||||
timeTaken: {
|
||||
type: DataTypes.INTEGER.UNSIGNED,
|
||||
allowNull: false,
|
||||
defaultValue: 0,
|
||||
field: 'time_taken',
|
||||
validate: {
|
||||
min: {
|
||||
args: [0],
|
||||
msg: 'Time taken must be non-negative'
|
||||
}
|
||||
},
|
||||
comment: 'Time taken to answer in seconds'
|
||||
},
|
||||
answeredAt: {
|
||||
type: DataTypes.DATE,
|
||||
allowNull: false,
|
||||
defaultValue: DataTypes.NOW,
|
||||
field: 'answered_at',
|
||||
comment: 'When the question was answered'
|
||||
}
|
||||
}, {
|
||||
tableName: 'quiz_answers',
|
||||
timestamps: true,
|
||||
underscored: true,
|
||||
indexes: [
|
||||
{
|
||||
fields: ['quiz_session_id'],
|
||||
name: 'idx_quiz_answers_session_id'
|
||||
},
|
||||
{
|
||||
fields: ['question_id'],
|
||||
name: 'idx_quiz_answers_question_id'
|
||||
},
|
||||
{
|
||||
fields: ['quiz_session_id', 'question_id'],
|
||||
unique: true,
|
||||
name: 'idx_quiz_answers_session_question_unique'
|
||||
},
|
||||
{
|
||||
fields: ['is_correct'],
|
||||
name: 'idx_quiz_answers_is_correct'
|
||||
},
|
||||
{
|
||||
fields: ['answered_at'],
|
||||
name: 'idx_quiz_answers_answered_at'
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
// Associations
|
||||
QuizAnswer.associate = (models) => {
|
||||
QuizAnswer.belongsTo(models.QuizSession, {
|
||||
foreignKey: 'quizSessionId',
|
||||
as: 'quizSession'
|
||||
});
|
||||
QuizAnswer.belongsTo(models.Question, {
|
||||
foreignKey: 'questionId',
|
||||
as: 'question'
|
||||
});
|
||||
};
|
||||
|
||||
return QuizAnswer;
|
||||
};
|
||||
58
backend/models/QuizSessionQuestion.js
Normal file
58
backend/models/QuizSessionQuestion.js
Normal file
@@ -0,0 +1,58 @@
|
||||
const { DataTypes } = require('sequelize');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
module.exports = (sequelize) => {
|
||||
const QuizSessionQuestion = sequelize.define('QuizSessionQuestion', {
|
||||
id: {
|
||||
type: DataTypes.CHAR(36),
|
||||
primaryKey: true,
|
||||
allowNull: false
|
||||
},
|
||||
quizSessionId: {
|
||||
type: DataTypes.CHAR(36),
|
||||
allowNull: false,
|
||||
field: 'quiz_session_id'
|
||||
},
|
||||
questionId: {
|
||||
type: DataTypes.CHAR(36),
|
||||
allowNull: false,
|
||||
field: 'question_id'
|
||||
},
|
||||
questionOrder: {
|
||||
type: DataTypes.INTEGER.UNSIGNED,
|
||||
allowNull: false,
|
||||
field: 'question_order',
|
||||
validate: {
|
||||
min: 1
|
||||
}
|
||||
}
|
||||
}, {
|
||||
tableName: 'quiz_session_questions',
|
||||
underscored: true,
|
||||
timestamps: true,
|
||||
createdAt: 'created_at',
|
||||
updatedAt: 'updated_at',
|
||||
hooks: {
|
||||
beforeValidate: (quizSessionQuestion) => {
|
||||
if (!quizSessionQuestion.id) {
|
||||
quizSessionQuestion.id = uuidv4();
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Define associations
|
||||
QuizSessionQuestion.associate = (models) => {
|
||||
QuizSessionQuestion.belongsTo(models.QuizSession, {
|
||||
foreignKey: 'quizSessionId',
|
||||
as: 'quizSession'
|
||||
});
|
||||
|
||||
QuizSessionQuestion.belongsTo(models.Question, {
|
||||
foreignKey: 'questionId',
|
||||
as: 'question'
|
||||
});
|
||||
};
|
||||
|
||||
return QuizSessionQuestion;
|
||||
};
|
||||
Reference in New Issue
Block a user