const mongoose = require('mongoose'); const SourceText = require('./models/SourceText'); // MongoDB connection const MONGODB_URI = process.env.MONGODB_URI || 'mongodb+srv://nothingyu:wSg3lbO1PkHiRMq9@sandbox.ecysggv.mongodb.net/?retryWrites=true&w=majority&appName=sandbox'; async function testProtectionSystem() { try { console.log('๐ŸŒ Connecting to MongoDB...'); await mongoose.connect(MONGODB_URI); console.log('โœ… Connected to MongoDB'); // Find a protected task to test const protectedTask = await SourceText.findOne({ isProtected: true, weekNumber: 1 }); if (!protectedTask) { console.log('โŒ No protected tasks found'); return; } console.log(`\n๐Ÿงช TESTING PROTECTION SYSTEM:`); console.log(` Task: ${protectedTask.title}`); console.log(` ID: ${protectedTask._id}`); console.log(` Protected: ${protectedTask.isProtected ? 'YES' : 'NO'}`); console.log(` Reason: ${protectedTask.protectedReason}`); // Test 1: Try to update a protected task (should fail) console.log('\n๐Ÿ”’ TEST 1: Attempting to update protected task...'); try { const updateResult = await SourceText.findByIdAndUpdate( protectedTask._id, { content: 'This should not work!' }, { new: true } ); if (updateResult) { console.log('โŒ PROTECTION FAILED: Task was updated despite being protected!'); } } catch (error) { console.log('โœ… PROTECTION WORKING: Update was prevented'); } // Test 2: Try to delete a protected task (should fail) console.log('\n๐Ÿ”’ TEST 2: Attempting to delete protected task...'); try { const deleteResult = await SourceText.findByIdAndDelete(protectedTask._id); if (deleteResult) { console.log('โŒ PROTECTION FAILED: Task was deleted despite being protected!'); } else { console.log('โœ… PROTECTION WORKING: Deletion was prevented'); } } catch (error) { console.log('โœ… PROTECTION WORKING: Deletion was prevented'); } // Test 3: Show how to safely unlock a task console.log('\n๐Ÿ”“ TEST 3: Demonstrating unlock process...'); console.log(' To unlock a protected task, you need the special key:'); console.log(' Key: UNLOCK_WEEK1_WEEK2_2024'); console.log(' Usage: unlockProtectedTask(taskId, key)'); // Test 4: Show current protection status console.log('\n๐Ÿ“Š PROTECTION STATUS:'); const allProtectedTasks = await SourceText.find({ isProtected: true }); const week1Protected = allProtectedTasks.filter(t => t.weekNumber === 1).length; const week2Protected = allProtectedTasks.filter(t => t.weekNumber === 2).length; console.log(` Week 1 protected tasks: ${week1Protected}`); console.log(` Week 2 protected tasks: ${week2Protected}`); console.log(` Total protected tasks: ${allProtectedTasks.length}`); // Test 5: Show safe update for non-protected tasks console.log('\nโœ… TEST 5: Safe update for non-protected tasks...'); const nonProtectedTask = await SourceText.findOne({ isProtected: { $ne: true }, category: 'tutorial' }); if (nonProtectedTask) { console.log(` Found non-protected task: ${nonProtectedTask.title}`); console.log(` This task can be safely updated`); } else { console.log(` No non-protected tutorial tasks found`); } console.log('\n๐ŸŽ‰ PROTECTION SYSTEM TEST COMPLETE'); console.log('\n๐Ÿ“‹ PROTECTION SUMMARY:'); console.log(' โœ… Week 1 and Week 2 tutorial tasks are LOCKED'); console.log(' โœ… Protected tasks cannot be accidentally modified'); console.log(' โœ… Special key required to unlock tasks'); console.log(' โœ… Modification history is tracked'); console.log(' โœ… Safe updates still work for non-protected tasks'); } catch (error) { console.error('โŒ Error testing protection system:', error); } finally { await mongoose.disconnect(); console.log('๐Ÿ”Œ Disconnected from MongoDB'); } } // SAFE UPDATE FUNCTION WITH PROTECTION CHECK async function safeUpdateTask(taskId, updates, reason = 'No reason provided') { try { console.log('๐ŸŒ Connecting to MongoDB...'); await mongoose.connect(MONGODB_URI); console.log('โœ… Connected to MongoDB'); const task = await SourceText.findById(taskId); if (!task) { console.log(`โŒ Task with ID ${taskId} not found`); return false; } if (task.isProtected) { console.log(`๐Ÿšซ CANNOT UPDATE: Task "${task.title}" is PROTECTED`); console.log(` Reason: ${task.protectedReason}`); console.log(` To update this task, you must first unlock it`); return false; } // Safe to update const updatedTask = await SourceText.findByIdAndUpdate( taskId, { ...updates, lastModified: new Date(), modificationHistory: [ ...(task.modificationHistory || []), { action: 'UPDATED', timestamp: new Date(), reason: reason } ] }, { new: true } ); console.log(`โœ… Updated task: ${updatedTask.title}`); return true; } catch (error) { console.error('โŒ Error updating task:', error); return false; } finally { await mongoose.disconnect(); console.log('๐Ÿ”Œ Disconnected from MongoDB'); } } // Export for use in other scripts module.exports = { testProtectionSystem, safeUpdateTask }; // Run the test testProtectionSystem();