Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
chamilo-lms/src/CoreBundle/Repository/ResourceNodeRepository.php

109 lines
3.5 KiB

<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CoreBundle\Repository;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Resource\ResourceFile;
use Chamilo\CoreBundle\Entity\Resource\ResourceLink;
use Chamilo\CoreBundle\Entity\Resource\ResourceNode;
use Chamilo\CoreBundle\Entity\Resource\ResourceType;
use Chamilo\CoreBundle\Entity\Session;
use Doctrine\ORM\EntityManagerInterface;
use Gedmo\Tree\Entity\Repository\MaterializedPathRepository;
use League\Flysystem\MountManager;
use Symfony\Component\Filesystem\Exception\FileNotFoundException;
use Vich\UploaderBundle\Storage\FlysystemStorage;
/**
* Class ResourceNodeRepository.
*/
class ResourceNodeRepository extends MaterializedPathRepository
{
protected $mountManager;
protected $storage;
public function __construct(EntityManagerInterface $manager, FlysystemStorage $storage, MountManager $mountManager)
{
parent::__construct($manager, $manager->getClassMetadata(ResourceNode::class));
$this->storage = $storage;
$this->mountManager = $mountManager;
}
public function getFilename(ResourceFile $resourceFile)
{
return $this->storage->resolveUri($resourceFile);
}
/**
* @return \League\Flysystem\FilesystemInterface
*/
public function getFileSystem()
{
// Flysystem mount name is saved in config/packages/oneup_flysystem.yaml @todo add it as a service.
$this->fs = $this->mountManager->getFilesystem('resources_fs');
return $this->fs;
}
public function getResourceNodeFileContent(ResourceNode $resourceNode): string
{
try {
if ($resourceNode->hasResourceFile()) {
$resourceFile = $resourceNode->getResourceFile();
$fileName = $this->getFilename($resourceFile);
return $this->getFileSystem()->read($fileName);
}
return '';
} catch (\Throwable $exception) {
throw new FileNotFoundException($resourceNode);
}
}
public function getResourceNodeFileStream(ResourceNode $resourceNode)
{
try {
if ($resourceNode->hasResourceFile()) {
$resourceFile = $resourceNode->getResourceFile();
$fileName = $this->getFilename($resourceFile);
return $this->getFileSystem()->readStream($fileName);
}
return '';
} catch (\Throwable $exception) {
throw new FileNotFoundException($resourceNode);
}
}
/**
* @todo filter files, check status
*/
public function getSize(ResourceNode $resourceNode, ResourceType $type, Course $course = null, Session $session = null): int
{
$qb = $this->createQueryBuilder('node')
->select('SUM(file.size) as total')
->innerJoin('node.resourceFile', 'file')
->innerJoin('node.resourceLinks', 'l')
->where('node.resourceType = :type')
->setParameter('type', $type)
->andWhere('node.parent = :parentNode')
->setParameter('parentNode', $resourceNode)
->andWhere('file IS NOT NULL')
->andWhere('l.visibility <> :visibility')
->setParameter('visibility', ResourceLink::VISIBILITY_DELETED)
;
if ($course) {
$qb
->andWhere('l.course = :course')
->setParameter('course', $course);
}
6 years ago
return (int) $qb->getQuery()->getSingleScalarResult();
}
}