Fix lỗi set privacy chéo

This commit is contained in:
2026-06-10 15:00:40 +07:00
parent 727bda9b48
commit ec7a9186b6
9 changed files with 190 additions and 76 deletions
+92
View File
@@ -0,0 +1,92 @@
const mongoose = require('mongoose');
const fs = require('fs');
const path = require('path');
const connectDB = require('../config/db');
const Scene = require('../models/Scene');
const Hotspot = require('../models/Hotspot');
/**
* Script migration chuẩn hóa trường tourId cho tất cả các Scene dựa trên liên kết Hotspot thực tế.
* Đảm bảo tính nhất quán cho các tính năng Privacy Cascading và Cascade Delete.
*/
const migrateTourIds = async () => {
try {
console.log('--- Bắt đầu quy trình chuẩn hóa tourId ---');
await connectDB();
// Bước 1: Xóa bỏ các giá trị tourId rác (null, rỗng) để xử lý sạch
await Scene.updateMany(
{ tourId: { $in: [null, ""] } },
{ $unset: { tourId: 1 } }
);
// Bước 2: Tìm các cảnh gốc (Roots)
// Cảnh gốc là cảnh không có bất kỳ hotspot đi tới nào (không tính link quay lại - is_auto_return)
const targetSceneIds = await Hotspot.find({ is_auto_return: { $ne: true } }).distinct('target_scene_id');
const rootScenes = await Scene.find({ _id: { $nin: targetSceneIds } });
console.log(`- Tìm thấy ${rootScenes.length} cảnh gốc tiềm năng.`);
const processedScenes = new Set();
let updatedCount = 0;
for (const root of rootScenes) {
const rootIdStr = root._id.toString();
if (processedScenes.has(rootIdStr)) continue;
console.log(`- Đang xử lý Tour: ${root.name || root.title || root._id}`);
// Cập nhật rootId cho chính nó
await Scene.updateOne({ _id: root._id }, { $set: { tourId: root._id } });
processedScenes.add(rootIdStr);
updatedCount++;
// Duyệt BFS để gán tourId cho toàn bộ cây tour
let queue = [root._id];
while (queue.length > 0) {
const parentId = queue.shift();
const hotspots = await Hotspot.find({
parent_scene_id: parentId,
is_auto_return: { $ne: true }
});
for (const hs of hotspots) {
if (hs.target_scene_id) {
const childIdStr = hs.target_scene_id.toString();
if (!processedScenes.has(childIdStr)) {
await Scene.updateOne(
{ _id: hs.target_scene_id },
{ $set: { tourId: root._id } }
);
processedScenes.add(childIdStr);
updatedCount++;
queue.push(hs.target_scene_id);
}
}
}
}
}
// Bước 3: Xử lý các cảnh mồ côi hoặc vòng lặp kín (tự trỏ về chính mình làm gốc)
const orphanScenes = await Scene.find({ tourId: { $exists: false } });
let orphanCount = 0;
for (const scene of orphanScenes) {
await Scene.updateOne({ _id: scene._id }, { $set: { tourId: scene._id } });
orphanCount++;
}
console.log(`- Đã cập nhật ${updatedCount} cảnh theo luồng tour.`);
console.log(`- Đã xử lý ${orphanCount} cảnh mồ côi/vòng lặp tự trỏ về chính mình.`);
console.log('--- Hoàn tất migration tourId! ---');
mongoose.connection.close();
process.exit(0);
} catch (error) {
console.error('Lỗi Migration:', error.message);
if (mongoose.connection) mongoose.connection.close();
process.exit(1);
}
};
migrateTourIds();