Commit 0a10ca0f by Shaganaz

Corrected errors in admin and user models

parent d3c42eff
...@@ -4,8 +4,8 @@ meta { ...@@ -4,8 +4,8 @@ meta {
seq: 4 seq: 4
} }
post { get {
url: http://localhost:3000/api/admin/assign-quiz url: http://localhost:3000/api/admin/quizzes
body: json body: json
auth: bearer auth: bearer
} }
...@@ -15,12 +15,5 @@ headers { ...@@ -15,12 +15,5 @@ headers {
} }
auth:bearer { auth:bearer {
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsImVtYWlsIjoiYWRtaW5AZ21haWwuY29tIiwicm9sZSI6ImFkbWluIiwiaWF0IjoxNzQ4OTUzNDIxLCJleHAiOjE3NDg5NTcwMjF9.jc1Y0rh69qKpFe-fkYHnLYnukO7nAkCiTRjFUxYsiFE token:
}
body:json {
{
"user_id": 1,
"quiz_id": 3
}
} }
...@@ -16,9 +16,9 @@ headers { ...@@ -16,9 +16,9 @@ headers {
body:json { body:json {
{ {
"email": "admin@gmail.com", "email": "siva@gmail.com",
"password": "admin@123", "password": "siva",
"role": "admin" "role": ""
} }
......
...@@ -5,7 +5,7 @@ meta { ...@@ -5,7 +5,7 @@ meta {
} }
get { get {
url: /api/user/take-quiz/3/1 url: http://localhost:3000/api/user/take-quiz/2/1
body: json body: json
auth: bearer auth: bearer
} }
...@@ -15,5 +15,5 @@ headers { ...@@ -15,5 +15,5 @@ headers {
} }
auth:bearer { auth:bearer {
token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImVtYWlsIjoic2hhZ2FuYXpAZ21haWwuY29tIiwicm9sZSI6InVzZXIiLCJpYXQiOjE3NDg5NTQzMDAsImV4cCI6MTc0ODk1NzkwMH0.9GOhjHWK7ugeiWGTiElWFpdGYS0GdnB9mTkZSkNc7Ok token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsImVtYWlsIjoic2hhZ2FuYXpAZ21haWwuY29tIiwicm9sZSI6IiIsImlhdCI6MTc0OTAzMjcwMiwiZXhwIjoxNzQ5MDM2MzAyfQ.Ma9h9-CZbQRbZYtIk6Vxv01VCsU0ReevBWfKymzVhII
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/** @type {import('sequelize-cli').Migration} */ /** @type {import('sequelize-cli').Migration} */
module.exports = { module.exports = {
async up(queryInterface, Sequelize) { async up(queryInterface, Sequelize) {
await queryInterface.createTable('Users', { await queryInterface.createTable('users', {
id: { id: {
allowNull: false, allowNull: false,
autoIncrement: true, autoIncrement: true,
...@@ -29,6 +29,6 @@ module.exports = { ...@@ -29,6 +29,6 @@ module.exports = {
}); });
}, },
async down(queryInterface, Sequelize) { async down(queryInterface, Sequelize) {
await queryInterface.dropTable('Users'); await queryInterface.dropTable('users');
} }
}; };
\ No newline at end of file
...@@ -4,11 +4,6 @@ const { ...@@ -4,11 +4,6 @@ const {
} = require('sequelize'); } = require('sequelize');
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
class option extends Model { class option extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) { static associate(models) {
option.belongsTo(models.question,{ option.belongsTo(models.question,{
foreignKey:'question_id', foreignKey:'question_id',
......
...@@ -5,16 +5,14 @@ const { ...@@ -5,16 +5,14 @@ const {
} = require('sequelize'); } = require('sequelize');
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
class question extends Model { class question extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) { static associate(models) {
question.belongsTo(models.quiz,{ question.belongsTo(models.quiz,{
foreignKey:'quiz_id', foreignKey:'quiz_id',
onDelete:'cascade' onDelete:'cascade'
}) })
question.hasMany(models.option, { foreignKey: 'question_id' , as:'options'});
question.hasOne(models.option, { foreignKey: 'question_id' , as:'correctOption',scope:{is_correct:true}});
} }
} }
question.init({ question.init({
......
...@@ -5,6 +5,7 @@ const { ...@@ -5,6 +5,7 @@ const {
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
class quiz extends Model { class quiz extends Model {
static associate(models) { static associate(models) {
quiz.hasMany(models.question, { foreignKey: 'quiz_id', as:'questions'});
} }
} }
quiz.init({ quiz.init({
......
...@@ -4,11 +4,6 @@ const { ...@@ -4,11 +4,6 @@ const {
} = require('sequelize'); } = require('sequelize');
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
class result extends Model { class result extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) { static associate(models) {
result.belongsTo(models.user,{ result.belongsTo(models.user,{
foreignKey:'user_id', foreignKey:'user_id',
......
...@@ -4,13 +4,7 @@ const { ...@@ -4,13 +4,7 @@ const {
} = require('sequelize'); } = require('sequelize');
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
class user extends Model { class user extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) { static associate(models) {
// define association here
} }
} }
user.init({ user.init({
...@@ -20,7 +14,7 @@ module.exports = (sequelize, DataTypes) => { ...@@ -20,7 +14,7 @@ module.exports = (sequelize, DataTypes) => {
}, { }, {
sequelize, sequelize,
modelName: 'user', modelName: 'user',
tableName:'Users' tableName:'users'
}); });
return user; return user;
}; };
\ No newline at end of file
...@@ -4,11 +4,6 @@ const { ...@@ -4,11 +4,6 @@ const {
} = require('sequelize'); } = require('sequelize');
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
class user_answers extends Model { class user_answers extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) { static associate(models) {
user_answers.belongsTo(models.user,{ user_answers.belongsTo(models.user,{
foreignKey:'user_id', foreignKey:'user_id',
......
...@@ -4,11 +4,6 @@ const { ...@@ -4,11 +4,6 @@ const {
} = require('sequelize'); } = require('sequelize');
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
class user_quizzes extends Model { class user_quizzes extends Model {
/**
* Helper method for defining associations.
* This method is not a part of Sequelize lifecycle.
* The `models/index` file will call this method automatically.
*/
static associate(models) { static associate(models) {
user_quizzes.belongsTo(models.user,{ user_quizzes.belongsTo(models.user,{
foreignKey:'user_id', foreignKey:'user_id',
......
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.bulkInsert('quizzes', [
{
id:1,
title: 'Math Quiz',
description: 'Basic math questions',
createdAt: new Date(),
updatedAt: new Date()
},
{
id:2,
title: 'Science Quiz',
description: 'General science',
createdAt: new Date(),
updatedAt: new Date()
}
]);
const mathsQuizId=1
await queryInterface.bulkInsert('questions', [
{
quiz_id: mathsQuizId,
question_text: 'What is 2 + 2?',
createdAt: new Date(),
updatedAt: new Date()
},
{
quiz_id: mathsQuizId,
question_text: 'What is 10 - 4?',
createdAt: new Date(),
updatedAt: new Date()
}
]);
await queryInterface.bulkInsert('options', [
{
question_id: 1,
option_text: '3',
is_correct: false,
createdAt: new Date(),
updatedAt: new Date()
},
{
question_id: 1,
option_text: '4',
is_correct: true,
createdAt: new Date(),
updatedAt: new Date()
},
{
question_id: 1,
option_text: '5',
is_correct: false,
createdAt: new Date(),
updatedAt: new Date()
},
{
question_id: 2,
option_text: '5',
is_correct: false,
createdAt: new Date(),
updatedAt: new Date()
},
{
question_id: 2,
option_text: '6',
is_correct: true,
createdAt: new Date(),
updatedAt: new Date()
},
{
question_id: 2,
option_text: '7',
is_correct: false,
createdAt: new Date(),
updatedAt: new Date()
}
]);
},
async down (queryInterface, Sequelize) {
await queryInterface.bulkDelete('quizzes', null, {});
await queryInterface.bulkDelete('questions', null, {});
await queryInterface.bulkDelete('options', null, {});
}
};
...@@ -11,6 +11,20 @@ exports.createQuiz=async(req,res)=>{ ...@@ -11,6 +11,20 @@ exports.createQuiz=async(req,res)=>{
} }
}; };
exports.getAllQuizzes = async (req, res) => {
try {
const quizzes = await db.quiz.findAll({
attributes: ['id', 'title', 'description'],
order: [['id', 'ASC']]
});
return res.json(quizzes);
} catch (err) {
console.log(err);
return res.json({ message: 'Error fetching quizzes', error: err.message });
}
};
exports.createQuestion = async (req, res) => { exports.createQuestion = async (req, res) => {
const { quiz_id, question_text,options,correct_answer } = req.body; const { quiz_id, question_text,options,correct_answer } = req.body;
try { try {
...@@ -33,6 +47,7 @@ exports.assignQuiz = async (req, res) => { ...@@ -33,6 +47,7 @@ exports.assignQuiz = async (req, res) => {
await db.user_quizzes.create({user_id, quiz_id, status:'pending'}); await db.user_quizzes.create({user_id, quiz_id, status:'pending'});
return res.json({ message: 'Quiz assigned to user successfully' }); return res.json({ message: 'Quiz assigned to user successfully' });
} catch (err) { } catch (err) {
console.log();
return res.json({ message: 'Unable to assign quiz', error: err.message }); return res.json({ message: 'Unable to assign quiz', error: err.message });
} }
}; };
...@@ -41,7 +56,7 @@ exports.getUserResult = async (req, res) => { ...@@ -41,7 +56,7 @@ exports.getUserResult = async (req, res) => {
const { user_id, quiz_id } = req.params; const { user_id, quiz_id } = req.params;
try { try {
const answers = await db.user_answer.findAll({ const answers = await db.user_answers.findAll({
where: { user_id, quiz_id }, where: { user_id, quiz_id },
include: [ include: [
{ {
......
...@@ -2,7 +2,8 @@ const jwt = require('jsonwebtoken'); ...@@ -2,7 +2,8 @@ const jwt = require('jsonwebtoken');
const db = require('../../models'); const db = require('../../models');
exports.register = async (req, res) => { exports.register = async (req, res) => {
const { email, password, role = 'user' } = req.body; const { email, password } = req.body;
const role = req.body.role && req.body.role.trim() !== '' ? req.body.role : 'user';
try { try {
const existing = await db.user.findOne({ where: { email } }); const existing = await db.user.findOne({ where: { email } });
...@@ -10,9 +11,9 @@ exports.register = async (req, res) => { ...@@ -10,9 +11,9 @@ exports.register = async (req, res) => {
return res.json({ message: 'User already registered' }); return res.json({ message: 'User already registered' });
} }
await db.user.create({ email, password, role }); await db.user.create({ email, password, role });
res.json({ message: 'User registered successfully' }); return res.json({ message: 'User registered successfully' });
} catch (err) { } catch (err) {
res.json({ message: 'Registration failed', error: err.message }); return res.json({ message: 'Registration failed', error: err.message });
} }
}; };
...@@ -32,12 +33,12 @@ exports.login = async (req, res) => { ...@@ -32,12 +33,12 @@ exports.login = async (req, res) => {
{ expiresIn: process.env.JWT_EXPIRES_IN } { expiresIn: process.env.JWT_EXPIRES_IN }
); );
res.json({ return res.json({
message: 'Login successful', message: 'Login successful',
token, token,
role: user.role role: user.role
}); });
} catch (err) { } catch (err) {
res.status(500).json({ message: 'Login failed', error: err.message }); return res.status(500).json({ message: 'Login failed', error: err.message });
} }
}; };
const db = require('../../models'); const db = require('../../models');
exports.takeQuiz=async(req,res)=>{ exports.takeQuiz=async(req,res)=>{
console.log(req.params);
const {quiz_id,user_id}=req.params; const {quiz_id,user_id}=req.params;
try{ try{
const assigned =await db.user_quizzes.findOne({where:{user_id,quiz_id,status:'pending'}}); const assigned =await db.user_quizzes.findOne({where:{user_id,quiz_id,status:'pending'}});
...@@ -9,25 +10,30 @@ exports.takeQuiz=async(req,res)=>{ ...@@ -9,25 +10,30 @@ exports.takeQuiz=async(req,res)=>{
} }
const quiz=await db.quiz.findByPk(quiz_id,{ const quiz=await db.quiz.findByPk(quiz_id,{
attributes:['id','title','description'], attributes:['id','title','description'],
include:{ include:[{
model:db.question, model:db.question,
as:'questions',
attributes:['id','question_text'], attributes:['id','question_text'],
include:{ include:[{
model:db.option, model:db.option,
as:"options",
attributes:['id','option_text'] attributes:['id','option_text']
} }]
}, }],
order:[ order:[
[db.question,'id','ASC'], ['questions','id','ASC'],
[db.question,db.option,'id','ASC'] ['questions','options','id','ASC']
] ]
}); });
console.log('quizzz');
console.log(quiz);
if(!quiz){ if(!quiz){
return res.json({message:'Quiz not found'}); return res.json({message:'Quiz not found'});
} }
return res.json({quiz}); return res.json({quiz});
} }
catch(err){ catch(err){
console.log(err);
return res.json({message:"Error fetching quiz",error:err.message}); return res.json({message:"Error fetching quiz",error:err.message});
} }
}; };
...@@ -35,19 +41,26 @@ exports.takeQuiz=async(req,res)=>{ ...@@ -35,19 +41,26 @@ exports.takeQuiz=async(req,res)=>{
exports.submitQuiz = async (req, res) => { exports.submitQuiz = async (req, res) => {
const { user_id, quiz_id, answers } = req.body; const { user_id, quiz_id, answers } = req.body;
try { try {
const alreadySubmitted = await db.user_quizzes.findOne({
where: { user_id, quiz_id, status: 'completed' }
});
if (alreadySubmitted) {
return res.json({ message: 'Quiz already submitted' });
}
let score = 0; let score = 0;
const total = answers.length; const total = answers.length;
for (const ans of answers) { for (const ans of answers) {
const correct= await db.option.findOne({where:{id:ans.selected_option_id}}); const correct= await db.option.findOne({where:{id:ans.selected_option_id}});
const isCorrect = correct[0]?.is_correct === 1 ? 1 : 0; const isCorrect = correct.is_correct ?? 0
if (isCorrect) score++; if (isCorrect) score++;
await db.user_answer.create({user_id, quiz_id, question_id:ans.question_id, answer:ans.selected_option_id, is_correct:isCorrect}); await db.user_answers.create({user_id, quiz_id, question_id:ans.question_id, answer:ans.selected_option_id, is_correct:isCorrect});
} }
await db.results.create({user_id, quiz_id, score, total}); await db.result.create({user_id, quiz_id, score, total});
await db.user_quizzes.update({status:'completed'},{where:{user_id,quiz_id}}); await db.user_quizzes.update({status:'completed'},{where:{user_id,quiz_id}});
return res.json({ message: 'Quiz submitted', score, total }); return res.json({ message: 'Quiz submitted', score, total });
} catch (err) { } catch (err) {
return res.status(500).json({ message: 'Error submitting quiz', error: err.message }); return res.json({ message: 'Error submitting quiz', error: err.message });
} }
}; };
......
...@@ -4,6 +4,7 @@ const authenticateAdmin=require('../middleware/authmiddleware'); ...@@ -4,6 +4,7 @@ const authenticateAdmin=require('../middleware/authmiddleware');
const adminctrl=require('../controller/adminController.js'); const adminctrl=require('../controller/adminController.js');
router.post('/create-quiz',authenticateAdmin,adminctrl.createQuiz); router.post('/create-quiz',authenticateAdmin,adminctrl.createQuiz);
router.get('/quizzes', authenticateAdmin, adminctrl.getAllQuizzes);
router.post('/create-question',authenticateAdmin,adminctrl.createQuestion); router.post('/create-question',authenticateAdmin,adminctrl.createQuestion);
router.post('/assign-quiz', authenticateAdmin, adminctrl.assignQuiz); router.post('/assign-quiz', authenticateAdmin, adminctrl.assignQuiz);
router.get('/user-result/:user_id/:quiz_id', authenticateAdmin, adminctrl.getUserResult); router.get('/user-result/:user_id/:quiz_id', authenticateAdmin, adminctrl.getUserResult);
......
...@@ -4,10 +4,10 @@ const authenticateAdmin=require('../middleware/authmiddleware'); ...@@ -4,10 +4,10 @@ const authenticateAdmin=require('../middleware/authmiddleware');
const authenticateUser = require('../middleware/usermiddleware'); const authenticateUser = require('../middleware/usermiddleware');
router.get('/admin',authenticateAdmin,(req,res)=>{ router.get('/admin',authenticateAdmin,(req,res)=>{
res.json({message:'Welcome to Admin Dashboard'}); return res.json({message:'Welcome to Admin Dashboard'});
}); });
router.get('/user',authenticateUser,(req,res)=>{ router.get('/user',authenticateUser,(req,res)=>{
res.json({message:'Welcome to User Dashboard'}); return res.json({message:'Welcome to User Dashboard'});
}) })
module.exports=router; module.exports=router;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment