$l) { echo sprintf(" %2d. [%-12s] %-10s / %-10s : %s (Current: %s)\n", $idx + 1, $l['subject_key'], $l['unit_key'], $l['lesson_key'], $l['title'], $l['source_status'] ); } if (!$apply) { echo "\n[Dry-run completed. To execute, append --apply to your command.]\n"; exit(0); } // 4. Apply changes inside a transaction $pdo = Database::getConnection(); $pdo->beginTransaction(); try { if ($isRevert) { // Revert to draft Database::query( "UPDATE curriculum_lessons SET source_status = 'unverified' WHERE id IN ({$idList})" ); Database::query( "UPDATE publication_bundles SET status = 'draft', published_at = NULL WHERE curriculum_lesson_id IN ({$idList})" ); Database::query( "UPDATE content_assets a JOIN publication_bundle_assets pba ON pba.content_asset_id = a.id JOIN publication_bundles pb ON pb.id = pba.publication_bundle_id SET a.review_status = 'draft', a.rights_status = 'review_required' WHERE pb.curriculum_lesson_id IN ({$idList})" ); } else { // Publish and approve Database::query( "UPDATE curriculum_lessons SET source_status = 'approved', reviewed_at = CURRENT_TIMESTAMP WHERE id IN ({$idList})" ); Database::query( "UPDATE publication_bundles SET status = 'published', published_at = CURRENT_TIMESTAMP WHERE curriculum_lesson_id IN ({$idList})" ); Database::query( "UPDATE content_assets a JOIN publication_bundle_assets pba ON pba.content_asset_id = a.id JOIN publication_bundles pb ON pb.id = pba.publication_bundle_id SET a.review_status = 'approved', a.rights_status = 'cleared' WHERE pb.curriculum_lesson_id IN ({$idList})" ); } $pdo->commit(); echo "\n=== SUCCESS: " . ($isRevert ? "Reverted" : "Published") . " " . count($targetLessons) . " lessons successfully. ===\n"; } catch (\Throwable $e) { if ($pdo->inTransaction()) { $pdo->rollBack(); } fwrite(STDERR, "\nFAILED: Publication transaction rolled back: " . $e->getMessage() . "\n"); exit(1); }