src/Helper/LoginHelper.php line 12

Open in your IDE?
  1. <?php
  2. namespace App\Helper;
  3. use App\DTOs\UserMe;
  4. use App\Entity\Monolith\User;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  7. class LoginHelper
  8. {
  9.     public static function fetchUser(
  10.         EntityManagerInterface $entityManager,
  11.         string $identifierField,
  12.         mixed $identifierValue,
  13.         ?string $userType null,
  14.         ?int $kindergarten null
  15.     ): ?UserMe
  16.     {
  17.         if (!in_array($userType, [User::APP_TYPE_PARENTUser::APP_TYPE_TEACHERnull])) {
  18.             throw new AccessDeniedHttpException('Undefined USER-TYPE');
  19.         }
  20.         $sql "
  21.             select u.*,
  22.                    GROUP_CONCAT(DISTINCT fu2.entity_id SEPARATOR ',') AS my_children,
  23.                    kr.modules_access,
  24.                    kr.role_id,
  25.                    CASE
  26.                        when c.student_id is not null then 'student'
  27.                        else ur.role_id
  28.                     end as type
  29.             from user u
  30.                 inner join user_role_linker url on u.user_id = url.user_id
  31.                     inner join user_role ur on url.role_id = ur.id
  32.             
  33.                 left join kg_role_users kru on (u.user_id = kru.user_id and kru.kindergarten_id = :kgId)
  34.                     left join kg_roles kr on (:kgId = kr.kindergarten_id and (kru.role_id = kr.role_id or (kru.role_id is null and (kr.role_id=ur.role_id or (kr.role_id='parent' and ur.role_id='parinte')))))
  35.             
  36.                 left join family_users fu on (fu.user_id = u.user_id and fu.entity_type = 'parinte' and ur.role_id = 'parinte')
  37.                 left join family_users fu2 on (fu.family_id = fu2.family_id and fu2.entity_type = 'child' and ur.role_id = 'parinte')
  38.             
  39.                 left join children c on u.user_id = c.student_id
  40.             
  41.             where u.{$identifierField}=:identifierValue
  42.             group by u.user_id
  43.         ";
  44.         $stmt $entityManager->getConnection()->prepare($sql);
  45.         if (
  46.             $user $stmt->executeQuery([
  47.                 'identifierValue' => $identifierValue,
  48.                 'kgId' => $kindergarten ?? 0
  49.             ])->fetchAssociative()
  50.         ) {
  51.             return UserMe::map($user)
  52.                 ->setKindergartens(self::getKindergartens($entityManager'user_id'$user['user_id']))
  53.                 ->setGroups(self::getGroups($entityManager'user_id'$user['user_id']))
  54.             ;
  55.         }
  56.         return null;
  57.     }
  58.     private static function getKindergartens(EntityManagerInterface $entityManagerstring $identifierFieldmixed $identifierValue): ?array
  59.     {
  60.         $sql "
  61.             select
  62.                 DISTINCT IFNULL(uke.kindergarten_id,
  63.                     IFNULL(ukka.kindergarten_id,
  64.                         IFNULL(ukp.kindergarten_id,
  65.                             IFNULL(ukc2.kindergarten_id, IFNULL(ukc3.kindergarten_id, ukc.kindergarten_id))
  66.                         )
  67.                     )
  68.                 ) as kg,
  69.                 IFNULL(uke.from_date,
  70.                     IFNULL(ukka.from_date,
  71.                         IFNULL(ukp.from_date,
  72.                             IFNULL(ukc.from_date, ukc2.from_date)
  73.                         )
  74.                     )
  75.                 ) as from_date,
  76.                 IFNULL(uke.end_date,
  77.                     IFNULL(ukka.end_date,
  78.                         IFNULL(ukp.end_date,
  79.                             IFNULL(ukc.end_date, ukc2.end_date)
  80.                         )
  81.                     )
  82.                 ) as end_date
  83.             from user u
  84.                  inner join user_role_linker url on u.user_id = url.user_id
  85.                  inner join user_role ur on url.role_id = ur.id
  86.             
  87.                  left join educators e on u.user_id = e.user_id
  88.             
  89.                  left join parents p on u.user_id = p.user_id
  90.             
  91.                  left join family_users fu on (fu.user_id = u.user_id and fu.entity_type = 'parinte' and ur.role_id = 'parinte')
  92.                  left join family_users fu2 on (fu.family_id = fu2.family_id and fu2.entity_type = 'child' and ur.role_id = 'parinte')
  93.             
  94.                  left join children c on u.user_id = c.student_id
  95.                  left join children c2 on p.id = c2.parent_id
  96.                  left join kg_admins ka on u.user_id = ka.user_id
  97.             
  98.                  left join user_kindergartens uke on (uke.entity_id = e.id and uke.entity_type = 'educator' and ur.role_id = 'educator')
  99.                  left join user_kindergartens ukka on (ukka.entity_id = ka.id and ukka.entity_type = 'gradinita_admin' and ur.role_id = 'gradinita_admin')
  100.                  left join user_kindergartens ukp on (ukp.entity_id = p.id and ukp.entity_type = 'parinte' and ur.role_id = 'parinte')
  101.                  left join user_kindergartens ukc on (ukc.entity_id = c.user_id and ukc.entity_type = 'copil' and ur.role_id = 'parinte')
  102.             
  103.                  left join user_kindergartens ukc2 on (ukc2.entity_id = fu2.user_id and ukc2.entity_type = 'copil' and ur.role_id = 'parinte')
  104.                  left join user_kindergartens ukc3 on (ukc3.entity_id = c2.user_id and ukc3.entity_type = 'copil' and ur.role_id = 'parinte')
  105.             
  106.             where u.{$identifierField}=:identifierValue
  107.         ";
  108.         $stmt $entityManager->getConnection()->prepare($sql);
  109.         $list $stmt->executeQuery(['identifierValue' => $identifierValue])->fetchAllAssociative();
  110.         $list array_filter($list);
  111.         $result = [];
  112.         foreach ($list as $item) {
  113.             if (!$item['kg']) {
  114.                 continue;
  115.             }
  116.             if ('0000-00-00 00:00:00' == $item['end_date']) {
  117.                 $item['end_date'] = null;
  118.             }
  119.             if (!isset($result[$item['kg']])) {
  120.                 $result[$item['kg']] = [$item['from_date'], $item['end_date']];
  121.                 continue;
  122.             }
  123.             if (strtotime($item['from_date']) < strtotime($result[$item['kg']][0])) {
  124.                 $result[$item['kg']][0] = $item['from_date'];
  125.             }
  126.             if (is_null($item['end_date']) || is_null($result[$item['kg']][1])) {
  127.                 $result[$item['kg']][1] = null;
  128.             } elseif (strtotime($item['end_date']) < strtotime($result[$item['kg']][1])) {
  129.                 $result[$item['kg']][1] = $item['end_date'];
  130.                 if (strtotime($result[$item['kg']][1]) < time()) {
  131.                     $result[$item['kg']][1] = null;
  132.                 }
  133.             }
  134.         }
  135.         return $result;
  136.     }
  137.     private static function getGroups(EntityManagerInterface $entityManagerstring $identifierFieldmixed $identifierValue): ?array
  138.     {
  139.         $sql "
  140.             select
  141.                 DISTINCT IFNULL(eg.group_id,
  142.                    IFNULL(cg2.group_id, cg.group_id)
  143.                 ) as `group`,
  144.                 IFNULL(eg.from_date,
  145.                    IFNULL(cg2.from_date, cg.from_date)
  146.                 ) as from_date,
  147.                 IFNULL(eg.end_date,
  148.                    IFNULL(cg2.end_date, cg.end_date)
  149.                 ) as end_date                
  150.             from user u
  151.                 inner join user_role_linker url on u.user_id = url.user_id
  152.                 inner join user_role ur on url.role_id = ur.id
  153.                 
  154.                 left join educators e on u.user_id = e.user_id
  155.                 left join educators_groups eg on (eg.educator_id = e.id)
  156.                 
  157.                 left join family_users fu on (fu.user_id = u.user_id and fu.entity_type = 'parinte' and ur.role_id = 'parinte')
  158.                 left join family_users fu2 on (fu.family_id = fu2.family_id and fu2.entity_type = 'child' and ur.role_id = 'parinte')
  159.                 left join children_groups cg2 on (cg2.child_id = fu2.entity_id)
  160.                 
  161.                 left join children c on u.user_id = c.student_id
  162.                 left join children_groups cg on (cg.child_id = c.user_id)            
  163.             where u.{$identifierField}=:identifierValue
  164.         ";
  165.         $stmt $entityManager->getConnection()->prepare($sql);
  166.         $list $stmt->executeQuery(['identifierValue' => $identifierValue])->fetchAllAssociative();
  167.         $list array_filter($list);
  168.         $result = [];
  169.         foreach ($list as $item) {
  170.             if (!$item['group']) {
  171.                 continue;
  172.             }
  173.             if ('0000-00-00 00:00:00' == $item['end_date']) {
  174.                 $item['end_date'] = null;
  175.             }
  176.             if (!isset($result[$item['group']])) {
  177.                 $result[$item['group']] = [$item['from_date'], $item['end_date']];
  178.                 continue;
  179.             }
  180.             if (strtotime($item['from_date']) < strtotime($result[$item['group']][0])) {
  181.                 $result[$item['group']][0] = $item['from_date'];
  182.             }
  183.             if (is_null($item['end_date']) || is_null($result[$item['group']][1])) {
  184.                 $result[$item['group']][1] = null;
  185.             } elseif (strtotime($item['end_date']) < strtotime($result[$item['group']][1])) {
  186.                 $result[$item['group']][1] = $item['end_date'];
  187.                 if (strtotime($result[$item['group']][1]) < time()) {
  188.                     $result[$item['group']][1] = null;
  189.                 }
  190.             }
  191.         }
  192.         return $result;
  193.     }
  194. }