src/DataProvider/ReadFiles.php line 344
<?php
// api/src/DataProvider/BlogPostCollectionDataProvider.php
namespace App\DataProvider;
use App\Common\Functions\DbFunction;
use App\Common\Functions\Filters\Helper;
use App\Common\Functions\PPTFunction;
use App\Common\Functions\Upload;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use App\Common\Functions\Helpers;
use PhpOffice\PhpSpreadsheet\IOFactory;
use App\Document\Apps\Sheets;
use App\Functions\Common\Variables;
use Doctrine\ODM\MongoDB\DocumentManager;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Finder\Finder;
// use NcJoes\OfficeConverter\OfficeConverter;
// use App\Common\Functions\CircularHandler;
class ReadFiles extends AbstractController
{
/** string $rootPath */
public $rootPath;
protected $headers = Variables::JSON_RESPONSE_HEADER;
private $ppts = ["pptx"=>"PowerPoint2007", "ppt"=>"PowerPoint97", "odb"=>"ODPresentation"];
private $dm;
private $serializer;
private $options = Variables::SERIALIZER_OPTIONS;
private $options_de = Variables::DESERIALZER_OPTIONS;
public function __construct(string $rootPath, DocumentManager $dm, SerializerInterface $serializer)
{
$this->dm = $dm;
$this->rootPath = $rootPath;
$this->serializer = $serializer;
}
public function readExcel(Request $request)
{
# code...
$dm = $this->dm;
$file = $request->files->get('file');
$params = $request->get('params');
$val = (object) [];
$headers = $request->headers->all();
$app = $headers['app'] ?? [];
$tz = $headers['tz'] ?? [];
$app = $app[0] ?? 'default';
$h_params = (object) ['app' => $app, 'tz' => $tz];
$path = Upload::UploadFile($file, $val, $this->rootPath);
$spreadsheet = IOFactory::load($path);
$sheetCount = $spreadsheet->getSheetCount();
$out = [];
$ids = [];
$id = $request->get('id');
$sheets = $dm->getRepository(Sheets::class)->findBy(["file"=>$id]);
foreach ($sheets as $key => $sh) {
# code...
$sheet = $spreadsheet->getSheetByName($sh->name);
$values = $sheet->toArray(null, true, true, true);
$l_data = [];
$headings = array_map(fn($x)=>rtrim(strtolower($x)), array_shift($values));
// dd($headings);
$rep = [];
foreach (($sh->mapping ?? []) as $key => $map) {
$val = array_search($map, $headings);
if($val !== false){
// dd($map, $key, $val);
$rep[$val] = $key;
}
}
$headings = array_replace($headings, $rep);
// dd($headings);
foreach(($sh->links ?? []) as $key => $l){
$link = (object) $l;
// dd($link);
$md = Helpers::get_module($link->model);
$q = $dm->getRepository($md)->findAll();
$query = [];
// dd($q, array_keys($link->query), $link->model, $l_data);
$l_data[$link->model] = Helper::applyFilters([
"key"=>"keys",
"levels"=>array_keys($link->query),
], $q);
}
array_walk(
$values,
function (&$row) use ($headings, $sh, $dm, $l_data, $params) {
$row = array_combine($headings, $row);
$row = array_merge($row, $params ?? []);
// dd($row);
foreach(($sh->links ?? []) as $key => $l){
$link = (object) $l;
// dd($link);
$query = [];
$temp = $l_data[$link->model];
$skip = false;
foreach ($link->query as $k => $q) {
# code...
$val = $row[$q] ?? '';
$val = str_replace("\u{00a0}", ' ', $val);
$val = trim($val);
if(!$val){
$skip = true;
}
$temp = $temp[$val] ?? [];
}
$val = $temp->id ?? null;
// dd($row, $val, $l_data[$link->model]);
if($val && !$skip){
$row[$key] = $val;
}else{
if($row[$key] ?? false){
unset($row[$key]);
}
}
$maps = $sh->vals ?? [];
foreach ($maps as $key => $map) {
# code...
// dd($row);
if($map["key"]){
$row[$key] = Helper::applyFilters($map, $row);
}
}
// dd($row);
}
}
);
// $out[$sh->model] = $temp;
$model = Helpers::get_module($sh->model);
$map_data = Helpers::getFun($model, 'MapData');
$pre_save = Helpers::getFun($model, 'PreSave');
if(count($values) < 500){
$mainIds = array_filter(array_map(fn($x)=>$x[$sh->ident] ?? null, $values), fn($d)=>!is_null($d));
$q = $dm->getRepository($model)->findBy([$sh->ident=>['$in'=>$mainIds]]);
}else{
$q = $dm->getRepository($model)->findAll();
// dd($q);
}
$db_datas = Helper::applyFilters([
"key"=>"keys",
"levels"=>[$sh->ident]
], $q);
$e_ids = [];
$i=0;
// dd($db_datas);
foreach ($values as $v => $ev) {
# code...
// $ev = array_merge($ev, $params ?? []);
$id = $ev[$sh->ident] ?? null;
// dd((bool)($db_datas[$id] ?? false), $db_datas);
if (($db_datas[$id] ?? false)) {
// try{
$saves = $this->serializer->deserialize(json_encode($ev), $model, 'json', ['object_to_populate' => clone $db_datas[$id], ObjectNormalizer::DEEP_OBJECT_TO_POPULATE=> true, ObjectNormalizer::DISABLE_TYPE_ENFORCEMENT=>true, 'multi'=>true]);
// dd($ev, $saves);
// }catch(\Exception){
// dd($ev, $db_datas[$id]);
// }
// dd($saves);
$dm->persist($saves);
// $dm->flush();
if($pre_save){
$pre_save->invoke((object)[], $dm, $saves, $this->serializer, $db_datas[$id], $this, $h_params);
}
array_push($e_ids, $saves->getId());
continue;
}
$value = $this->serializer->deserialize(json_encode($ev), $model, 'json', $this->options_de);
$dm->persist($value);
// $dm->flush();
if($pre_save){
$pre_save->invoke((object)[], $dm, $value, $this->serializer, (object) [], $this, $h_params);
}
array_push($e_ids, $value->getId());
}
// dd($db_datas);
$ids[$sh->model] = $e_ids;
}
$dm->flush();
// dd($ids);
// dd('here');
foreach ($ids as $key => $value) {
$model = Helpers::get_module($key);
$post_save = Helpers::getFun($model, 'PostSave');
$dm->clear();
$out[$key] = $dm->getRepository($model)->findBy(["id"=>['$in'=>$ids[$key] ?? []]]);
if($post_save){
call_user_func($post_save."::{$key}", $dm, $out[$key], $this->serializer);
}
}
$res = $this->serializer->serialize($out, 'json', $this->options);
return new Response($res, Response::HTTP_CREATED, $this->headers);
}
public function readMultiSheets(Request $request)
{
# code...
$dm = $this->dm;
$file = $request->files->get('file');
$val = (object) [];
$path = Upload::UploadFile($file, $val, $this->rootPath);
$spreadsheet = IOFactory::load($path);
$names = $spreadsheet->getSheetNames();
$headers = $request->headers->all();
$app = $headers['app'] ?? [];
$tz = $headers['tz'] ?? [];
$app = $app[0] ?? 'default';
$h_params = (object) ['app' => $app, 'tz' => $tz];
$out = [];
$id = $request->get('id');
$sh = $dm->getRepository(Sheets::class)->findOneBy(["file"=>$id]);
foreach ($names as $key => $shName) {
# code...
$sheet = $spreadsheet->getSheetByName($shName);
$values = $sheet->toArray(null, true, true, true);
$l_data = [];
foreach($sh->links as $key => $l){
$link = (object) $l;
// dd($link);
$md = Helpers::get_module($link->model);
$q = $dm->getRepository($md)->findAll();
$query = [];
$l_data[$link->model] = Helper::applyFilters([
"key"=>"keys",
"levels"=>array_keys($link->query),
], $q);
}
$headings = array_shift($values);
array_walk(
$values,
function (&$row) use ($headings, $sh, $dm, $l_data) {
$row = array_combine($headings, $row);
foreach($sh->links as $key => $l){
$link = (object) $l;
// dd($link);
$query = [];
$temp = $l_data[$link->model];
$skip = false;
foreach ($link->query as $k => $q) {
# code...
// dd($q, $temp);
$val = $row[$q] ?? null;
if(!$val){
$skip = true;
}
$temp = $temp[$val] ?? [];
}
$val = $temp->id ?? null;
// dd($row, $val, $l_data[$link->model]);
if($val && !$skip){
$row[$key] = $val;
}else{
if($row[$key] ?? false){
unset($row[$key]);
}
}
}
}
);
// $out[$sh->model] = $temp;
// dd($sh);
$model = Helpers::get_module($sh->model);
// $map_data = Helpers::getFun($model, 'MapData');
$pre_save = Helpers::getFun($model, 'PreSave');
if(count($values) < 500){
$mainIds = array_filter(array_map(fn($x)=>$x[$sh->ident] ?? null, $values), fn($d)=>!is_null($d));
$q = $dm->getRepository($model)->findBy([$sh->ident=>['$in'=>$mainIds]]);
}else{
$q = $dm->getRepository($model)->findAll();
// dd($q);
}
$db_datas = Helper::applyFilters([
"key"=>"keys",
"levels"=>[$sh->ident]
], $q);
$e_ids = [];
$i=0;
// dd($db_datas);
foreach ($values as $v => $ev) {
# code...
$id = $ev[$sh->ident] ?? null;
// dd((bool)($db_datas[$id] ?? false), $db_datas);
if (($db_datas[$id] ?? false)) {
// try{
$saves = $this->serializer->deserialize(json_encode($ev), $model, 'json', ['object_to_populate' => $db_datas[$id], ObjectNormalizer::DEEP_OBJECT_TO_POPULATE=> true, ObjectNormalizer::DISABLE_TYPE_ENFORCEMENT=>true, 'multi'=>true]);
// }catch(\Exception){
// dd($ev, $db_datas[$id]);
// }
// dd($saves);
$dm->persist($saves);
// $dm->flush();
if($pre_save){
$pre_save->invoke((object)[], $dm, $saves, $this->serializer, $this, $h_params);
}
array_push($e_ids, $saves->getId());
continue;
}
$value = $this->serializer->deserialize(json_encode($ev), $model, 'json', $this->options_de);
$dm->persist($value);
// $dm->flush();
if($pre_save){
$pre_save->invoke((object)[], $dm, $value, $this->serializer, $this, $h_params);
}
array_push($e_ids, $value->getId());
}
// dd($db_datas);
$ids[$sh->model] = $e_ids;
}
$dm->flush();
// dd($ids);
// dd('here');
foreach ($ids as $key => $value) {
$model = Helpers::get_module($key);
$post_save = Helpers::getFun($model, 'PostSave');
$out[$key] = $dm->getRepository($model)->findBy(["id"=>['$in'=>$ids[$key] ?? []]]);
if($post_save){
call_user_func($post_save."::{$key}", $dm, $out[$key], $this->serializer);
}
}
$res = $this->serializer->serialize($out, 'json', $this->options);
return new Response($res, Response::HTTP_CREATED, $this->headers);
}
public function readFile(string $id, Request $request){
$model = Helpers::get_module('files__file');
$dm = $this->dm;
$fs = $dm->getRepository($model)->findOneBy(["id"=>$id]);
if(!$fs){
throw new NotFoundHttpException("file not found");
}
$file = $this->rootPath.$fs->path;
return new BinaryFileResponse($file, 200);
}
public function readFileObject(string $id, Request $request){
$fs = DbFunction::findModelBy($this->dm, 'files__file', ["id"=>$id]);
if(!$fs){
throw new NotFoundHttpException("file not found");
}
$out = Upload::ReadFileS3([], $fs);
$headers = [
'Content-Type' => Helpers::ReadMime([], $fs),
];
return new Response($out, 200, $headers);
}
public function readFilePath(string $id, string $path, Request $request){
$file = join(DIRECTORY_SEPARATOR, [$this->rootPath, 'storage', 'files__file', $id, $path.'.jpg']);
// dd('file is here');
return new BinaryFileResponse($file, 200);
}
public function readPPTImages(string $id, Request $request){
$model = Helpers::get_module('files__file');
$dm = $this->dm;
$fs = $dm->getRepository($model)->findOneBy(["id"=>$id]);
if(!$fs){
throw new NotFoundHttpException("file not found");
}
$out = PPTFunction::ReadPPTIMages($fs, $this->rootPath);
$res = [];
$i=0;
$finder = new Finder();
// find all files in the current directory
$finder->files()->in($out);
foreach($finder as $file){
// dd(join('/', [$fs->id, $file->getFilenameWithoutExtension()]));
// dd($file->getFilenameWithoutExtension());
$res[$i] = join('/', [$fs->id, $file->getFilenameWithoutExtension()]);
$i++;
}
// dd('success');
// $ppt_ext = $this->ppts[$ext] ?? false;
// if(!$ppt_ext){
// throw new NotFoundHttpException("file not ppt");
// }
// $pptReader = PPTIOFactory::createReader($ppt_ext);
// $presentation = $pptReader->load($filename);
sort($res);
return new JsonResponse($res);
}
}