add changes

This commit is contained in:
AD2025
2025-11-11 00:25:50 +02:00
commit e3ca132c5e
86 changed files with 22238 additions and 0 deletions

View 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');
}
};

View 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');
}
};

View 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');
}
};

View 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');
}
};