<?php
declare(strict_types=1);
namespace App\UI\Admin\Controller;
use App\Application\OnboardingUser\Command\RefreshOnboardingUserStatus\RefreshOnboardingUserStatusCommand;
use App\Infrastructure\OnboardingUser\BankXs\Exception\BankXsOnboardingException;
use App\Infrastructure\Shared\Bus\Command\CommandBusInterface;
use App\UI\Admin\Datatable\OnboardingUserDatatable;
use App\UI\Admin\Form\Type\OnboardingUser\OnboardingUserCreateType;
use App\UI\Shared\Controller\AbstractController;
use Sg\DatatablesBundle\Response\DatatableResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/onboarding-users')]
class OnboardingUserController extends AbstractController
{
#[Route(path: '/', name: 'admin_onboarding_users')]
public function index(
Request $request,
OnboardingUserDatatable $datatable,
DatatableResponse $datatableResponse
): Response {
$isAjax = $request->isXmlHttpRequest();
$datatable->buildDatatable();
if ($isAjax) {
$datatableResponse->setDatatable($datatable);
$datatableResponse->getDatatableQueryBuilder();
return $datatableResponse->getResponse();
}
return $this->render('admin/onboarding_user/index.html.twig', [
'datatable' => $datatable,
]);
}
#[Route(path: '/create', name: 'admin_onboarding_users_create')]
public function create(Request $request, CommandBusInterface $commandBus): Response
{
$form = $this->createForm(OnboardingUserCreateType::class, null, [
'action' => $this->generateUrl('admin_onboarding_users_create'),
]);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if (!$form->isValid() && $request->isXmlHttpRequest()) {
return $this->createFormErrorsJsonResponse($form);
}
try {
$uiUrlRedirect = $commandBus->dispatch($form->getData());
} catch (BankXsOnboardingException $exception) {
return $this->createErrorJsonResponse('Unable to create the onboarding user. Please try again.');
}
return $this->json(['redirectUrl' => $uiUrlRedirect]);
}
return $this->renderForm('admin/onboarding_user/create.html.twig', [
'form' => $form,
]);
}
#[Route(path: '/{userId}/refresh-status', name: 'admin_onboarding_users_refresh_status')]
public function refreshStatus(string $userId, CommandBusInterface $commandBus): Response
{
try {
$status = $commandBus->dispatch(new RefreshOnboardingUserStatusCommand($userId));
} catch (BankXsOnboardingException $exception) {
return $this->createErrorJsonResponse('Unable to refresh the onboarding status. Please try again.');
}
return $this->json(['status' => $status]);
}
#[Route(path: '/onboarding/tab/close', name: 'admin_onboarding_tab_close')]
public function closeOnboardingTab(): Response
{
return new Response(
'<script>window.close();</script>',
Response::HTTP_OK,
['Content-Type' => 'text/html']
);
}
}