src/DataProvider/ReadFiles.php line 344

  1. <?php
  2. // api/src/DataProvider/BlogPostCollectionDataProvider.php
  3. namespace App\DataProvider;
  4. use App\Common\Functions\DbFunction;
  5. use App\Common\Functions\Filters\Helper;
  6. use App\Common\Functions\PPTFunction;
  7. use App\Common\Functions\Upload;
  8. use Symfony\Component\HttpFoundation\JsonResponse;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use App\Common\Functions\Helpers;
  13. use PhpOffice\PhpSpreadsheet\IOFactory;
  14. use App\Document\Apps\Sheets;
  15. use App\Functions\Common\Variables;
  16. use Doctrine\ODM\MongoDB\DocumentManager;
  17. use Symfony\Component\HttpFoundation\BinaryFileResponse;
  18. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  19. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  20. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  21. use Symfony\Component\Serializer\SerializerInterface;
  22. use Symfony\Component\Finder\Finder;
  23. // use NcJoes\OfficeConverter\OfficeConverter;
  24. // use App\Common\Functions\CircularHandler;
  25. class ReadFiles extends AbstractController
  26. {
  27.   /** string $rootPath */
  28.   public $rootPath;
  29.   protected $headers Variables::JSON_RESPONSE_HEADER;
  30.   private $ppts = ["pptx"=>"PowerPoint2007""ppt"=>"PowerPoint97""odb"=>"ODPresentation"];
  31.   private $dm;
  32.   private $serializer;
  33.   private $options Variables::SERIALIZER_OPTIONS;
  34.   private $options_de Variables::DESERIALZER_OPTIONS;
  35.   public function __construct(string $rootPathDocumentManager $dmSerializerInterface $serializer)
  36.   {
  37.     $this->dm $dm;
  38.     $this->rootPath $rootPath;
  39.     $this->serializer $serializer;
  40.   }
  41.   public function readExcel(Request $request)
  42.   {
  43.     # code...
  44.     $dm $this->dm;
  45.     $file $request->files->get('file');
  46.     $params $request->get('params');
  47.     $val = (object) [];
  48.     $headers $request->headers->all();
  49.     $app $headers['app'] ?? [];
  50.     $tz $headers['tz'] ?? [];
  51.     $app $app[0] ?? 'default';
  52.     $h_params = (object) ['app' => $app'tz' => $tz];
  53.     $path Upload::UploadFile($file$val$this->rootPath);
  54.     $spreadsheet IOFactory::load($path);
  55.     $sheetCount $spreadsheet->getSheetCount();
  56.     $out = [];
  57.     $ids = [];
  58.     $id $request->get('id');
  59.     $sheets $dm->getRepository(Sheets::class)->findBy(["file"=>$id]);
  60.     foreach ($sheets as $key => $sh) {
  61.       # code...
  62.       $sheet $spreadsheet->getSheetByName($sh->name);
  63.       $values $sheet->toArray(nulltruetruetrue);
  64.       $l_data = [];
  65.       $headings array_map(fn($x)=>rtrim(strtolower($x)), array_shift($values));
  66.       // dd($headings);
  67.       $rep = [];
  68.       foreach (($sh->mapping ?? []) as $key => $map) {
  69.         $val array_search($map$headings);
  70.         if($val !== false){
  71.           // dd($map, $key, $val);
  72.           $rep[$val] = $key;
  73.         }
  74.       }
  75.       $headings array_replace($headings$rep);
  76.       // dd($headings);
  77.       foreach(($sh->links ?? []) as $key => $l){
  78.         $link = (object) $l;
  79.         // dd($link);
  80.         $md Helpers::get_module($link->model);
  81.         $q $dm->getRepository($md)->findAll();
  82.         $query = [];
  83.         // dd($q, array_keys($link->query), $link->model, $l_data);
  84.         $l_data[$link->model] = Helper::applyFilters([
  85.           "key"=>"keys",
  86.           "levels"=>array_keys($link->query),
  87.         ], $q);
  88.       }
  89.         array_walk(
  90.             $values,
  91.             function (&$row) use ($headings$sh$dm$l_data$params) {
  92.               $row array_combine($headings$row);
  93.               $row array_merge($row$params ?? []);
  94.               // dd($row);
  95.               foreach(($sh->links ?? []) as $key => $l){
  96.                 $link = (object) $l;
  97.                 // dd($link);
  98.                 $query = [];
  99.                 $temp $l_data[$link->model];
  100.                 $skip false;
  101.                 foreach ($link->query as $k => $q) {
  102.                   # code...
  103.                   $val $row[$q] ?? '';
  104.                   $val str_replace("\u{00a0}"' '$val);
  105.                   $val trim($val);
  106.                   if(!$val){
  107.                     $skip true;
  108.                   }
  109.                   $temp $temp[$val] ?? [];
  110.                 }
  111.                 $val $temp->id ?? null;
  112.                 // dd($row, $val, $l_data[$link->model]);
  113.                 if($val && !$skip){
  114.                   $row[$key] = $val;
  115.                 }else{
  116.                   if($row[$key] ?? false){
  117.                     unset($row[$key]);
  118.                   }
  119.                 }
  120.                 $maps $sh->vals ?? [];
  121.                 foreach ($maps as $key => $map) {
  122.                   # code...
  123.                   // dd($row);
  124.                   if($map["key"]){
  125.                     $row[$key] = Helper::applyFilters($map$row);
  126.                   }
  127.                 }
  128.                 // dd($row);
  129.               }
  130.             }
  131.         );
  132.         // $out[$sh->model] = $temp;
  133.         $model Helpers::get_module($sh->model);
  134.         $map_data Helpers::getFun($model'MapData');
  135.         $pre_save Helpers::getFun($model'PreSave');
  136.         if(count($values) < 500){
  137.           $mainIds array_filter(array_map(fn($x)=>$x[$sh->ident] ?? null$values), fn($d)=>!is_null($d));
  138.           $q $dm->getRepository($model)->findBy([$sh->ident=>['$in'=>$mainIds]]);
  139.         }else{
  140.           $q $dm->getRepository($model)->findAll();
  141.           // dd($q);
  142.         }
  143.         $db_datas Helper::applyFilters([
  144.           "key"=>"keys",
  145.           "levels"=>[$sh->ident]
  146.         ], $q);
  147.         $e_ids = [];
  148.         $i=0;
  149.         // dd($db_datas);
  150.         foreach ($values as $v => $ev) {
  151.             # code...
  152.             // $ev = array_merge($ev, $params ?? []);
  153.             $id $ev[$sh->ident] ?? null;
  154.             // dd((bool)($db_datas[$id] ?? false), $db_datas);
  155.             if (($db_datas[$id] ?? false)) {
  156.               // try{
  157.                 $saves $this->serializer->deserialize(json_encode($ev), $model'json', ['object_to_populate' => clone $db_datas[$id], ObjectNormalizer::DEEP_OBJECT_TO_POPULATE=> trueObjectNormalizer::DISABLE_TYPE_ENFORCEMENT=>true'multi'=>true]);
  158.                 // dd($ev, $saves);
  159.               // }catch(\Exception){
  160.               //   dd($ev, $db_datas[$id]);
  161.               // }
  162.                 // dd($saves);
  163.                 $dm->persist($saves);
  164.                 // $dm->flush();
  165.                 if($pre_save){
  166.                   $pre_save->invoke((object)[], $dm$saves$this->serializer$db_datas[$id], $this$h_params);
  167.                 }
  168.                 array_push($e_ids$saves->getId());
  169.                 continue;
  170.             }
  171.             $value $this->serializer->deserialize(json_encode($ev), $model'json'$this->options_de);
  172.             $dm->persist($value);
  173.             // $dm->flush();
  174.             if($pre_save){
  175.               $pre_save->invoke((object)[], $dm$value$this->serializer, (object) [], $this$h_params);
  176.             }
  177.             array_push($e_ids$value->getId());
  178.         }
  179.         // dd($db_datas);
  180.         $ids[$sh->model] = $e_ids;
  181.       }
  182.       $dm->flush();
  183.     // dd($ids);
  184.     // dd('here');
  185.     foreach ($ids as $key => $value) {
  186.       $model Helpers::get_module($key);
  187.       $post_save Helpers::getFun($model'PostSave');
  188.       $dm->clear();
  189.       $out[$key] = $dm->getRepository($model)->findBy(["id"=>['$in'=>$ids[$key] ?? []]]);
  190.       if($post_save){
  191.         call_user_func($post_save."::{$key}"$dm$out[$key], $this->serializer);
  192.       }
  193.     }
  194.     $res $this->serializer->serialize($out'json'$this->options);
  195.     return new Response($resResponse::HTTP_CREATED$this->headers);
  196.   }
  197.   public function readMultiSheets(Request $request)
  198.   {
  199.     # code...
  200.     $dm $this->dm;
  201.     $file $request->files->get('file');
  202.     $val = (object) [];
  203.     $path Upload::UploadFile($file$val$this->rootPath);
  204.     $spreadsheet IOFactory::load($path);
  205.     $names $spreadsheet->getSheetNames();
  206.     $headers $request->headers->all();
  207.     $app $headers['app'] ?? [];
  208.     $tz $headers['tz'] ?? [];
  209.     $app $app[0] ?? 'default';
  210.     $h_params = (object) ['app' => $app'tz' => $tz];
  211.     $out = [];
  212.     $id $request->get('id');
  213.     $sh $dm->getRepository(Sheets::class)->findOneBy(["file"=>$id]);
  214.     foreach ($names as $key => $shName) {
  215.       # code...
  216.       $sheet $spreadsheet->getSheetByName($shName);
  217.       $values $sheet->toArray(nulltruetruetrue);
  218.       $l_data = [];
  219.       foreach($sh->links as $key => $l){
  220.         $link = (object) $l;
  221.         // dd($link);
  222.         $md Helpers::get_module($link->model);
  223.         $q $dm->getRepository($md)->findAll();
  224.         $query = [];
  225.         $l_data[$link->model] = Helper::applyFilters([
  226.           "key"=>"keys",
  227.           "levels"=>array_keys($link->query),
  228.         ], $q);
  229.       }
  230.       $headings array_shift($values);
  231.         array_walk(
  232.             $values,
  233.             function (&$row) use ($headings$sh$dm$l_data) {
  234.               $row array_combine($headings$row);
  235.               foreach($sh->links as $key => $l){
  236.                 $link = (object) $l;
  237.                 // dd($link);
  238.                 $query = [];
  239.                 $temp $l_data[$link->model];
  240.                 $skip false;
  241.                 foreach ($link->query as $k => $q) {
  242.                   # code...
  243.                   // dd($q, $temp);
  244.                   $val $row[$q] ?? null;
  245.                   if(!$val){
  246.                     $skip true;
  247.                   }
  248.                   $temp $temp[$val] ?? [];
  249.                 }
  250.                 $val $temp->id ?? null;
  251.                 // dd($row, $val, $l_data[$link->model]);
  252.                 if($val && !$skip){
  253.                   $row[$key] = $val;
  254.                 }else{
  255.                   if($row[$key] ?? false){
  256.                     unset($row[$key]);
  257.                   }
  258.                 }
  259.               }
  260.             }
  261.         );
  262.         // $out[$sh->model] = $temp;
  263.         // dd($sh);
  264.         $model Helpers::get_module($sh->model);
  265.         // $map_data = Helpers::getFun($model, 'MapData');
  266.         $pre_save Helpers::getFun($model'PreSave');
  267.         if(count($values) < 500){
  268.           $mainIds array_filter(array_map(fn($x)=>$x[$sh->ident] ?? null$values), fn($d)=>!is_null($d));
  269.           $q $dm->getRepository($model)->findBy([$sh->ident=>['$in'=>$mainIds]]);
  270.         }else{
  271.           $q $dm->getRepository($model)->findAll();
  272.           // dd($q);
  273.         }
  274.         $db_datas Helper::applyFilters([
  275.           "key"=>"keys",
  276.           "levels"=>[$sh->ident]
  277.         ], $q);
  278.         $e_ids = [];
  279.         $i=0;
  280.         // dd($db_datas);
  281.         foreach ($values as $v => $ev) {
  282.             # code...
  283.             $id $ev[$sh->ident] ?? null;
  284.             // dd((bool)($db_datas[$id] ?? false), $db_datas);
  285.             if (($db_datas[$id] ?? false)) {
  286.               // try{
  287.                 $saves $this->serializer->deserialize(json_encode($ev), $model'json', ['object_to_populate' => $db_datas[$id], ObjectNormalizer::DEEP_OBJECT_TO_POPULATE=> trueObjectNormalizer::DISABLE_TYPE_ENFORCEMENT=>true'multi'=>true]);
  288.               // }catch(\Exception){
  289.               //   dd($ev, $db_datas[$id]);
  290.               // }
  291.                 // dd($saves);
  292.                 $dm->persist($saves);
  293.                 // $dm->flush();
  294.                 if($pre_save){
  295.                   $pre_save->invoke((object)[], $dm$saves$this->serializer$this$h_params);
  296.                 }
  297.                 array_push($e_ids$saves->getId());
  298.                 continue;
  299.             }
  300.             $value $this->serializer->deserialize(json_encode($ev), $model'json'$this->options_de);
  301.             $dm->persist($value);
  302.             // $dm->flush();
  303.             if($pre_save){
  304.               $pre_save->invoke((object)[], $dm$value$this->serializer$this$h_params);
  305.             }
  306.             array_push($e_ids$value->getId());
  307.         }
  308.         // dd($db_datas);
  309.         $ids[$sh->model] = $e_ids;
  310.       }
  311.       $dm->flush();
  312.     // dd($ids);
  313.     // dd('here');
  314.     foreach ($ids as $key => $value) {
  315.       $model Helpers::get_module($key);
  316.       $post_save Helpers::getFun($model'PostSave');
  317.       $out[$key] = $dm->getRepository($model)->findBy(["id"=>['$in'=>$ids[$key] ?? []]]);
  318.       if($post_save){
  319.         call_user_func($post_save."::{$key}"$dm$out[$key], $this->serializer);
  320.       }
  321.     }
  322.     $res $this->serializer->serialize($out'json'$this->options);
  323.     return new Response($resResponse::HTTP_CREATED$this->headers);
  324.   }
  325.   public function readFile(string $idRequest $request){
  326.     $model Helpers::get_module('files__file');
  327.     $dm $this->dm;
  328.     $fs $dm->getRepository($model)->findOneBy(["id"=>$id]);
  329.     if(!$fs){
  330.       throw new NotFoundHttpException("file not found");
  331.     }
  332.     $file $this->rootPath.$fs->path;
  333.     return new BinaryFileResponse($file200);
  334.   }
  335.   public function readFileObject(string $idRequest $request){
  336.     $fs DbFunction::findModelBy($this->dm'files__file', ["id"=>$id]);
  337.     if(!$fs){
  338.       throw new NotFoundHttpException("file not found");
  339.     }
  340.     $out Upload::ReadFileS3([], $fs);
  341.     $headers = [
  342.       'Content-Type' => Helpers::ReadMime([], $fs),
  343.     ];
  344.     return new Response($out200$headers);
  345.   }
  346.   public function readFilePath(string $idstring $pathRequest $request){
  347.     $file join(DIRECTORY_SEPARATOR, [$this->rootPath'storage''files__file'$id$path.'.jpg']);
  348.     // dd('file is here');
  349.     return new BinaryFileResponse($file200);
  350.   }
  351.   public function readPPTImages(string $idRequest $request){
  352.     $model Helpers::get_module('files__file');
  353.     $dm $this->dm;
  354.     $fs $dm->getRepository($model)->findOneBy(["id"=>$id]);
  355.     if(!$fs){
  356.       throw new NotFoundHttpException("file not found");
  357.     }
  358.     $out PPTFunction::ReadPPTIMages($fs$this->rootPath);
  359.     $res = [];
  360.     $i=0;
  361.     $finder = new Finder();
  362.     // find all files in the current directory
  363.     $finder->files()->in($out);
  364.     foreach($finder as $file){
  365.       // dd(join('/', [$fs->id, $file->getFilenameWithoutExtension()]));
  366.       // dd($file->getFilenameWithoutExtension());
  367.       $res[$i] = join('/', [$fs->id$file->getFilenameWithoutExtension()]);
  368.       $i++;
  369.     }
  370.     // dd('success');
  371.     // $ppt_ext = $this->ppts[$ext] ?? false;
  372.     // if(!$ppt_ext){
  373.     //   throw new NotFoundHttpException("file not ppt");
  374.     // }
  375.     // $pptReader = PPTIOFactory::createReader($ppt_ext);
  376.     // $presentation =  $pptReader->load($filename);
  377.     sort($res);
  378.     return new JsonResponse($res);
  379.   }
  380. }