<?php
namespace App\Controller;
use App\Entity\Notification;
use App\Entity\Workspace;
use App\Entity\Workspace\Member;
use App\Entity\Workspace\Stream;
use App\Entity\Workspace\Stream\Collaborator;
use App\EventSubscriber\InvitationSubscriber;
use Doctrine\Common\Util\ClassUtils;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
class DefaultController extends AbstractController
{
/**
* @Route("/{reactRouting}", name="loader", requirements={"reactRouting"="^(?!_profiler|_wdt|api|invitation|notification|download|tracking|build/storybook).+"}, defaults={"reactRouting": null})
*/
public function indexAction(): Response
{
return $this->render('default/index.html.twig');
}
/**
* @Route("/invitation/{type}/{token}", name="invitation", requirements={"type"="workspace|stream"})
*
* @param Request $request
* @param TranslatorInterface $translator
* @param string $type
* @param string $token
*
* @return RedirectResponse
*/
public function invitationAction(Request $request, TranslatorInterface $translator, string $type, string $token): RedirectResponse
{
$invitee = null;
switch ($type) {
case 'workspace':
/** @var Member|null $invitee */
$invitee = $this->getDoctrine()
->getManagerForClass(Member::class)
->getRepository(Member::class)
->findOneBy([
'invitationToken' => $token,
]);
break;
case 'stream':
/** @var Collaborator|null $invitee */
$invitee = $this->getDoctrine()
->getManagerForClass(Collaborator::class)
->getRepository(Collaborator::class)
->findOneBy([
'invitationToken' => $token,
]);
break;
}
if (!$invitee) {
throw new \InvalidArgumentException(
$translator->trans('error.invitation.invalid_token')
);
}
if ($invitee->isExpired()) {
throw new \InvalidArgumentException(
$translator->trans('error.invitation.expired_token')
);
}
if (!$invitee->getUser() && $invitee->getEmail()) {
$response = new RedirectResponse(
$this->generateUrl('loader', ['reactRouting' => 'registration'])
);
$response->headers->setCookie(
Cookie::create('inviteEmail')
->withValue($invitee->getEmail())
->withExpires(time() + 60)
->withHttpOnly(false)
->withSameSite(Cookie::SAMESITE_NONE)
);
} elseif ($invitee->getUser()) {
$response = new RedirectResponse(
$this->generateUrl('loader', ['reactRouting' => 'login'])
);
}
if ($response) {
$request->getSession()->set(InvitationSubscriber::SESSION_NAME, [
'id' => $invitee->getId(),
'objectClass' => ClassUtils::getClass($invitee),
]);
return $response;
}
throw new \InvalidArgumentException(
$translator->trans('error.invitation.invalid_token')
);
}
}