118 lines
3.3 KiB
JavaScript
118 lines
3.3 KiB
JavaScript
/**
|
|
* Script để trigger Lesson Data Fill Worker
|
|
* Chạy script này để bắt đầu xử lý tất cả lessons và tạo process_data tasks
|
|
*/
|
|
|
|
const { Queue } = require('bullmq');
|
|
const { connectionOptions } = require('../config/bullmq');
|
|
|
|
/**
|
|
* Trigger worker để xử lý lessons
|
|
*/
|
|
async function triggerLessonDataFill(options = {}) {
|
|
const {
|
|
batchSize = 50,
|
|
totalLessons = null, // null = process all
|
|
filters = {}, // { lesson_content_type: 'vocabulary', chapter_id: 'xxx' }
|
|
} = options;
|
|
|
|
const queue = new Queue('lesson-data-fill', {
|
|
connection: connectionOptions,
|
|
prefix: process.env.BULLMQ_PREFIX || 'vcb',
|
|
});
|
|
|
|
try {
|
|
let offset = 0;
|
|
let jobsCreated = 0;
|
|
let hasMore = true;
|
|
|
|
console.log('🚀 Starting lesson data fill process...');
|
|
console.log('📋 Config:', { batchSize, totalLessons, filters });
|
|
|
|
while (hasMore) {
|
|
// Kiểm tra nếu đã đạt giới hạn
|
|
if (totalLessons && offset >= totalLessons) {
|
|
console.log(`✅ Reached limit of ${totalLessons} lessons`);
|
|
break;
|
|
}
|
|
|
|
// Tạo job cho batch này
|
|
const job = await queue.add(
|
|
`process-lessons-batch-${offset}`,
|
|
{
|
|
batchSize,
|
|
offset,
|
|
filters,
|
|
},
|
|
{
|
|
priority: 5,
|
|
jobId: `lesson-fill-${offset}-${Date.now()}`,
|
|
}
|
|
);
|
|
|
|
console.log(`✅ Created job ${job.id} for offset ${offset}`);
|
|
jobsCreated++;
|
|
|
|
// Chờ một chút để tránh quá tải
|
|
await new Promise(resolve => setTimeout(resolve, 100));
|
|
|
|
offset += batchSize;
|
|
|
|
// Nếu không có totalLessons, sẽ dừng sau 1 job để kiểm tra hasMore
|
|
if (!totalLessons) {
|
|
// Worker sẽ báo hasMore trong result
|
|
hasMore = false; // Tạm dừng, có thể chạy lại script để tiếp tục
|
|
}
|
|
}
|
|
|
|
console.log(`\n✅ Process completed!`);
|
|
console.log(`📊 Total jobs created: ${jobsCreated}`);
|
|
console.log(`📊 Lessons range: 0 to ${offset}`);
|
|
|
|
await queue.close();
|
|
process.exit(0);
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error:', error.message);
|
|
await queue.close();
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
// Parse command line arguments
|
|
const args = process.argv.slice(2);
|
|
const options = {};
|
|
|
|
for (let i = 0; i < args.length; i++) {
|
|
const arg = args[i];
|
|
|
|
if (arg === '--batch-size' && args[i + 1]) {
|
|
options.batchSize = parseInt(args[i + 1]);
|
|
i++;
|
|
}
|
|
|
|
if (arg === '--total' && args[i + 1]) {
|
|
options.totalLessons = parseInt(args[i + 1]);
|
|
i++;
|
|
}
|
|
|
|
if (arg === '--type' && args[i + 1]) {
|
|
options.filters = options.filters || {};
|
|
options.filters.lesson_content_type = args[i + 1];
|
|
i++;
|
|
}
|
|
|
|
if (arg === '--chapter' && args[i + 1]) {
|
|
options.filters = options.filters || {};
|
|
options.filters.chapter_id = args[i + 1];
|
|
i++;
|
|
}
|
|
}
|
|
|
|
// Run
|
|
console.log('═══════════════════════════════════════════════════════');
|
|
console.log(' Lesson Data Fill Trigger Script');
|
|
console.log('═══════════════════════════════════════════════════════\n');
|
|
|
|
triggerLessonDataFill(options);
|