src/Diplix/KMGBundle/Repository/UserRepository.php line 344

Open in your IDE?
  1. <?php
  2. namespace Diplix\KMGBundle\Repository;
  3. use Diplix\Commons\DataHandlingBundle\Repository\SysLogRepository;
  4. use Diplix\KMGBundle\Entity\Accounting\CoopMember;
  5. use Diplix\KMGBundle\Entity\Customer;
  6. use Diplix\KMGBundle\Entity\DeviceToken;
  7. use Diplix\KMGBundle\Entity\Role;
  8. use Diplix\KMGBundle\Entity\User;
  9. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  10. use Doctrine\Common\Collections\ArrayCollection;
  11. use Doctrine\ORM\AbstractQuery;
  12. use Doctrine\ORM\NonUniqueResultException;
  13. use Doctrine\ORM\NoResultException;
  14. use Doctrine\ORM\Query\Parameter;
  15. use Doctrine\Persistence\ManagerRegistry;
  16. use sngrl\PhpFirebaseCloudMessaging\Recipient\Device;
  17. use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface;
  18. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  19. use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
  20. use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
  21. use Symfony\Component\Security\Core\User\UserInterface;
  22. use Symfony\Component\Security\Core\User\UserProviderInterface;
  23. class UserRepository extends ServiceEntityRepository implements UserProviderInterfaceUserLoaderInterface
  24. {
  25.     use BasicRepositoryTrait;
  26.     function em()
  27.     {
  28.         return $this->_em;
  29.     }
  30.     public function __construct(ManagerRegistry $registry)
  31.     {
  32.         parent::__construct($registryUser::class);
  33.     }
  34.     public function getRoleObjectByRoleName($name)
  35.     {
  36.         $q $this->_em->createQueryBuilder()
  37.             ->select("R")
  38.             ->from('Diplix\KMGBundle\Entity\Role','R')
  39.             ->where(sprintf("R.role = '%s'",$name))
  40.             ->getQuery();
  41.         $roles $q->getResult(AbstractQuery::HYDRATE_OBJECT);
  42.         return $roles[0];
  43.     }
  44.     /**
  45.      * Get all users with the given role#
  46.      * @param $roleName
  47.      * @param null $sort
  48.      * @param null $order
  49.      * @return array of object
  50.      * @throws \Exception
  51.      */
  52.     public function findUsersByRole($roleName,$sort=null$order=null)
  53.     {
  54.         $role $this->getRoleObjectByRoleName($roleName);
  55.         $qb $this->createQueryBuilder('A');
  56.         $qb->where($qb->expr()->isMemberOf(':role''A.roles'))
  57.             ->setParameter('role',$role)
  58.             ->andWhere("A.hidden = '0'");
  59.         if ($sort!==null)
  60.         {
  61.             $qb->addOrderBy($sort,$order);
  62.         }
  63.         $res $qb->getQuery()->getResult();
  64.         $keyed = [];
  65.         foreach ($res as $o)
  66.         {
  67.             $keyed[$o->getId()] = $o;
  68.         }
  69.         return $keyed;
  70.     }
  71.     public function getPendingPasswordResetUser($email,$hash)
  72.     {
  73.         $q $this->createQueryBuilder('U')
  74.         ->select('U')
  75.         ->andWhere('U.email = :email')
  76.         ->andWhere('U.mailActionHash = :hash')
  77.         ->andWhere('U.mailActionMode = :mode')
  78.         ->setParameters(new ArrayCollection(array(
  79.                 new Parameter('email',$email),
  80.                 new Parameter('hash',$hash),
  81.                 new Parameter('mode',User::MAIL_ACTION_RESET_PASSWORD)
  82.         )))
  83.         ->getQuery();
  84.         try
  85.         {
  86.             return $q->getSingleResult(AbstractQuery::HYDRATE_OBJECT);
  87.         }
  88.         catch (\Exception $ex)
  89.         {
  90.             return false;
  91.         }
  92.     }
  93.     /**
  94.      * @param User $me
  95.      * @return array
  96.      */
  97.     public function findUsersISubstitute(User $me)
  98.     {
  99.         $qb $this->createQueryBuilder("U")
  100.             ->select("U")
  101.             ->where("U.currentSubstituteUser = :me")
  102.             ->setParameter("me",$me)
  103.             ->andWhere("U.hidden = '0'");
  104.         return $qb->getQuery()->getResult();
  105.     }
  106.     public function findUsersOfCustomer(Customer $customer)
  107.     {
  108.         $qb $this->createQueryBuilder("U")
  109.             ->select("U")
  110.             ->where("U.customer = :me")
  111.             ->setParameter("me"$customer)
  112.             ->andWhere("U.hidden = '0'")
  113.             ->orderBy('U.lastName')
  114.             ->addOrderBy('U.firstName');
  115.         return $qb->getQuery()->getResult();
  116.     }
  117.     public function findUsersOfMember(CoopMember $member)
  118.     {
  119.         $qb $this->createQueryBuilder('U')
  120.             ->select('U')
  121.             ->where('U.member = :me')
  122.             ->setParameter('me'$member)
  123.             ->andWhere("U.hidden = '0'");
  124.         return $qb->getQuery()->getResult();
  125.     }
  126.     public function findUsersWhichAreMember()
  127.     {
  128.         $qb $this->createQueryBuilder('U')
  129.             ->select('U','M')
  130.             ->leftJoin('U.member','M')
  131.             ->where('U.member is not null')
  132.             ->andWhere("U.hidden = '0'")
  133.             ->andWhere("M.active = '1'")
  134.             ->orderBy('M.shortCode','asc')
  135.             ->addOrderBy('U.lastName','asc');
  136.         return $qb->getQuery()->getResult();
  137.     }
  138.     public function findUserForList($show=''$filterCustomer=null)
  139.     {
  140.         $qb $this->createQueryBuilder("U")
  141.             ->select("U")
  142.             ->where("U.hidden = '0'");
  143.         if ($show==='customers')
  144.         {
  145.             $qb->andWhere("U.customer is not null");
  146.             // also show entries with a set member
  147.         }
  148.         else
  149.         if ($show==='members')
  150.         {
  151.             $qb->andWhere("U.member is not null");
  152.             // also show entries with a set customer
  153.         }
  154.         else
  155.         {
  156.             // no filtering
  157.         }
  158.         if ($filterCustomer!==null)
  159.         {
  160.             $qb->andWhere("U.customer = :me")
  161.                 ->setParameter("me"$filterCustomer);
  162.         }
  163.         return $qb->getQuery()->getResult();
  164.     }
  165.     public function addFcmTokenToUser($userId$token$platform='')
  166.     {
  167.         if (strlen($token)<1) return false;
  168.         $qb $this->_em->createQueryBuilder()
  169.             ->select('A,B')
  170.             ->from(DeviceToken::class,'A')
  171.             ->leftJoin('A.user','B')
  172.             ->where('A.token = :token')
  173.             ->setParameter('token',$token);
  174.         $t $qb->getQuery()->getResult();
  175.         $u $this->findOneBy(['id'=>$userId]);
  176.         if ($u===null)
  177.         {
  178.             return false;
  179.         }
  180.         $exist false;
  181.         if (count($t)>0)
  182.         {
  183.             $exist true;
  184.             /** @var DeviceToken $tk */
  185.             $tk $t[0];
  186.             // falls das token vorher einem anderen user gehört hat -> umhängen auf den neuen User
  187.             // es kann nur ein User ein Token haben !
  188.             if ($tk->getUser()->getId()!== $u->getId())
  189.             {
  190.                 $tk->setBeComment(sprintf("[%s] owner for token changed from #%d to #%d",date('d.m.Y H:i:s'),$tk->getUser()->getId(),$u->getId()));
  191.                 $tk->setUser($u);
  192.             }
  193.             $tk->setLastSeen(new \DateTime());
  194.         }
  195.         else
  196.         {
  197.             $u->getDeviceTokens()->add(DeviceToken::create($u,$token,$platform));
  198.         }
  199.         $this->flush();
  200.         return !$exist;
  201. //        /** @var User $u */
  202. //        $qb = $this->createQueryBuilder('A')
  203. //            ->select('A,B')
  204. //            ->leftJoin('A.deviceTokens', 'B')
  205. //            ->where('A.id = :id')
  206. //            ->setParameter('id',$userId);
  207. //        $u = $qb->getQuery()->getResult();
  208. //        if (count($u)!==1) return false;
  209. //        $u = $u[0];
  210. //        $exist = false;
  211. //        foreach ($u->getDeviceTokens() as $deviceToken)
  212. //        {
  213. //            /** @noinspection TypeUnsafeComparisonInspection */
  214. //            if ($deviceToken->getToken()==$token)
  215. //            {
  216. //                $deviceToken->setLastSeen(new \DateTime());
  217. //                $exist = true;
  218. //                $this->flush($deviceToken);
  219. //                break;
  220. //            }
  221. //        }
  222. //        if (!$exist)
  223. //        {
  224. //            $u->getDeviceTokens()->add(DeviceToken::create($u,$token,$platform));
  225. //        }
  226. //        $this->flush($u);
  227. //        return !$exist;
  228.     }
  229.     public function findDispoTelegramIds()
  230.     {
  231.         $users $this->findUsersByRole(Role::DISPO);
  232.         $tids = [];
  233.         /** @var User $u */
  234.         foreach ($users as $u)
  235.         {
  236.             if ($u->getTelegramId()!=='')
  237.                 $tids[]=$u->getTelegramId();
  238.         }
  239.         return $tids;
  240.     }
  241.     /***************************************************************************************************
  242.      * Implementing the UserProviderInterface
  243.      ***************************************************************************************************/
  244.     /**
  245.      * Loads the user for the given username or email address
  246.      *
  247.      * This method must throw UsernameNotFoundException if the user is not
  248.      * found.
  249.      *
  250.      * @param string $username The username
  251.      * @return UserInterface
  252.      * @see UsernameNotFoundException
  253.      * @see \Symfony\Component\Security\Core\User\UserProviderInterface::loadUserByUsername()
  254.      * @throws UsernameNotFoundException if the user is not found
  255.      */
  256.     public function loadUserByUsername($username$suppressSymfonyAuth=false)
  257.     {
  258.         $qb $this
  259.             ->createQueryBuilder('u')
  260.             ->select('u, r')
  261.             ->leftJoin('u.roles''r');
  262.         $qb
  263.             ->where(
  264.                 $qb->expr()->orX(
  265.                     $qb->expr()->eq("u.username",":username"),
  266.                     $qb->expr()->eq('u.email'":username"))
  267.             )
  268.             ->setParameter("username",$username);
  269.         $q $qb->getQuery();
  270.         try
  271.         {
  272.             // The Query::getSingleResult() method throws an exception
  273.             // if there is no record matching the criteria.
  274.             $user $q->getSingleResult();
  275.         }
  276.         catch (NoResultException NonUniqueResultException $e// php >= 7.1
  277.         {
  278.             $message sprintf(
  279.                 'Unable to find an %s active user object identified by "%s".',
  280.                 ($e instanceof  NonUniqueResultException 'unique':''),
  281.                 $username
  282.             );
  283.             if ($suppressSymfonyAuth)
  284.                 throw new \RuntimeException($message,0,$e);
  285.             else
  286.                 // UserNameNotFound exception will redirect to auth subsystem and force a http 500 error if this not configured (like when within the service)
  287.                 throw new UsernameNotFoundException($message0$e);
  288.         }
  289.         return $user;
  290.     }
  291.     /**
  292.      * Refreshes the user for the account interface.
  293.      *
  294.      * It is up to the implementation to decide if the user data should be
  295.      * totally reloaded (e.g. from the database), or if the UserInterface
  296.      * object can just be merged into some internal array of users / identity
  297.      * map.
  298.      *
  299.      * @param UserInterface $user
  300.      *
  301.      * @return UserInterface
  302.      *
  303.      * @throws UnsupportedUserException if the account is not supported
  304.      */
  305.     public function refreshUser(UserInterface $user)
  306.     {
  307.         $class get_class($user);
  308.         if (!$this->supportsClass($class)) {
  309.             throw new UnsupportedUserException(
  310.                 sprintf(
  311.                     'Instances of "%s" are not supported.',
  312.                     $class
  313.                 )
  314.             );
  315.         }
  316.         return $this->find($user->getId());
  317.     }
  318.     /**
  319.      * Whether this provider supports the given user class.
  320.      *
  321.      * @param string $class
  322.      *
  323.      * @return bool
  324.      */
  325.     public function supportsClass($class)
  326.     {
  327.         return $this->getEntityName() === $class || is_subclass_of($class$this->getEntityName());
  328.     }
  329. }