src/Common/Functions/DbFunction.php line 419

  1. <?php
  2. namespace App\Common\Functions;
  3. use App\Common\Functions\Filters\Main;
  4. use App\Functions\Common\Variables;
  5. use App\Functions\PreSave\Main as PreSaveMain;
  6. use Symfony\Component\Mercure\Hub;
  7. use Symfony\Component\Mercure\Jwt\StaticTokenProvider;
  8. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  9. class DbFunction
  10. {
  11.   public const HUB_URL 'https://mer-hub.ukkera.com/.well-known/mercure';
  12.   public const TOKEN 'eyJhbGciOiJIUzI1NiJ9.eyJtZXJjdXJlIjp7InB1Ymxpc2giOlsiKiJdLCJwYXlsb2FkIjp7InVzZXIiOiJodHRwczovL2Npa2kudWtrZXJhLmNvbS8iLCJyZW1vdGVBZGRyIjoiMTI3LjAuMC4xIn19fQ.yb2G4txCdqFgIaoXSg41UDVsEq1TptEMSIBUKlII92E';
  13.   public static function FetchExtra($dm$fetch)
  14.   {
  15.     $value = [];
  16.     foreach ($fetch as $key => $item) {
  17.       $value[$key] = self::fetchWithKeys($dm$item['filters'] ?? [], $item['keys'] ?? ['id'], $item['module'] ?? $key$item['aggs'] ?? [], $item['props'] ?? ['hydrate' => true]);
  18.     }
  19.     return $value;
  20.   }
  21.   public static function buildHub()
  22.   {
  23.     $hub = new Hub(self::HUB_URL, new StaticTokenProvider(self::TOKEN));
  24.     return $hub;
  25.   }
  26.   public static function AddOrUpdateModel($module$dm$serializer$ev)
  27.   {
  28.     $model Helpers::get_module($module);
  29.     $repo $dm->getRepository($model);
  30.     $db_val null;
  31.     if ($ev['id'] ?? false) {
  32.       $db_val $repo->findOneBy(['id' => $ev['id']]);
  33.     }
  34.     return self::AddOrUpdate($model$dm$serializer$ev$db_val);
  35.   }
  36.   public static function AddOrUpdate($model$dm$serializer$ev$db_val null$props = [], $params = [])
  37.   {
  38.     $cs Helpers::get_model_config($model);
  39.     $pre_save Helpers::getFun($model'PreSave');
  40.     $hooks $cs->hooks ?? [];
  41.     $validate_fun Helpers::getFun($model'Validations');
  42.     $repo $dm->getRepository($model);
  43.     $translations $ev['translate'] ?? [];
  44.     $id $ev['id'] ?? $ev['pid'] ?? null;
  45.     if ($cs->edits ?? false) {
  46.       Helpers::mapping_from_account($ev$cs->edits);
  47.     }
  48.     if ($cs->inits ?? false) {
  49.       Helpers::inits_functions($ev$cs->inits);
  50.     }
  51.     if ($id && !$db_val) {
  52.       $db_val $repo->findOneBy(['id' => $id]);
  53.     }
  54.     if ($id && ($db_val ?? false)) {
  55.       $saves $serializer->deserialize(json_encode($ev), $model'json', [...Variables::DESERIALZER_OPTIONSObjectNormalizer::DEEP_OBJECT_TO_POPULATE => true'object_to_populate' => clone $db_val'dm' => $dm'serializer' => $serializer'creating' => false]);
  56.       if ($pre_save) {
  57.         $saves->creating false;
  58.         $saves->remove $ev['remove'] ?? false;
  59.         $pre_save->invoke((object) [], $dm$saves$serializer$db_val$props$params);
  60.       }
  61.       if($hooks['pre_save'] ?? false) {
  62.         $saves->creating false;
  63.         $saves->remove $ev['remove'] ?? false;
  64.         PreSaveMain::handler($hooks['pre_save'], $dm$saves$serializer$db_val$props$params);
  65.       }
  66.       // dd($saves, $ev, $db_val->app, $saves->app);
  67.       $dm->merge($saves);
  68.       $dm->flush();
  69.       if ($ev['remove'] ?? false) {
  70. //          try{
  71. //          dd(get_class_methods($db_val));
  72.         $can_remove $db_val->checkRemoval();
  73.         if (!$can_remove) {
  74.           return ['error' => 'cannot remove this data'];
  75.         }
  76.         $dm->remove($db_val);
  77. //          }catch(\Exception $ex){
  78. //            $dm->persist($db_val);
  79. //          }
  80.         $dm->flush();
  81.         return null;
  82.       }
  83.       self::CreateTranslations($saves$dm$translations);
  84.       return $id;
  85.     }
  86.     if ($ev['remove'] ?? false) {
  87.       return null;
  88.     }
  89.     if ($cs->mappings ?? false) {
  90.       Helpers::mapping_from_account($ev$cs->mappings);
  91.     }
  92.     $value $serializer->deserialize(json_encode($ev), $model'json', [...Variables::DESERIALZER_OPTIONS'dm' => $dm'serializer' => $serializer'creating' => true]);
  93.     if ($validate_fun) {
  94.       $v_out $validate_fun->invoke((object) [], $dm$value$serializer, (object) [], $props$params);
  95.       if ($v_out) {
  96.         return $v_out->getId();
  97.       }
  98.     }
  99.     if ($cs->generate ?? false) {
  100.       if (!$id) {
  101.         $id Main::generate_id_from_vals($value$cs->generate);
  102.       }
  103.     }
  104.     if ($id) {
  105.       $value->id $id;
  106.     }
  107.     $dm->persist($value);
  108.     $dm->flush();
  109.     if ($pre_save) {
  110.       $value->creating true;
  111.       try {
  112.         $pre_save->invoke((object) [], $dm$value$serializer, (object) [], $props$params);
  113.         if($hooks['pre_save'] ?? false) {
  114.           PreSaveMain::handler($hooks['pre_save'], $dm$value$serializer$db_val$props$params);
  115.         }
  116.       } catch (\Throwable $ex) {
  117.         $dm->remove($value);
  118.         $dm->flush();
  119.         dd($ex);
  120.       }
  121.     }
  122.     $serializer->deserialize(json_encode([...$ev'id' => $value->id]), $model'json', ['object_to_populate' => clone $valueObjectNormalizer::DEEP_OBJECT_TO_POPULATE => true, ...Variables::DESERIALZER_OPTIONS'dm' => $dm'serializer' => $serializer'creating' => false]);
  123.     $dm->flush();
  124.     self::CreateTranslations($value$dm$translations);
  125.     return $value->id;
  126.   }
  127.   public static function FindTranslations($mainValue$dm)
  128.   {
  129.     $repository $dm->getRepository('\\Gedmo\\Translatable\\Document\\Translation');
  130.     return $repository->findTranslations($mainValue);
  131.   }
  132.   public static function runModuleValidation($module$inputs$dm$serializer$props$params)
  133.   {
  134.     $model Helpers::get_module($module);
  135.     $error_validation_fun Helpers::getFun($model'ErrorValidations');
  136.     if ($error_validation_fun) {
  137.       foreach ($inputs as $key => $values) {
  138.         foreach ($values as $vs => $value) {
  139.           $v_out $error_validation_fun->invoke((object) [], $dm, (object) $value$serializer, (object) [], $props$params);
  140.           if ($v_out) {
  141.             return $v_out;
  142.           }
  143.         }
  144.       }
  145.     }
  146.   }
  147.   public static function GetByIds($model$em$data$col$key 'id')
  148.   {
  149.     $entity Helpers::get_module($model)['model'];
  150.     $ids $col array_column($data$col) : $data;
  151.     // dd($ids);
  152.     $qb $em->createQueryBuilder();
  153.     $qb->select('m');
  154.     $qb->from($entity'm');
  155.     $qb->where($qb->expr()->in("m.$key"'?1'));
  156.     return $qb->setParameters(['1' => $ids])->getQuery()->getResult();
  157.   }
  158.   public static function resetUserPassword($dm$user$password)
  159.   {
  160.     if ($user) {
  161.       $user->reset_code null;
  162.       $user->reset_code_date null;
  163.       $user->setPassword($password);
  164.       $dm->persist($user);
  165.       $dm->flush();
  166.     }
  167.   }
  168.   public static function CreateTranslations($mainValue$dm$translations)
  169.   {
  170.     if (count($translations)) {
  171.       $repository $dm->getRepository('\\Gedmo\\Translatable\\Document\\Translation');
  172.       foreach ($translations as $field => $value) {
  173.         foreach ($value as $lang => $val) {
  174.           $repository->translate($mainValue$field$lang$val);
  175.         }
  176.         $repository->translate($mainValue$field'en'$mainValue->{$field});
  177.       }
  178.       $dm->flush();
  179.     }
  180.   }
  181.   public static function FindAndUpdateModel($module$dm$serializer$ev)
  182.   {
  183.     $model Helpers::get_module($module);
  184.     $id $ev['id'];
  185.     unset($ev['id']);
  186.     $qb $dm->createQueryBuilder($model)
  187.       // Find the job
  188.       ->findAndUpdate()
  189.       ->field('id')->equals($id);
  190.     foreach ($ev as $k => $val) {
  191.       $qb $qb->field($k)->set($val);
  192.     }
  193.     $qb->getQuery()->execute();
  194.     return true;
  195.   }
  196.   public static function findModelBy($dm$module$vals)
  197.   {
  198.     $model Helpers::get_module($module);
  199.     return $dm->getRepository($model)->findOneBy($vals);
  200.   }
  201.   public static function CheckAddModel($dm$module$value$filters$serializer)
  202.   {
  203.     $model Helpers::get_module($module);
  204.     $db_value self::findModelBy($dm$module$filters);
  205.     $_id self::AddOrUpdate($model$dm$serializer, (array) $value$db_value);
  206.     return $db_value;
  207.   }
  208.   public static function UpdateModelWithValue($dm$value$model$val$serializer)
  209.   {
  210.     $db_value $serializer->deserialize(json_encode($value), $model'json', [...Variables::DESERIALZER_OPTIONSObjectNormalizer::DEEP_OBJECT_TO_POPULATE => true'object_to_populate' => clone $val'dm' => $dm'serializer' => $serializer'creating' => false]);
  211.     $dm->persist($db_value);
  212.     $dm->flush();
  213.     return $db_value;
  214.   }
  215.   public static function UpdateModel($dm$repo$model$value$vals$serializer)
  216.   {
  217.     $val $repo->findOneBy($vals);
  218.     if ($val) {
  219.       return self::UpdateModelWithValue($dm$value$model$val$serializer);
  220.     }
  221.     return null;
  222.   }
  223.   public static function checkUniq($collection$key$value$id$extra = [])
  224.   {
  225.     $trimmed trim(preg_replace('/\s+/'' '$value));
  226.     $val = new \MongoDB\BSON\Regex('^'.$trimmed.'$''i');
  227.     $exists $collection->findOneBy([$key => $val, ...$extra]);
  228.     if ($exists && $exists->id != $id) {
  229.       return "{$key} at {$value} is already Exist";
  230.     }
  231.   }
  232.   public static function FetchWithAggregation($dm$module$filters = [], $aggs = [], $props = [])
  233.   {
  234.     $model Helpers::get_module($module);
  235.     $cs Helpers::get_module_config($module);
  236.     $query $dm->createAggregationBuilder($model);
  237.     if ($props['hydrate'] ?? false) {
  238.       $query $query->hydrate($model);
  239.     }
  240.     $class = new $model();
  241.     $out Helpers::getModelFilter($cs->filters ?? []);
  242.     $query $query->match();
  243.     if (count($out) > 0) {
  244.       $query $query->addAnd($out);
  245.     }
  246.     $pre_filter $props['pre_filter'] ?? [];
  247.     foreach ($pre_filter as $agg => $val) {
  248.       $query AggregateFuns::{$val['agg'] ?? $agg}($queryarray_diff_key($val, ['agg' => null]));
  249.       $query $query->match();
  250.     }
  251.     if (count($filters) > 0) {
  252.       $query $query->addAnd($filters);
  253.     } else {
  254.       $query $query->addAnd(['id' => ['$exists' => true]]);
  255.     }
  256.     foreach ($aggs as $agg => $val) {
  257.       $query AggregateFuns::{$val['agg'] ?? $agg}($queryarray_diff_key($val, ['agg' => null]));
  258.     }
  259.     if ($props['agg'] ?? false) {
  260.       $m_aggs $cs->aggregation[$props['agg']] ?? [];
  261.       foreach ($m_aggs as $agg => $val) {
  262.         $query AggregateFuns::{$val['agg'] ?? $agg}($queryarray_diff_key($val, ['agg' => null]));
  263.       }
  264.     }
  265.     if ($props['limit'] ?? false) {
  266.       $query $query->limit($props['limit']);
  267.     }
  268.     return $query->execute();
  269.   }
  270.   public static function RemoveAC($x)
  271.   {
  272.     $x['updated_at'] = new \MongoDB\BSON\UTCDateTime();
  273.     if ('create' == $x['ac']) {
  274.       $x['created_at'] = $x['updated_at'];
  275.     }
  276.     unset($x['ac']);
  277.     unset($x['md']);
  278.     return $x;
  279.   }
  280.   public static function fetchWithKeys($dm$filters$keys$module 'collect__payment'$aggs = [], $props = [])
  281.   {
  282.     $data self::FetchWithAggregation($dm$module$filters$aggs$props);
  283.     return Main::multiKeys(['levels' => $keys], $data, []);
  284.   }
  285.   public static function fetchWithBuildIds($dm$filters$keys$module 'collect__payment'$aggs = [], $props = [])
  286.   {
  287.     $data self::FetchWithAggregation($dm$module$filters$aggs$props);
  288.     return Main::buildIdKeys(['levels' => $keys], $data, []);
  289.   }
  290.   public static function bulkDataInsert($dm$data$serializer null$params = [])
  291.   {
  292.     $total array_sum(array_map(fn ($x) => count($x), $data));
  293.     $count $params['count'] ?? 2000;
  294.     if ($params['updateProgress'] ?? false) {
  295.       $params['updateProgress'](['progress' => 1'status' => 'start processing']);
  296.     }
  297.     $inserted 0;
  298.     foreach ($data as $module => $mds) {
  299.       $model Helpers::get_module($module);
  300.       $updated array_map([self::class, 'RemoveAC'], array_filter($mds, fn ($x) => 'update' == $x['ac'] || 'create' == $x['ac']));
  301.       if ($params['updateProgress'] ?? false) {
  302.         $params['updateProgress'](['status' => "update $module"]);
  303.       }
  304.       $update_count count($updated);
  305.       if ($update_count 0) {
  306.         $collection $dm->getDocumentCollection($model);
  307.         $updates array_chunk($updated$count);
  308.         foreach ($updates as $update) {
  309.           $end count($update);
  310.           $d_updates array_map(function ($x) {
  311.             return [
  312.               'updateOne' => [
  313.                 ['_id' => $x['_id']],
  314.                 ['$set' => $x],
  315.                 ['upsert' => true],
  316.               ],
  317.             ];
  318.           }, $update);
  319.           $collection->bulkWrite($d_updates);
  320.           $inserted += $end;
  321.           if ($params['updateProgress'] ?? false) {
  322.             $params['updateProgress'](['progress' => $inserted $total 100]);
  323.           }
  324.         }
  325.         if ($params['updateProgress'] ?? false) {
  326.           $params['updateProgress'](['progress' => $inserted $total 100]);
  327.         }
  328.       }
  329.       $updatedMany array_map([self::class, 'RemoveAC'], array_filter($mds, fn ($x) => 'update_many' == $x['ac']));
  330.       $update_count count($updatedMany);
  331.       if ($update_count 0) {
  332.         $collection $dm->getDocumentCollection($model);
  333.         $updatesMany array_chunk($updatedMany$count);
  334.         foreach ($updatesMany as $updateMany) {
  335.           $end count($updateMany);
  336.           $d_updates array_map(function ($x) {
  337.             $op $x['op'] ?? '$set';
  338.             return [
  339.               'updateMany' => [
  340.                 $x['filter'],
  341.                 [[$op => $x['update']]],
  342.               ],
  343.             ];
  344.           }, $updateMany);
  345.           $res $collection->bulkWrite($d_updates);
  346.           $inserted += $end;
  347.           if ($params['updateProgress'] ?? false) {
  348.             $params['updateProgress'](['progress' => $inserted $total 100]);
  349.           }
  350.         }
  351.         if ($params['updateProgress'] ?? false) {
  352.           $params['updateProgress'](['progress' => $inserted $total 100]);
  353.         }
  354.       }
  355.     }
  356.   }
  357.   public static function updateOne($dm$module$setting)
  358.   {
  359.     ['where' => $where'update' => $update] = $setting;
  360.     $model Helpers::get_module($module);
  361.     $collection $dm->getDocumentCollection($model);
  362.     $collection->updateOne(
  363.       $where,
  364.       $update,
  365.       ['upsert' => true]
  366.     );
  367.   }
  368.   public static function updateMany($dm$module$setting)
  369.   {
  370.     ['where' => $where'update' => $update] = $setting;
  371.     $model Helpers::get_module($module);
  372.     $collection $dm->getDocumentCollection($model);
  373.     $res $collection->updateMany(
  374.       $where,
  375.       $update
  376.     );
  377.     return ['matched'=>$res->getMatchedCount(), 'modified'=>$res->getModifiedCount()];
  378.   }
  379.   public static function getOneBy($dm$model$where)
  380.   {
  381.     $md Helpers::get_module($model);
  382.     return $dm->getRepository($md)->findOneBy($where);
  383.   }
  384.   public static function getList($dm$model$where)
  385.   {
  386.     $md Helpers::get_module($model);
  387.     return $dm->getRepository($md)->findBy($where);
  388.   }
  389.   public static function AddArray($dm$serializer$model$arr)
  390.   {
  391.     $values $serializer->deserialize(json_encode($arr), $model.'[]''json');
  392.     $ids = [];
  393.     foreach ($values as $key => $value) {
  394.       // code...
  395.       $dm->persist($value);
  396.       $dm->flush();
  397.       $ids[$key] = $value->getId();
  398.     }
  399.     return $dm->getRepository($model)->findBy(['id' => ['$in' => $ids]]);
  400.   }
  401.   public static function ModelCount($dm$module$where)
  402.   {
  403.     $m_model strtolower($module);
  404.     $model Helpers::get_module($m_model);
  405.     if ($model) {
  406.       $qb $dm->createQueryBuilder($model);
  407.       if ($where) {
  408.         $qb $qb->addAnd($where);
  409.       }
  410.       return $qb->getQuery()->execute()->count();
  411.     }
  412.   }
  413.   public static function MultiDeleteModule($dm$module$where)
  414.   {
  415.     $m_model strtolower($module);
  416.     $model Helpers::get_module($m_model);
  417.     if ($model) {
  418.       $qb $dm->createQueryBuilder($model);
  419.       $qb $qb->remove();
  420.       if ($where) {
  421.         $qb $qb->addAnd($where);
  422.       }
  423.       $qb->getQuery()->execute();
  424.       $dm->clear();
  425.       return true;
  426.     }
  427.   }
  428. }