forked from UKSOURCE/cms.hailearning.edu.vn
refactor: remove camp location functionality
This commit is contained in:
182
scripts/2026_02_02_170000_blog.js
Normal file
182
scripts/2026_02_02_170000_blog.js
Normal file
@@ -0,0 +1,182 @@
|
||||
require('dotenv').config();
|
||||
const fs = require('fs').promises;
|
||||
const path = require('path');
|
||||
const connectDB = require('../config/database');
|
||||
|
||||
/**
|
||||
* Migration: create_complete_blog_system
|
||||
* Created: 17:00:00 2/2/2026
|
||||
* Description: Tạo hoàn chỉnh hệ thống blog với categories, tags, posts và comments
|
||||
*/
|
||||
async function migrate() {
|
||||
try {
|
||||
// Kết nối database
|
||||
await connectDB();
|
||||
console.log('🚀 Starting migration: create_complete_blog_system...');
|
||||
|
||||
// Import models
|
||||
const Blog = require('../models/blog');
|
||||
const BlogCategory = require('../models/blogCategory');
|
||||
const BlogTag = require('../models/blogTag');
|
||||
const BlogComment = require('../models/blogComment');
|
||||
const RecentPost = require('../models/recentPost');
|
||||
|
||||
console.log('✅ Blog models registered successfully');
|
||||
|
||||
// Load complete data
|
||||
const dataPath = path.join(__dirname, '..', 'data', 'blog.json');
|
||||
const rawData = await fs.readFile(dataPath, 'utf8');
|
||||
const data = JSON.parse(rawData);
|
||||
|
||||
console.log('📖 Complete blog data loaded from JSON');
|
||||
|
||||
// Clear existing data
|
||||
console.log('🧹 Clearing existing blog data...');
|
||||
await BlogComment.deleteMany({});
|
||||
await Blog.deleteMany({});
|
||||
await BlogCategory.deleteMany({});
|
||||
await BlogTag.deleteMany({});
|
||||
await RecentPost.deleteMany({});
|
||||
console.log('✅ Existing data cleared');
|
||||
|
||||
// 1. Create categories
|
||||
console.log('📝 Creating categories...');
|
||||
const createdCategories = [];
|
||||
for (const categoryData of data.categories) {
|
||||
const category = new BlogCategory(categoryData);
|
||||
await category.save();
|
||||
createdCategories.push(category);
|
||||
console.log(`✅ Created category: ${category.name}`);
|
||||
}
|
||||
|
||||
// 2. Create tags
|
||||
console.log('📝 Creating tags...');
|
||||
const createdTags = [];
|
||||
for (const tagData of data.tags) {
|
||||
const tag = new BlogTag(tagData);
|
||||
await tag.save();
|
||||
createdTags.push(tag);
|
||||
console.log(`✅ Created tag: ${tag.name}`);
|
||||
}
|
||||
|
||||
// 3. Create blog posts
|
||||
console.log('📝 Creating blog posts...');
|
||||
const createdPosts = [];
|
||||
for (const postData of data.posts) {
|
||||
const post = new Blog(postData);
|
||||
await post.save();
|
||||
createdPosts.push(post);
|
||||
console.log(`✅ Created blog post: ${post.title}`);
|
||||
}
|
||||
|
||||
// 4. Create comments
|
||||
console.log('💬 Creating comments...');
|
||||
let createdCommentsCount = 0;
|
||||
|
||||
for (const commentData of data.comments) {
|
||||
// Find the blog post by slug
|
||||
const blog = await Blog.findOne({
|
||||
slug: commentData.postSlug,
|
||||
status: 'published'
|
||||
});
|
||||
|
||||
if (blog) {
|
||||
const comment = new BlogComment({
|
||||
postId: blog._id,
|
||||
authorName: commentData.authorName,
|
||||
authorAvatar: commentData.authorAvatar,
|
||||
content: commentData.content,
|
||||
createdAt: commentData.createdAt,
|
||||
status: commentData.status
|
||||
});
|
||||
|
||||
await comment.save();
|
||||
createdCommentsCount++;
|
||||
console.log(`✅ Created comment by ${comment.authorName} for: ${blog.title}`);
|
||||
} else {
|
||||
console.log(`⚠️ Blog post not found for slug: ${commentData.postSlug}`);
|
||||
}
|
||||
}
|
||||
|
||||
// 5. Update category post counts
|
||||
console.log('📊 Updating category post counts...');
|
||||
for (const category of createdCategories) {
|
||||
await category.updatePostCount();
|
||||
console.log(`📊 Category "${category.name}": ${category.postCount} posts`);
|
||||
}
|
||||
|
||||
// 6. Update tag post counts
|
||||
console.log('📊 Updating tag post counts...');
|
||||
for (const tag of createdTags) {
|
||||
await tag.updatePostCount();
|
||||
console.log(`📊 Tag "${tag.name}": ${tag.postCount} posts`);
|
||||
}
|
||||
|
||||
// 7. Update comments count in blog posts
|
||||
console.log('📊 Updating comments count in blog posts...');
|
||||
const blogs = await Blog.find({ status: 'published' });
|
||||
|
||||
for (const blog of blogs) {
|
||||
const commentsCount = await BlogComment.countDocuments({
|
||||
postId: blog._id,
|
||||
status: 'approved'
|
||||
});
|
||||
|
||||
blog.commentsCount = commentsCount;
|
||||
await blog.save();
|
||||
|
||||
if (commentsCount > 0) {
|
||||
console.log(`📊 Updated comments count for "${blog.title}": ${commentsCount} comments`);
|
||||
}
|
||||
}
|
||||
|
||||
// 8. Sync recent posts
|
||||
console.log('🔄 Syncing recent posts...');
|
||||
await RecentPost.syncFromBlogs(5);
|
||||
const recentPostsCount = await RecentPost.countDocuments();
|
||||
console.log(`🔄 Synced ${recentPostsCount} recent posts`);
|
||||
|
||||
// Final summary
|
||||
console.log('\n🎉 Migration create_complete_blog_system completed successfully!');
|
||||
console.log('=' .repeat(60));
|
||||
console.log('📊 MIGRATION SUMMARY:');
|
||||
console.log(` ✅ Categories: ${createdCategories.length}`);
|
||||
console.log(` ✅ Tags: ${createdTags.length}`);
|
||||
console.log(` ✅ Blog Posts: ${createdPosts.length}`);
|
||||
console.log(` ✅ Comments: ${createdCommentsCount}`);
|
||||
console.log(` ✅ Recent Posts: ${recentPostsCount}`);
|
||||
|
||||
// Statistics
|
||||
const totalPublishedPosts = await Blog.countDocuments({ status: 'published' });
|
||||
const totalFeaturedPosts = await Blog.countDocuments({ status: 'published', isFeatured: true });
|
||||
const totalApprovedComments = await BlogComment.countDocuments({ status: 'approved' });
|
||||
|
||||
console.log('\n📈 SYSTEM STATISTICS:');
|
||||
console.log(` 📝 Published Posts: ${totalPublishedPosts}`);
|
||||
console.log(` ⭐ Featured Posts: ${totalFeaturedPosts}`);
|
||||
console.log(` 💬 Approved Comments: ${totalApprovedComments}`);
|
||||
|
||||
console.log('\n🌐 ACCESS POINTS:');
|
||||
console.log(' 📱 Admin Panel: http://localhost:3001/admin/blog');
|
||||
console.log(' 🔗 API Endpoint: http://localhost:3001/api/blog');
|
||||
console.log(' 📊 Categories API: http://localhost:3001/api/blog-categories');
|
||||
console.log(' 🏷️ Tags API: http://localhost:3001/api/blog-tags');
|
||||
|
||||
console.log('\n✨ Blog system is now ready for use!');
|
||||
console.log('=' .repeat(60));
|
||||
|
||||
const mongoose = require('mongoose');
|
||||
await mongoose.disconnect();
|
||||
process.exit(0);
|
||||
} catch (error) {
|
||||
console.error('❌ Migration error:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Chạy migration nếu được gọi trực tiếp
|
||||
if (require.main === module) {
|
||||
migrate();
|
||||
}
|
||||
|
||||
module.exports = { migrate };
|
||||
Reference in New Issue
Block a user