Migration: 2026_03_01_000000_add_rollback_tracking_to_batches.php
Added columns to import_batches table:
approved_by_user_id (unsignedBigInteger, nullable) - Track who approved the batchapproved_at (timestamp, nullable) - When the batch was approvedis_rolled_back (boolean, default false, indexed) - Whether batch has been rolled backrolled_back_at (timestamp, nullable) - When rollback occurredrolled_back_by_user_id (unsignedBigInteger, nullable) - Who initiated rollbackrollback_reason (text, nullable) - Why it was rolled backAdded columns to irclog_import_jobs table:
Migration: 2026_03_01_000001_add_irclog_permissions.php
Created two new permissions:
irclog.manage - Manage IRC logs and access admin interfaceirclog.rollback - Perform rollbacks (currently requires irclog.manage)File: app/Services/IrcLog/ImportRollbackService.php
A comprehensive service handling rollback operations:
Methods:
rollbackJob(jobId, user, reason) - Execute the rollback operation
deleteProductionEvents(networkId, sourceFilename, sourceSha256) - Internal deletion
log_events table in irclog databasegetRollbackInfo(jobId) - Retrieve rollback details
getRolledBackBatches(limit) - Get audit history
File: app/Http/Controllers/Admin/IrcLog/ImportRollbackController.php
Handles web requests for rollback operations:
Routes:
GET /admin/irclog/{jobId}/rollback - Show confirmation pagePOST /admin/irclog/{jobId}/rollback - Execute rollbackGET /admin/irclog/rollback/history - View audit trailGET /admin/irclog/api/rollback/{jobId} - API endpoint for rollback infoMiddleware: Requires auth:web + can:irclog.manage
3 New Blade Templates:
resources/views/admin/irclog/rollback-confirm.blade.php
resources/views/admin/irclog/rollback-history.blade.php
Updated: resources/views/admin/irclog/show.blade.php
doneproduction_batch_id exists and not yet rolled backUpdated: resources/views/admin/irclog/index.blade.php
Updated: app/Http/Controllers/Admin/IRCLogImportController.php
Modified approve() method to:
approved_by_user_id when approvingapproved_at timestampModified mergeToProduction() method to:
File: routes/web.php
Added 4 new routes in the admin/irclog prefix group:
Route::get('/{job}/rollback', 'ImportRollbackController@confirm')
->name('admin.irclog.rollback.confirm');
Route::post('/{job}/rollback', 'ImportRollbackController@execute')
->name('admin.irclog.rollback.execute');
Route::get('/rollback/history', 'ImportRollbackController@history')
->name('admin.irclog.rollback.history');
Route::get('/api/rollback/{job}', 'ImportRollbackController@info')
->name('admin.irclog.rollback.info');
File: docs/irclog-rollback.md
Comprehensive documentation covering:
Upload Log File
↓
Detect Format
↓
Run Dry-Run (Sandbox)
↓
Review Results
↓
[APPROVE] ← User records who approved & when
↓
[MERGE TO PRODUCTION] ← Copies approval info to batch
↓
✓ DONE (in production)
↓
[IF ERROR] → Click "Rollback from Production"
↓
Confirm Rollback (provide reason)
↓
Delete from Production (recorded with who & why)
↓
✓ ROLLED BACK (audit trail preserved)
↓
Check "Rollback History" to verify
Approve a job:
Merge to production:
Realize mistake:
Confirm rollback:
Verify:
✓ Audit Trail: All approvals and rollbacks are permanently recorded ✓ User Tracking: Always know who approved and who rolled back ✓ Reason Tracking: Why decisions were made ✓ Batch Linking: Complete traceability from job to batch to rollback ✓ Timestamp: Exact timing of all operations ✓ Event Count: Know exactly what was deleted
auth:web + can:irclog.manage middlewareTo test the system:
# Run migrations
php artisan migrate --path=database/migrations/irclog/2026_03_01_000000_add_rollback_tracking_to_batches.php
php artisan migrate --path=database/migrations/2026_03_01_000001_add_irclog_permissions.php
# Check routes
php artisan route:list --path=admin/irclog | grep rollback
# Test service
php artisan tinker
> $service = app(App\Services\IrcLog\ImportRollbackService::class);
> $result = $service->rollbackJob(1, auth()->user(), 'Testing');
> dd($result);
New Files:
app/Services/IrcLog/ImportRollbackService.phpapp/Http/Controllers/Admin/IrcLog/ImportRollbackController.phpresources/views/admin/irclog/rollback-confirm.blade.phpresources/views/admin/irclog/rollback-history.blade.phpdatabase/migrations/irclog/2026_03_01_000000_add_rollback_tracking_to_batches.phpdatabase/migrations/2026_03_01_000001_add_irclog_permissions.phpdocs/irclog-rollback.mddocs/IMPLEMENTATION.md (this file)Modified Files:
routes/web.php - Added 4 new rollback routesresources/views/admin/irclog/show.blade.php - Added rollback buttonresources/views/admin/irclog/index.blade.php - Added rollback history linkapp/Http/Controllers/Admin/IRCLogImportController.php - Updated approve() and mergeToProduction()The system is ready for production use! To enable for users:
irclog.manage permission to appropriate usersConsider implementing: