<?phpnamespace App\Service;use App\Entity\Company\Season;use App\Entity\Company\UserBrandRole;use App\Entity\User;use Doctrine\ORM\EntityManagerInterface;use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;class UserSeasonService{ private $tokenStorage; private $em; public function __construct( TokenStorageInterface $token, EntityManagerInterface $em ){ $this->tokenStorage = $token; $this->em = $em; } private function setUserRole(User $user, ?Season $season = null) { $changed = false; if ($season) { $changed = true; $user->setCurrentSeason($season); } else { $season = $user->getCurrentSeason(); } $brand = $season->getBrand(); $userBrandRoles = $this->em->getRepository(UserBrandRole::class)->findBy(['user' => $user, 'brand' => $brand]); $roles = []; $roles[] = 'ROLE_USER'; foreach ($userBrandRoles as $userBrandRole) { foreach ($userBrandRole->getRoles() as $role) { $roles[] = $role; } } if ($user->getRoles() !== $roles) { $changed = true; $user->setRoles($roles); } if ($changed) { $this->em->persist($user); $this->em->flush(); } } public function getBrand(?User $user = null) { $season = $this->getCurrentDefaultSeason($user); return $season->getBrand(); } public function getCurrentDefaultSeason($user = null): ?Season { $season = null; $seasonRepo = $this->em->getRepository(Season::class); $defaultSeason = $seasonRepo->getDefaultSeason(); if (null !== $user && !is_string($user)) { $userSeason = $user->getCurrentSeason(); if ($userSeason === null || $userSeason === $defaultSeason) { $season = $seasonRepo->getCurrentDefaultSeasonByUser($user, false); if (null !== $season) { $this->setUserRole($user, $season); } } else { $season = $user->getCurrentSeason(); } } if (null === $season){ $season = $defaultSeason; } return $season; } public function setCurrentSeason() { if (!empty($this->tokenStorage->getToken()) && !empty($this->tokenStorage->getToken()->getUser()) && !is_string($this->tokenStorage->getToken()->getUser()) && $this->tokenStorage->getToken()->getUser() instanceof User ){ $user = $this->tokenStorage->getToken()->getUser(); if (null === $user->getCurrentSeason()) { $season = $this->getCurrentDefaultSeason($user); $user->setCurrentSeason($season); $this->em->persist($user); $this->em->flush(); } $this->setUserRole($user); } } public function getAllSeasonByUser($user = null, $superAdmin = null) { if (null === $user || is_string($user)) { return null; } if ($superAdmin) { return $this->em->getRepository(Season::class)->findAll(); } return $this->em->getRepository(Season::class)->getSeasonsByUser($user, false); } public function setSeasonByUser(User $user, Season $season) { $this->setUserRole($user, $season); }}