Files
sena_db_api_layer/scripts/triggerLessonDataFill.js
silverpro89 816794a861
All checks were successful
Deploy to Production / deploy (push) Successful in 23s
update
2026-01-27 18:33:35 +07:00

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);