add changes
This commit is contained in:
123
backend/seeders/20251110192809-demo-categories.js
Normal file
123
backend/seeders/20251110192809-demo-categories.js
Normal file
@@ -0,0 +1,123 @@
|
||||
'use strict';
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
/** @type {import('sequelize-cli').Migration} */
|
||||
module.exports = {
|
||||
async up(queryInterface, Sequelize) {
|
||||
const categories = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'JavaScript',
|
||||
slug: 'javascript',
|
||||
description: 'Core JavaScript concepts, ES6+, async programming, and modern features',
|
||||
icon: '🟨',
|
||||
color: '#F7DF1E',
|
||||
is_active: true,
|
||||
guest_accessible: true,
|
||||
question_count: 0,
|
||||
quiz_count: 0,
|
||||
display_order: 1,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Angular',
|
||||
slug: 'angular',
|
||||
description: 'Angular framework, components, services, RxJS, and state management',
|
||||
icon: '🅰️',
|
||||
color: '#DD0031',
|
||||
is_active: true,
|
||||
guest_accessible: true,
|
||||
question_count: 0,
|
||||
quiz_count: 0,
|
||||
display_order: 2,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'React',
|
||||
slug: 'react',
|
||||
description: 'React library, hooks, component lifecycle, state management, and best practices',
|
||||
icon: '⚛️',
|
||||
color: '#61DAFB',
|
||||
is_active: true,
|
||||
guest_accessible: true,
|
||||
question_count: 0,
|
||||
quiz_count: 0,
|
||||
display_order: 3,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Node.js',
|
||||
slug: 'nodejs',
|
||||
description: 'Node.js runtime, Express, APIs, middleware, and server-side JavaScript',
|
||||
icon: '🟢',
|
||||
color: '#339933',
|
||||
is_active: true,
|
||||
guest_accessible: false,
|
||||
question_count: 0,
|
||||
quiz_count: 0,
|
||||
display_order: 4,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'TypeScript',
|
||||
slug: 'typescript',
|
||||
description: 'TypeScript types, interfaces, generics, decorators, and type safety',
|
||||
icon: '📘',
|
||||
color: '#3178C6',
|
||||
is_active: true,
|
||||
guest_accessible: false,
|
||||
question_count: 0,
|
||||
quiz_count: 0,
|
||||
display_order: 5,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'SQL & Databases',
|
||||
slug: 'sql-databases',
|
||||
description: 'SQL queries, database design, indexing, transactions, and optimization',
|
||||
icon: '🗄️',
|
||||
color: '#4479A1',
|
||||
is_active: true,
|
||||
guest_accessible: false,
|
||||
question_count: 0,
|
||||
quiz_count: 0,
|
||||
display_order: 6,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'System Design',
|
||||
slug: 'system-design',
|
||||
description: 'Scalability, architecture patterns, microservices, and design principles',
|
||||
icon: '🏗️',
|
||||
color: '#FF6B6B',
|
||||
is_active: true,
|
||||
guest_accessible: false,
|
||||
question_count: 0,
|
||||
quiz_count: 0,
|
||||
display_order: 7,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
await queryInterface.bulkInsert('categories', categories, {});
|
||||
console.log('✅ Seeded 7 demo categories');
|
||||
},
|
||||
|
||||
async down(queryInterface, Sequelize) {
|
||||
await queryInterface.bulkDelete('categories', null, {});
|
||||
console.log('✅ Removed demo categories');
|
||||
}
|
||||
};
|
||||
38
backend/seeders/20251110193050-admin-user.js
Normal file
38
backend/seeders/20251110193050-admin-user.js
Normal file
@@ -0,0 +1,38 @@
|
||||
'use strict';
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const bcrypt = require('bcrypt');
|
||||
|
||||
/** @type {import('sequelize-cli').Migration} */
|
||||
module.exports = {
|
||||
async up(queryInterface, Sequelize) {
|
||||
const hashedPassword = await bcrypt.hash('Admin@123', 10);
|
||||
|
||||
const adminUser = {
|
||||
id: uuidv4(),
|
||||
username: 'admin',
|
||||
email: 'admin@quiz.com',
|
||||
password: hashedPassword,
|
||||
role: 'admin',
|
||||
profile_image: null,
|
||||
is_active: true,
|
||||
total_quizzes: 0,
|
||||
quizzes_passed: 0,
|
||||
total_questions_answered: 0,
|
||||
correct_answers: 0,
|
||||
current_streak: 0,
|
||||
longest_streak: 0,
|
||||
last_login: null,
|
||||
last_quiz_date: null,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
};
|
||||
|
||||
await queryInterface.bulkInsert('users', [adminUser], {});
|
||||
console.log('✅ Seeded admin user (email: admin@quiz.com, password: Admin@123)');
|
||||
},
|
||||
|
||||
async down(queryInterface, Sequelize) {
|
||||
await queryInterface.bulkDelete('users', { email: 'admin@quiz.com' }, {});
|
||||
console.log('✅ Removed admin user');
|
||||
}
|
||||
};
|
||||
947
backend/seeders/20251110193134-demo-questions.js
Normal file
947
backend/seeders/20251110193134-demo-questions.js
Normal file
@@ -0,0 +1,947 @@
|
||||
'use strict';
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
/** @type {import('sequelize-cli').Migration} */
|
||||
module.exports = {
|
||||
async up(queryInterface, Sequelize) {
|
||||
// First, get the category IDs we need
|
||||
const [categories] = await queryInterface.sequelize.query(
|
||||
`SELECT id, slug FROM categories WHERE slug IN ('javascript', 'angular', 'react', 'nodejs', 'typescript', 'sql-databases', 'system-design')`
|
||||
);
|
||||
|
||||
const categoryMap = {};
|
||||
categories.forEach(cat => {
|
||||
categoryMap[cat.slug] = cat.id;
|
||||
});
|
||||
|
||||
// Get admin user ID for created_by
|
||||
const [users] = await queryInterface.sequelize.query(
|
||||
`SELECT id FROM users WHERE email = 'admin@quiz.com' LIMIT 1`
|
||||
);
|
||||
const adminId = users[0]?.id || null;
|
||||
|
||||
const questions = [];
|
||||
|
||||
// JavaScript Questions (15 questions)
|
||||
const jsQuestions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['javascript'],
|
||||
question_text: 'What is the difference between let and var in JavaScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'let has block scope, var has function scope' },
|
||||
{ id: 'b', text: 'var has block scope, let has function scope' },
|
||||
{ id: 'c', text: 'They are exactly the same' },
|
||||
{ id: 'd', text: 'let cannot be reassigned' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'let has block scope (only accessible within {}), while var has function scope (accessible anywhere in the function).',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['scope', 'let', 'var', 'es6']),
|
||||
tags: JSON.stringify(['variables', 'scope', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['javascript'],
|
||||
question_text: 'What is a closure in JavaScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A function that returns another function' },
|
||||
{ id: 'b', text: 'A function that has access to variables from its outer scope' },
|
||||
{ id: 'c', text: 'A function that closes the browser' },
|
||||
{ id: 'd', text: 'A method to close database connections' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['b']),
|
||||
explanation: 'A closure is a function that remembers and can access variables from its outer (enclosing) scope, even after the outer function has finished executing.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['closure', 'scope', 'lexical']),
|
||||
tags: JSON.stringify(['functions', 'scope', 'advanced']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['javascript'],
|
||||
question_text: 'What does the spread operator (...) do in JavaScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Creates a copy of an array or object' },
|
||||
{ id: 'b', text: 'Expands an iterable into individual elements' },
|
||||
{ id: 'c', text: 'Both A and B' },
|
||||
{ id: 'd', text: 'Performs mathematical operations' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['c']),
|
||||
explanation: 'The spread operator (...) can expand iterables into individual elements and is commonly used to copy arrays/objects or pass elements as function arguments.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['spread', 'operator', 'es6', 'array']),
|
||||
tags: JSON.stringify(['operators', 'es6', 'arrays']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['javascript'],
|
||||
question_text: 'What is the purpose of Promise.all()?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Waits for all promises to resolve or any to reject' },
|
||||
{ id: 'b', text: 'Runs promises sequentially' },
|
||||
{ id: 'c', text: 'Cancels all promises' },
|
||||
{ id: 'd', text: 'Returns the first resolved promise' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Promise.all() takes an array of promises and returns a single promise that resolves when all promises resolve, or rejects when any promise rejects.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['promise', 'async', 'concurrent']),
|
||||
tags: JSON.stringify(['promises', 'async', 'concurrency']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['javascript'],
|
||||
question_text: 'What is event delegation in JavaScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Attaching event listeners to parent elements to handle events on children' },
|
||||
{ id: 'b', text: 'Creating custom events' },
|
||||
{ id: 'c', text: 'Removing event listeners' },
|
||||
{ id: 'd', text: 'Preventing event propagation' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Event delegation uses event bubbling to handle events on child elements by attaching a single listener to a parent element, improving performance.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['event', 'delegation', 'bubbling', 'dom']),
|
||||
tags: JSON.stringify(['events', 'dom', 'patterns']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
// Angular Questions (12 questions)
|
||||
const angularQuestions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['angular'],
|
||||
question_text: 'What is the purpose of NgModule in Angular?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'To organize application structure and define compilation context' },
|
||||
{ id: 'b', text: 'To create components' },
|
||||
{ id: 'c', text: 'To handle routing' },
|
||||
{ id: 'd', text: 'To manage state' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'NgModule is a decorator that defines a module - a cohesive block of code with related components, directives, pipes, and services. It organizes the application.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['ngmodule', 'module', 'decorator']),
|
||||
tags: JSON.stringify(['modules', 'architecture', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['angular'],
|
||||
question_text: 'What is dependency injection in Angular?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A design pattern where dependencies are provided to a class instead of creating them internally' },
|
||||
{ id: 'b', text: 'A way to import modules' },
|
||||
{ id: 'c', text: 'A routing technique' },
|
||||
{ id: 'd', text: 'A method to create components' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Dependency Injection (DI) is a design pattern where Angular provides dependencies (services) to components/services through their constructors, promoting loose coupling.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['di', 'dependency injection', 'service', 'provider']),
|
||||
tags: JSON.stringify(['di', 'services', 'architecture']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['angular'],
|
||||
question_text: 'What is the difference between @Input() and @Output() decorators?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: '@Input() receives data from parent, @Output() emits events to parent' },
|
||||
{ id: 'b', text: '@Input() emits events, @Output() receives data' },
|
||||
{ id: 'c', text: 'They are the same' },
|
||||
{ id: 'd', text: '@Input() is for services, @Output() is for components' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: '@Input() allows a child component to receive data from its parent, while @Output() with EventEmitter allows a child to emit events to its parent.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['input', 'output', 'decorator', 'communication']),
|
||||
tags: JSON.stringify(['decorators', 'component-communication', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['angular'],
|
||||
question_text: 'What is RxJS used for in Angular?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Reactive programming with Observables for async operations' },
|
||||
{ id: 'b', text: 'Styling components' },
|
||||
{ id: 'c', text: 'Creating animations' },
|
||||
{ id: 'd', text: 'Testing components' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'RxJS provides reactive programming capabilities using Observables, which are used extensively in Angular for handling async operations like HTTP requests and events.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['rxjs', 'observable', 'reactive', 'async']),
|
||||
tags: JSON.stringify(['rxjs', 'async', 'observables']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['angular'],
|
||||
question_text: 'What is the purpose of Angular lifecycle hooks?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'To tap into key moments in component/directive lifecycle' },
|
||||
{ id: 'b', text: 'To create routes' },
|
||||
{ id: 'c', text: 'To style components' },
|
||||
{ id: 'd', text: 'To handle errors' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Lifecycle hooks like ngOnInit, ngOnChanges, and ngOnDestroy allow you to execute code at specific points in a component or directive\'s lifecycle.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['lifecycle', 'hooks', 'ngoninit']),
|
||||
tags: JSON.stringify(['lifecycle', 'hooks', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
// React Questions (12 questions)
|
||||
const reactQuestions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['react'],
|
||||
question_text: 'What is the virtual DOM in React?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A lightweight copy of the real DOM kept in memory' },
|
||||
{ id: 'b', text: 'A database for storing component state' },
|
||||
{ id: 'c', text: 'A routing mechanism' },
|
||||
{ id: 'd', text: 'A testing library' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'The virtual DOM is a lightweight JavaScript representation of the real DOM. React uses it to optimize updates by comparing changes and updating only what\'s necessary.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['virtual dom', 'reconciliation', 'performance']),
|
||||
tags: JSON.stringify(['fundamentals', 'performance', 'dom']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['react'],
|
||||
question_text: 'What is the purpose of useEffect hook?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'To perform side effects in function components' },
|
||||
{ id: 'b', text: 'To create state variables' },
|
||||
{ id: 'c', text: 'To handle routing' },
|
||||
{ id: 'd', text: 'To optimize performance' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'useEffect allows you to perform side effects (data fetching, subscriptions, DOM manipulation) in function components. It runs after render.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['useeffect', 'hook', 'side effects']),
|
||||
tags: JSON.stringify(['hooks', 'side-effects', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['react'],
|
||||
question_text: 'What is prop drilling in React?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Passing props through multiple component layers' },
|
||||
{ id: 'b', text: 'Creating new props' },
|
||||
{ id: 'c', text: 'Validating prop types' },
|
||||
{ id: 'd', text: 'Drilling holes in components' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Prop drilling is when you pass props through multiple intermediate components that don\'t need them, just to get them to a deeply nested component.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['props', 'drilling', 'context']),
|
||||
tags: JSON.stringify(['props', 'patterns', 'architecture']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['react'],
|
||||
question_text: 'What is the difference between useMemo and useCallback?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'useMemo memoizes values, useCallback memoizes functions' },
|
||||
{ id: 'b', text: 'useMemo is for functions, useCallback is for values' },
|
||||
{ id: 'c', text: 'They are exactly the same' },
|
||||
{ id: 'd', text: 'useMemo is deprecated' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'useMemo returns and memoizes a computed value, while useCallback returns and memoizes a function. Both are used for performance optimization.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['usememo', 'usecallback', 'memoization', 'performance']),
|
||||
tags: JSON.stringify(['hooks', 'performance', 'optimization']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['react'],
|
||||
question_text: 'What is React Context API used for?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Sharing data across components without prop drilling' },
|
||||
{ id: 'b', text: 'Creating routes' },
|
||||
{ id: 'c', text: 'Managing component lifecycle' },
|
||||
{ id: 'd', text: 'Optimizing performance' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Context API provides a way to share values between components without explicitly passing props through every level of the tree.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['context', 'api', 'state management']),
|
||||
tags: JSON.stringify(['context', 'state-management', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
// Node.js Questions (10 questions)
|
||||
const nodejsQuestions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['nodejs'],
|
||||
question_text: 'What is the event loop in Node.js?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A mechanism that handles async operations by queuing callbacks' },
|
||||
{ id: 'b', text: 'A for loop that runs forever' },
|
||||
{ id: 'c', text: 'A routing system' },
|
||||
{ id: 'd', text: 'A testing framework' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'The event loop is Node.js\'s mechanism for handling async operations. It continuously checks for and executes callbacks from different phases.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['event loop', 'async', 'callbacks']),
|
||||
tags: JSON.stringify(['event-loop', 'async', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['nodejs'],
|
||||
question_text: 'What is middleware in Express.js?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Functions that have access to request, response, and next in the pipeline' },
|
||||
{ id: 'b', text: 'Database connection code' },
|
||||
{ id: 'c', text: 'Front-end components' },
|
||||
{ id: 'd', text: 'Testing utilities' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Middleware functions have access to request and response objects and the next() function. They can execute code, modify req/res, and control the flow.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['middleware', 'express', 'request', 'response']),
|
||||
tags: JSON.stringify(['express', 'middleware', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['nodejs'],
|
||||
question_text: 'What is the purpose of package.json in Node.js?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Metadata file containing project info, dependencies, and scripts' },
|
||||
{ id: 'b', text: 'Configuration for the database' },
|
||||
{ id: 'c', text: 'Main application entry point' },
|
||||
{ id: 'd', text: 'Testing configuration' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'package.json is the manifest file for Node.js projects. It contains metadata, dependencies, scripts, and configuration.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['package.json', 'npm', 'dependencies']),
|
||||
tags: JSON.stringify(['npm', 'configuration', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['nodejs'],
|
||||
question_text: 'What is the difference between process.nextTick() and setImmediate()?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'nextTick() executes before the event loop continues, setImmediate() after I/O' },
|
||||
{ id: 'b', text: 'They are exactly the same' },
|
||||
{ id: 'c', text: 'setImmediate() is synchronous' },
|
||||
{ id: 'd', text: 'nextTick() is deprecated' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'process.nextTick() callbacks execute immediately after the current operation, before the event loop continues. setImmediate() executes in the check phase.',
|
||||
difficulty: 'hard',
|
||||
points: 15,
|
||||
time_limit: 120,
|
||||
keywords: JSON.stringify(['nexttick', 'setimmediate', 'event loop']),
|
||||
tags: JSON.stringify(['event-loop', 'async', 'advanced']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['nodejs'],
|
||||
question_text: 'What is clustering in Node.js?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Running multiple Node.js processes to utilize all CPU cores' },
|
||||
{ id: 'b', text: 'Grouping related code together' },
|
||||
{ id: 'c', text: 'Database optimization technique' },
|
||||
{ id: 'd', text: 'A design pattern' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Clustering allows you to create child processes (workers) that share server ports, enabling Node.js to utilize all available CPU cores.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['cluster', 'scaling', 'performance']),
|
||||
tags: JSON.stringify(['clustering', 'scaling', 'performance']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
// TypeScript Questions (10 questions)
|
||||
const tsQuestions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['typescript'],
|
||||
question_text: 'What is the difference between interface and type in TypeScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Interfaces can be extended/merged, types are more flexible with unions' },
|
||||
{ id: 'b', text: 'They are exactly the same' },
|
||||
{ id: 'c', text: 'Types are deprecated' },
|
||||
{ id: 'd', text: 'Interfaces only work with objects' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Interfaces can be extended and declared multiple times (declaration merging). Types are more flexible with unions, intersections, and primitives.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['interface', 'type', 'alias']),
|
||||
tags: JSON.stringify(['types', 'interfaces', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['typescript'],
|
||||
question_text: 'What is a generic in TypeScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A way to create reusable components that work with multiple types' },
|
||||
{ id: 'b', text: 'A basic data type' },
|
||||
{ id: 'c', text: 'A class decorator' },
|
||||
{ id: 'd', text: 'A testing utility' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Generics allow you to create components that work with any type while maintaining type safety. They\'re like variables for types.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['generic', 'type parameter', 'reusable']),
|
||||
tags: JSON.stringify(['generics', 'types', 'advanced']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['typescript'],
|
||||
question_text: 'What is the "never" type in TypeScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A type representing values that never occur' },
|
||||
{ id: 'b', text: 'A deprecated type' },
|
||||
{ id: 'c', text: 'Same as void' },
|
||||
{ id: 'd', text: 'A null type' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'The never type represents values that never occur - functions that always throw errors or infinite loops. It\'s the bottom type.',
|
||||
difficulty: 'hard',
|
||||
points: 15,
|
||||
time_limit: 120,
|
||||
keywords: JSON.stringify(['never', 'bottom type', 'type system']),
|
||||
tags: JSON.stringify(['types', 'advanced', 'type-system']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['typescript'],
|
||||
question_text: 'What is type narrowing in TypeScript?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Refining types through conditional checks to more specific types' },
|
||||
{ id: 'b', text: 'Making type names shorter' },
|
||||
{ id: 'c', text: 'Removing types from code' },
|
||||
{ id: 'd', text: 'Converting types to primitives' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Type narrowing is when TypeScript refines a broader type to a more specific one based on conditional checks (typeof, instanceof, etc.).',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['narrowing', 'type guards', 'refinement']),
|
||||
tags: JSON.stringify(['type-guards', 'narrowing', 'advanced']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['typescript'],
|
||||
question_text: 'What is the purpose of the "readonly" modifier?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Makes properties immutable after initialization' },
|
||||
{ id: 'b', text: 'Hides properties from console.log' },
|
||||
{ id: 'c', text: 'Marks properties as private' },
|
||||
{ id: 'd', text: 'Improves performance' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'The readonly modifier prevents properties from being reassigned after initialization, providing compile-time immutability.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['readonly', 'immutable', 'modifier']),
|
||||
tags: JSON.stringify(['modifiers', 'immutability', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
// SQL Questions (10 questions)
|
||||
const sqlQuestions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['sql-databases'],
|
||||
question_text: 'What is the difference between INNER JOIN and LEFT JOIN?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'INNER returns only matching rows, LEFT returns all left table rows' },
|
||||
{ id: 'b', text: 'They are exactly the same' },
|
||||
{ id: 'c', text: 'LEFT JOIN is faster' },
|
||||
{ id: 'd', text: 'INNER JOIN includes NULL values' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'INNER JOIN returns only rows with matches in both tables. LEFT JOIN returns all rows from the left table, with NULLs for non-matching right table rows.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['join', 'inner', 'left', 'sql']),
|
||||
tags: JSON.stringify(['joins', 'queries', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['sql-databases'],
|
||||
question_text: 'What is database normalization?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Organizing data to reduce redundancy and improve integrity' },
|
||||
{ id: 'b', text: 'Making all values lowercase' },
|
||||
{ id: 'c', text: 'Optimizing query performance' },
|
||||
{ id: 'd', text: 'Backing up the database' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Normalization is the process of organizing database structure to reduce redundancy and dependency by dividing large tables into smaller ones.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['normalization', 'database design', 'redundancy']),
|
||||
tags: JSON.stringify(['design', 'normalization', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['sql-databases'],
|
||||
question_text: 'What is an index in a database?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A data structure that improves query speed at the cost of write speed' },
|
||||
{ id: 'b', text: 'A primary key' },
|
||||
{ id: 'c', text: 'A backup of the table' },
|
||||
{ id: 'd', text: 'A foreign key relationship' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'An index is a data structure (typically B-tree) that speeds up data retrieval operations but requires additional space and slows down writes.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['index', 'performance', 'query optimization']),
|
||||
tags: JSON.stringify(['indexes', 'performance', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['sql-databases'],
|
||||
question_text: 'What is a transaction in SQL?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'A sequence of operations performed as a single unit of work (ACID)' },
|
||||
{ id: 'b', text: 'A single SQL query' },
|
||||
{ id: 'c', text: 'A database backup' },
|
||||
{ id: 'd', text: 'A table relationship' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'A transaction is a logical unit of work that follows ACID properties (Atomicity, Consistency, Isolation, Durability) to maintain data integrity.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['transaction', 'acid', 'commit', 'rollback']),
|
||||
tags: JSON.stringify(['transactions', 'acid', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['sql-databases'],
|
||||
question_text: 'What does the GROUP BY clause do in SQL?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Groups rows with same values for aggregate functions' },
|
||||
{ id: 'b', text: 'Sorts the result set' },
|
||||
{ id: 'c', text: 'Filters rows before grouping' },
|
||||
{ id: 'd', text: 'Joins tables together' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'GROUP BY groups rows that have the same values in specified columns, often used with aggregate functions like COUNT, SUM, AVG.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['group by', 'aggregate', 'sql']),
|
||||
tags: JSON.stringify(['grouping', 'aggregates', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
// System Design Questions (10 questions)
|
||||
const systemDesignQuestions = [
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['system-design'],
|
||||
question_text: 'What is horizontal scaling vs vertical scaling?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Horizontal adds more machines, vertical increases single machine resources' },
|
||||
{ id: 'b', text: 'Vertical adds more machines, horizontal increases resources' },
|
||||
{ id: 'c', text: 'They are the same' },
|
||||
{ id: 'd', text: 'Horizontal is always better' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Horizontal scaling (scale out) adds more machines to the pool. Vertical scaling (scale up) adds more resources (CPU, RAM) to a single machine.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['scaling', 'horizontal', 'vertical', 'architecture']),
|
||||
tags: JSON.stringify(['scaling', 'architecture', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['system-design'],
|
||||
question_text: 'What is a load balancer?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Distributes incoming traffic across multiple servers' },
|
||||
{ id: 'b', text: 'Stores user sessions' },
|
||||
{ id: 'c', text: 'Caches database queries' },
|
||||
{ id: 'd', text: 'Monitors system performance' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'A load balancer distributes network traffic across multiple servers to ensure no single server is overwhelmed, improving reliability and performance.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['load balancer', 'distribution', 'scaling']),
|
||||
tags: JSON.stringify(['load-balancing', 'architecture', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['system-design'],
|
||||
question_text: 'What is CAP theorem?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'You can only achieve 2 of 3: Consistency, Availability, Partition tolerance' },
|
||||
{ id: 'b', text: 'All three can be achieved simultaneously' },
|
||||
{ id: 'c', text: 'A caching strategy' },
|
||||
{ id: 'd', text: 'A security principle' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'CAP theorem states that a distributed system can only guarantee two of three properties: Consistency, Availability, and Partition tolerance.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['cap', 'theorem', 'distributed systems']),
|
||||
tags: JSON.stringify(['distributed-systems', 'theory', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['system-design'],
|
||||
question_text: 'What is caching and why is it used?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Storing frequently accessed data in fast storage to reduce latency' },
|
||||
{ id: 'b', text: 'Backing up data' },
|
||||
{ id: 'c', text: 'Encrypting sensitive data' },
|
||||
{ id: 'd', text: 'Compressing files' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Caching stores frequently accessed data in fast storage (memory) to reduce database load and improve response times.',
|
||||
difficulty: 'easy',
|
||||
points: 5,
|
||||
time_limit: 60,
|
||||
keywords: JSON.stringify(['cache', 'performance', 'latency']),
|
||||
tags: JSON.stringify(['caching', 'performance', 'fundamentals']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
category_id: categoryMap['system-design'],
|
||||
question_text: 'What is a microservices architecture?',
|
||||
question_type: 'multiple',
|
||||
options: JSON.stringify([
|
||||
{ id: 'a', text: 'Application composed of small, independent services communicating via APIs' },
|
||||
{ id: 'b', text: 'A very small application' },
|
||||
{ id: 'c', text: 'A caching strategy' },
|
||||
{ id: 'd', text: 'A database design pattern' }
|
||||
]),
|
||||
correct_answer: JSON.stringify(['a']),
|
||||
explanation: 'Microservices architecture structures an application as a collection of loosely coupled, independently deployable services.',
|
||||
difficulty: 'medium',
|
||||
points: 10,
|
||||
time_limit: 90,
|
||||
keywords: JSON.stringify(['microservices', 'architecture', 'distributed']),
|
||||
tags: JSON.stringify(['microservices', 'architecture', 'patterns']),
|
||||
is_active: true,
|
||||
times_attempted: 0,
|
||||
times_correct: 0,
|
||||
created_by: adminId,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
// Combine all questions
|
||||
questions.push(
|
||||
...jsQuestions,
|
||||
...angularQuestions,
|
||||
...reactQuestions,
|
||||
...nodejsQuestions,
|
||||
...tsQuestions,
|
||||
...sqlQuestions,
|
||||
...systemDesignQuestions
|
||||
);
|
||||
|
||||
await queryInterface.bulkInsert('questions', questions, {});
|
||||
console.log(`✅ Seeded ${questions.length} demo questions across all categories`);
|
||||
},
|
||||
|
||||
async down(queryInterface, Sequelize) {
|
||||
await queryInterface.bulkDelete('questions', null, {});
|
||||
console.log('✅ Removed demo questions');
|
||||
}
|
||||
};
|
||||
314
backend/seeders/20251110193633-demo-achievements.js
Normal file
314
backend/seeders/20251110193633-demo-achievements.js
Normal file
@@ -0,0 +1,314 @@
|
||||
'use strict';
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
|
||||
/** @type {import('sequelize-cli').Migration} */
|
||||
module.exports = {
|
||||
async up(queryInterface, Sequelize) {
|
||||
const achievements = [
|
||||
// Milestone achievements
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'First Steps',
|
||||
slug: 'first-steps',
|
||||
description: 'Complete your very first quiz',
|
||||
category: 'milestone',
|
||||
icon: '🎯',
|
||||
points: 10,
|
||||
requirement_type: 'quizzes_completed',
|
||||
requirement_value: 1,
|
||||
is_active: true,
|
||||
display_order: 1,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Quiz Enthusiast',
|
||||
slug: 'quiz-enthusiast',
|
||||
description: 'Complete 10 quizzes',
|
||||
category: 'milestone',
|
||||
icon: '📚',
|
||||
points: 50,
|
||||
requirement_type: 'quizzes_completed',
|
||||
requirement_value: 10,
|
||||
is_active: true,
|
||||
display_order: 2,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Quiz Master',
|
||||
slug: 'quiz-master',
|
||||
description: 'Complete 50 quizzes',
|
||||
category: 'milestone',
|
||||
icon: '🏆',
|
||||
points: 250,
|
||||
requirement_type: 'quizzes_completed',
|
||||
requirement_value: 50,
|
||||
is_active: true,
|
||||
display_order: 3,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Quiz Legend',
|
||||
slug: 'quiz-legend',
|
||||
description: 'Complete 100 quizzes',
|
||||
category: 'milestone',
|
||||
icon: '👑',
|
||||
points: 500,
|
||||
requirement_type: 'quizzes_completed',
|
||||
requirement_value: 100,
|
||||
is_active: true,
|
||||
display_order: 4,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
|
||||
// Accuracy achievements
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Perfect Score',
|
||||
slug: 'perfect-score',
|
||||
description: 'Achieve 100% on any quiz',
|
||||
category: 'score',
|
||||
icon: '💯',
|
||||
points: 100,
|
||||
requirement_type: 'perfect_score',
|
||||
requirement_value: 1,
|
||||
is_active: true,
|
||||
display_order: 5,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Perfectionist',
|
||||
slug: 'perfectionist',
|
||||
description: 'Achieve 100% on 5 quizzes',
|
||||
category: 'score',
|
||||
icon: '⭐',
|
||||
points: 300,
|
||||
requirement_type: 'perfect_score',
|
||||
requirement_value: 5,
|
||||
is_active: true,
|
||||
display_order: 6,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'High Achiever',
|
||||
slug: 'high-achiever',
|
||||
description: 'Maintain 80% average across all quizzes',
|
||||
category: 'score',
|
||||
icon: '🎓',
|
||||
points: 200,
|
||||
requirement_type: 'quizzes_passed',
|
||||
requirement_value: 80,
|
||||
is_active: true,
|
||||
display_order: 7,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
|
||||
// Speed achievements
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Speed Demon',
|
||||
slug: 'speed-demon',
|
||||
description: 'Complete a quiz in under 2 minutes',
|
||||
category: 'speed',
|
||||
icon: '⚡',
|
||||
points: 75,
|
||||
requirement_type: 'speed_demon',
|
||||
requirement_value: 120,
|
||||
is_active: true,
|
||||
display_order: 8,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Lightning Fast',
|
||||
slug: 'lightning-fast',
|
||||
description: 'Complete 10 quizzes in under 2 minutes each',
|
||||
category: 'speed',
|
||||
icon: '🚀',
|
||||
points: 200,
|
||||
requirement_type: 'speed_demon',
|
||||
requirement_value: 10,
|
||||
is_active: true,
|
||||
display_order: 9,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
|
||||
// Streak achievements
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'On a Roll',
|
||||
slug: 'on-a-roll',
|
||||
description: 'Maintain a 3-day streak',
|
||||
category: 'streak',
|
||||
icon: '🔥',
|
||||
points: 50,
|
||||
requirement_type: 'streak_days',
|
||||
requirement_value: 3,
|
||||
is_active: true,
|
||||
display_order: 10,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Week Warrior',
|
||||
slug: 'week-warrior',
|
||||
description: 'Maintain a 7-day streak',
|
||||
category: 'streak',
|
||||
icon: '🔥🔥',
|
||||
points: 150,
|
||||
requirement_type: 'streak_days',
|
||||
requirement_value: 7,
|
||||
is_active: true,
|
||||
display_order: 11,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Month Champion',
|
||||
slug: 'month-champion',
|
||||
description: 'Maintain a 30-day streak',
|
||||
category: 'streak',
|
||||
icon: '🔥🔥🔥',
|
||||
points: 500,
|
||||
requirement_type: 'streak_days',
|
||||
requirement_value: 30,
|
||||
is_active: true,
|
||||
display_order: 12,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
|
||||
// Exploration achievements
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Explorer',
|
||||
slug: 'explorer',
|
||||
description: 'Complete quizzes in 3 different categories',
|
||||
category: 'quiz',
|
||||
icon: '🗺️',
|
||||
points: 100,
|
||||
requirement_type: 'category_master',
|
||||
requirement_value: 3,
|
||||
is_active: true,
|
||||
display_order: 13,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Jack of All Trades',
|
||||
slug: 'jack-of-all-trades',
|
||||
description: 'Complete quizzes in 5 different categories',
|
||||
category: 'quiz',
|
||||
icon: '🌟',
|
||||
points: 200,
|
||||
requirement_type: 'category_master',
|
||||
requirement_value: 5,
|
||||
is_active: true,
|
||||
display_order: 14,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Master of All',
|
||||
slug: 'master-of-all',
|
||||
description: 'Complete quizzes in all categories',
|
||||
category: 'quiz',
|
||||
icon: '🌈',
|
||||
points: 400,
|
||||
requirement_type: 'category_master',
|
||||
requirement_value: 7,
|
||||
is_active: true,
|
||||
display_order: 15,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
|
||||
// Special achievements
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Early Bird',
|
||||
slug: 'early-bird',
|
||||
description: 'Complete a quiz before 8 AM',
|
||||
category: 'special',
|
||||
icon: '🌅',
|
||||
points: 50,
|
||||
requirement_type: 'early_bird',
|
||||
requirement_value: 8,
|
||||
is_active: true,
|
||||
display_order: 16,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Night Owl',
|
||||
slug: 'night-owl',
|
||||
description: 'Complete a quiz after 10 PM',
|
||||
category: 'special',
|
||||
icon: '🦉',
|
||||
points: 50,
|
||||
requirement_type: 'early_bird',
|
||||
requirement_value: 22,
|
||||
is_active: true,
|
||||
display_order: 17,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Weekend Warrior',
|
||||
slug: 'weekend-warrior',
|
||||
description: 'Complete 10 quizzes on weekends',
|
||||
category: 'special',
|
||||
icon: '🎉',
|
||||
points: 100,
|
||||
requirement_type: 'early_bird',
|
||||
requirement_value: 10,
|
||||
is_active: true,
|
||||
display_order: 18,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
},
|
||||
{
|
||||
id: uuidv4(),
|
||||
name: 'Comeback King',
|
||||
slug: 'comeback-king',
|
||||
description: 'Score 90%+ after scoring below 50%',
|
||||
category: 'special',
|
||||
icon: '💪',
|
||||
points: 150,
|
||||
requirement_type: 'early_bird',
|
||||
requirement_value: 40,
|
||||
is_active: true,
|
||||
display_order: 19,
|
||||
created_at: new Date(),
|
||||
updated_at: new Date()
|
||||
}
|
||||
];
|
||||
|
||||
await queryInterface.bulkInsert('achievements', achievements, {});
|
||||
console.log('✅ Seeded 20 demo achievements across all categories');
|
||||
},
|
||||
|
||||
async down(queryInterface, Sequelize) {
|
||||
await queryInterface.bulkDelete('achievements', null, {});
|
||||
console.log('✅ Removed demo achievements');
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user