upd: DefaultController (#25)

add database transfer capability
This commit is contained in:
2026-03-26 15:14:15 -04:00
parent c948b1e39d
commit 2a22a3e027
5 changed files with 614 additions and 2 deletions

View File

@@ -7,6 +7,7 @@ use App\Entity\User;
use App\Entity\Speaker;
use App\Entity\Series;
use App\Entity\SharedNote;
use App\Service\DatabaseTransferService;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
@@ -40,6 +41,7 @@ class DefaultController extends AbstractController
'last4Notes' => $last4Notes,
'reverseNoteSort' => $openNotes,
'isAdmin' => $this->isGranted('ROLE_ADMIN'),
'xferDB' => DatabaseTransferService::isTransferEnabled(),
'meta' => $meta,
'speakers' => $speakers,
'series' => $series,
@@ -89,7 +91,7 @@ class DefaultController extends AbstractController
]);
}
#[Route('/reference-editor', name: 'app_reference_editor')]
#[Route('/reference-editor', 'app_reference_editor')]
public function referenceEditor(EntityManagerInterface $emi): Response
{
$this->denyAccessUnlessGranted('ROLE_ADMIN');
@@ -97,10 +99,63 @@ class DefaultController extends AbstractController
return $this->render('editors/reference-editor.html.twig');
}
#[Route('/template-editor', name: 'app_template_editor')]
#[Route('/template-editor', 'app_template_editor')]
public function templateEditor(): Response
{
$this->denyAccessUnlessGranted('IS_AUTHENTICATED_FULLY');
return $this->render('editors/template-editor.html.twig');
}
#[Route('/xfer-database', name: 'app_admin_transfer_db')]
public function transfer(DatabaseTransferService $service, Request $request): Response
{
$step = $request->query->get('step', 'init');
$session = $request->getSession();
if ($step === 'init') {
$service->createSchema();
$session->remove('transfer_logs');
return $this->redirectToRoute('app_admin_transfer_db', ['step' => 0]);
}
if ($step === 'summary') {
// Finalize
$service->finalizeEnvSwap();
return $this->render('default/transfer_summary.html.twig', [
'logs' => $session->get('transfer_logs', [])
]);
}
$classes = $service->getEntityClasses();
$totalClasses = count($classes);
if (isset($classes[$step])) {
$class = explode("\\", $classes[$step]);
$className = end($class);
$func = "transfer{$className}Table";
if (method_exists($service, $func)) {
$skippedCount = $service->{$func}();
if ($skippedCount > 0) {
$logs = $session->get('transfer_logs', []);
$logs[] = "Skipped $skippedCount orphaned records in the $className table.";
$session->set('transfer_logs', $logs);
}
$progress = round((($step+1) / $totalClasses) * 100);
$nextStep = ($step + 1 < $totalClasses) ? ($step + 1) : 'summary';
return $this->render('default/transfer_progress.html.twig', [
'current' => $className,
'progress' => $progress,
'next_step' => $nextStep,
]);
}
}
// Step 7: Logout and redirect
return $this->redirectToRoute('app_logout');
}
}