parent
f4b2e176c6
commit
d3d7f5787a
@ -0,0 +1,162 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
namespace Chamilo\CoreBundle\Controller\Api; |
||||
|
||||
use Chamilo\CoreBundle\Entity\AbstractResource; |
||||
use Chamilo\CoreBundle\Entity\ResourceLink; |
||||
use Chamilo\CourseBundle\Entity\CDocument; |
||||
use InvalidArgumentException; |
||||
use Symfony\Component\HttpFoundation\File\UploadedFile; |
||||
use Symfony\Component\HttpFoundation\Request; |
||||
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; |
||||
|
||||
class BaseResourceFileAction |
||||
{ |
||||
protected function handleCreateRequest(AbstractResource $resource, Request $request) |
||||
{ |
||||
error_log('handleCreateRequest'); |
||||
$contentData = $request->getContent(); |
||||
if (!empty($contentData)) { |
||||
$contentData = json_decode($contentData, true); |
||||
var_dump($contentData); |
||||
$title = $contentData['title']; |
||||
$comment = $contentData['comment']; |
||||
} else { |
||||
$title = $request->get('title'); |
||||
$comment = $request->get('comment'); |
||||
} |
||||
|
||||
$fileType = 'folder'; |
||||
if ($request->request->has('filetype')) { |
||||
$fileType = $request->get('filetype'); |
||||
} |
||||
|
||||
if (empty($fileType)) { |
||||
throw new \Exception('filetype needed: folder or file'); |
||||
} |
||||
|
||||
$nodeId = (int) $request->get('parentResourceNodeId'); |
||||
|
||||
if (0 === $nodeId) { |
||||
throw new \Exception('parentResourceNodeId int value needed'); |
||||
} |
||||
|
||||
$resource->setParentResourceNode($nodeId); |
||||
|
||||
switch ($fileType) { |
||||
case 'file': |
||||
$content = ''; |
||||
if ($request->request->has('contentFile')) { |
||||
$content = $request->request->get('contentFile'); |
||||
} |
||||
$fileParsed = false; |
||||
// File upload. |
||||
if ($request->files->count() > 0) { |
||||
if (!$request->files->has('uploadFile')) { |
||||
throw new BadRequestHttpException('"uploadFile" is required'); |
||||
} |
||||
|
||||
/** @var UploadedFile $uploadedFile */ |
||||
$uploadedFile = $request->files->get('uploadFile'); |
||||
$title = $uploadedFile->getClientOriginalName(); |
||||
$resource->setUploadFile($uploadedFile); |
||||
$fileParsed = true; |
||||
} |
||||
|
||||
// Get data in content and create a HTML file. |
||||
if (!$fileParsed && $content) { |
||||
$handle = tmpfile(); |
||||
fwrite($handle, $content); |
||||
$meta = stream_get_meta_data($handle); |
||||
$file = new UploadedFile($meta['uri'], $title.'.html', 'text/html', null, true); |
||||
$resource->setUploadFile($file); |
||||
$fileParsed = true; |
||||
} |
||||
|
||||
if (!$fileParsed) { |
||||
throw new InvalidArgumentException('filetype was set to "file" but not upload found'); |
||||
} |
||||
|
||||
break; |
||||
case 'folder': |
||||
break; |
||||
} |
||||
|
||||
if (empty($title)) { |
||||
throw new InvalidArgumentException('title required'); |
||||
} |
||||
|
||||
$resource->setResourceName($title); |
||||
} |
||||
|
||||
protected function handleUpdateRequest(AbstractResource $resource, $repo, Request $request) |
||||
{ |
||||
error_log('handleUpdateRequest'); |
||||
$contentData = $request->getContent(); |
||||
$resourceLinkList = []; |
||||
if (!empty($contentData)) { |
||||
error_log('contentData'); |
||||
$contentData = json_decode($contentData, true); |
||||
$title = $contentData['title']; |
||||
$content = $contentData['contentFile']; |
||||
//$comment = $contentData['comment'] ?? ''; |
||||
$resourceLinkList = $contentData['resourceLinkListFromEntity'] ?? []; |
||||
} else { |
||||
$title = $request->get('title'); |
||||
$content = $request->request->get('contentFile'); |
||||
//$comment = $request->request->get('comment'); |
||||
} |
||||
|
||||
$repo->setResourceName($resource, $title); |
||||
|
||||
$hasFile = $resource->getResourceNode()->hasResourceFile(); |
||||
|
||||
//if ('file' === $fileType && !empty($content)) { |
||||
if ($hasFile && !empty($content)) { |
||||
$resourceNode = $resource->getResourceNode(); |
||||
if ($resourceNode->hasResourceFile()) { |
||||
$resourceNode->setContent($content); |
||||
$resourceNode->getResourceFile()->setSize(\strlen($content)); |
||||
} |
||||
$resourceNode->setUpdatedAt(new DateTime()); |
||||
$resourceNode->getResourceFile()->setUpdatedAt(new DateTime()); |
||||
$resource->setResourceNode($resourceNode); |
||||
} |
||||
|
||||
$link = null; |
||||
if (!empty($resourceLinkList)) { |
||||
foreach ($resourceLinkList as $linkArray) { |
||||
// Find the exact link. |
||||
$linkId = $linkArray['id']; |
||||
/** @var ResourceLink $link */ |
||||
$link = $resource->getResourceNode()->getResourceLinks() |
||||
->filter( |
||||
fn ($link) => $link->getId() === $linkId |
||||
)->first(); |
||||
|
||||
if (null !== $link) { |
||||
$link->setVisibility((int) $linkArray['visibility']); |
||||
|
||||
break; |
||||
} |
||||
} |
||||
} |
||||
|
||||
//$isRecursive = 'folder' === $fileType; |
||||
$isRecursive = !$hasFile; |
||||
// If it's a folder then change the visibility to the children (That have the same link). |
||||
if ($isRecursive && null !== $link) { |
||||
$repo->copyVisibilityToChildren($resource->getResourceNode(), $link); |
||||
} |
||||
|
||||
//$document->setComment($comment); |
||||
|
||||
error_log('Finish update resource node file action'); |
||||
|
||||
return $resource; |
||||
} |
||||
} |
@ -0,0 +1,40 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
namespace Chamilo\CoreBundle\Controller\Api; |
||||
|
||||
use Chamilo\CourseBundle\Entity\CDocument; |
||||
use InvalidArgumentException; |
||||
use Symfony\Component\HttpFoundation\Request; |
||||
|
||||
class CreateDocumentFileAction extends BaseResourceFileAction |
||||
{ |
||||
public function __invoke(Request $request): CDocument |
||||
{ |
||||
error_log('CreateResourceNodeFileAction __invoke'); |
||||
|
||||
$document = new CDocument(); |
||||
$this->handleCreateRequest($document, $request); |
||||
if ($request->request->has('filetype')) { |
||||
$document->setFiletype($request->get('filetype')); |
||||
} |
||||
|
||||
if ($request->request->has('resourceLinkList')) { |
||||
$links = $request->get('resourceLinkList'); |
||||
$links = false === strpos($links, '[') ? json_decode('['.$links.']', true) : json_decode($links, true); |
||||
if (empty($links)) { |
||||
$message = 'resourceLinkList is not a valid json. Use for example: [{"c_id":1, "visibility":1}]'; |
||||
|
||||
throw new InvalidArgumentException($message); |
||||
} |
||||
$document->setResourceLinkArray($links); |
||||
} |
||||
|
||||
//$document->setComment($comment); |
||||
|
||||
return $document; |
||||
} |
||||
} |
@ -1,100 +0,0 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
namespace Chamilo\CoreBundle\Controller\Api; |
||||
|
||||
use Chamilo\CourseBundle\Entity\CDocument; |
||||
use InvalidArgumentException; |
||||
use Symfony\Component\HttpFoundation\File\UploadedFile; |
||||
use Symfony\Component\HttpFoundation\Request; |
||||
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; |
||||
|
||||
class CreateResourceNodeFileAction |
||||
{ |
||||
public function __invoke(Request $request): CDocument |
||||
{ |
||||
error_log('CreateResourceNodeFileAction __invoke'); |
||||
|
||||
$contentData = $request->getContent(); |
||||
if (!empty($contentData)) { |
||||
$contentData = json_decode($contentData, true); |
||||
//error_log(print_r($contentData, 1)); |
||||
$title = $contentData['title']; |
||||
$comment = $contentData['comment']; |
||||
} else { |
||||
$title = $request->get('title'); |
||||
$comment = $request->get('comment'); |
||||
} |
||||
|
||||
$document = new CDocument(); |
||||
if ($request->request->has('filetype')) { |
||||
$document->setFiletype($request->get('filetype')); |
||||
} |
||||
|
||||
$nodeId = (int) $request->get('parentResourceNodeId'); |
||||
$document->setParentResourceNode($nodeId); |
||||
|
||||
switch ($document->getFiletype()) { |
||||
case 'file': |
||||
$content = ''; |
||||
if ($request->request->has('contentFile')) { |
||||
$content = $request->request->get('contentFile'); |
||||
} |
||||
$fileParsed = false; |
||||
// File upload. |
||||
if ($request->files->count() > 0) { |
||||
if (!$request->files->has('uploadFile')) { |
||||
throw new BadRequestHttpException('"uploadFile" is required'); |
||||
} |
||||
|
||||
/** @var UploadedFile $uploadedFile */ |
||||
$uploadedFile = $request->files->get('uploadFile'); |
||||
$title = $uploadedFile->getClientOriginalName(); |
||||
$document->setUploadFile($uploadedFile); |
||||
$fileParsed = true; |
||||
} |
||||
|
||||
// Get data in content and create a HTML file. |
||||
if (!$fileParsed && $content) { |
||||
$handle = tmpfile(); |
||||
fwrite($handle, $content); |
||||
$meta = stream_get_meta_data($handle); |
||||
$file = new UploadedFile($meta['uri'], $title.'.html', 'text/html', null, true); |
||||
$document->setUploadFile($file); |
||||
$fileParsed = true; |
||||
} |
||||
|
||||
if (!$fileParsed) { |
||||
throw new InvalidArgumentException('filetype was set to "file" but not upload found'); |
||||
} |
||||
|
||||
break; |
||||
case 'folder': |
||||
break; |
||||
} |
||||
|
||||
if (empty($title)) { |
||||
throw new InvalidArgumentException('title required'); |
||||
} |
||||
|
||||
$document->setTitle($title); |
||||
|
||||
if ($request->request->has('resourceLinkList')) { |
||||
$links = $request->get('resourceLinkList'); |
||||
$links = false === strpos($links, '[') ? json_decode('['.$links.']', true) : json_decode($links, true); |
||||
if (empty($links)) { |
||||
$message = 'resourceLinkList is not a valid json. Use for example: [{"c_id":1, "visibility":1}]'; |
||||
|
||||
throw new InvalidArgumentException($message); |
||||
} |
||||
$document->setResourceLinkArray($links); |
||||
} |
||||
|
||||
$document->setComment($comment); |
||||
|
||||
return $document; |
||||
} |
||||
} |
@ -0,0 +1,29 @@ |
||||
<?php |
||||
|
||||
declare(strict_types=1); |
||||
|
||||
/* For licensing terms, see /license.txt */ |
||||
|
||||
namespace Chamilo\CoreBundle\Controller\Api; |
||||
|
||||
use Chamilo\CoreBundle\Entity\ResourceLink; |
||||
use Chamilo\CourseBundle\Entity\CDocument; |
||||
use Chamilo\CourseBundle\Repository\CDocumentRepository; |
||||
use DateTime; |
||||
use Symfony\Component\HttpFoundation\Request; |
||||
|
||||
class UpdateDocumentFileAction extends BaseResourceFileAction |
||||
{ |
||||
public function __invoke(CDocument $document, Request $request, CDocumentRepository $repo): CDocument |
||||
{ |
||||
error_log('UpdateDocumentFileAction __invoke'); |
||||
|
||||
$this->handleUpdateRequest($document, $repo, $request); |
||||
|
||||
//$document->setComment($comment); |
||||
|
||||
error_log('Finish update resource node file action'); |
||||
|
||||
return $document; |
||||
} |
||||
} |
Loading…
Reference in new issue