parent
24081381b1
commit
c34412ebff
@ -0,0 +1,87 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Migrations\Schema\V200; |
||||||
|
|
||||||
|
use Chamilo\CoreBundle\Entity\GradebookCertificate; |
||||||
|
use Chamilo\CoreBundle\Entity\PersonalFile; |
||||||
|
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo; |
||||||
|
use Doctrine\DBAL\Schema\Schema; |
||||||
|
use Symfony\Component\HttpFoundation\File\UploadedFile; |
||||||
|
|
||||||
|
final class Version20240128205500 extends AbstractMigrationChamilo |
||||||
|
{ |
||||||
|
public function getDescription(): string |
||||||
|
{ |
||||||
|
return 'Migrate certificate files of users to personal_files'; |
||||||
|
} |
||||||
|
|
||||||
|
public function up(Schema $schema): void |
||||||
|
{ |
||||||
|
$container = $this->getContainer(); |
||||||
|
$em = $this->getEntityManager(); |
||||||
|
|
||||||
|
$kernel = $container->get('kernel'); |
||||||
|
$rootPath = $kernel->getProjectDir(); |
||||||
|
|
||||||
|
$q = $em->createQuery('SELECT u FROM Chamilo\CoreBundle\Entity\User u'); |
||||||
|
|
||||||
|
foreach ($q->toIterable() as $userEntity) { |
||||||
|
$id = $userEntity->getId(); |
||||||
|
$path = 'users/' . substr((string) $id, 0, 1) . '/' . $id . '/'; |
||||||
|
|
||||||
|
$certificateDir = $rootPath . '/app/upload/' . $path . 'certificate/'; |
||||||
|
|
||||||
|
if (!is_dir($certificateDir)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
$files = glob($certificateDir . '*'); |
||||||
|
|
||||||
|
foreach ($files as $file) { |
||||||
|
if (!is_file($file)) { |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
$originalTitle = basename($file); |
||||||
|
|
||||||
|
// Search in gradebook_certificate for a record with a path_certificate that matches $originalTitle |
||||||
|
$certificate = $em->getRepository(GradebookCertificate::class)->findOneBy(['pathCertificate' => '/' . $originalTitle]); |
||||||
|
if (!$certificate) { |
||||||
|
// If not found, continue with the next file |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
$catId = null !== $certificate->getCategory() ? $certificate->getCategory()->getId() : 0; |
||||||
|
$newTitle = hash('sha256', $id . $catId) . '.html'; |
||||||
|
|
||||||
|
$existingFile = $em->getRepository(PersonalFile::class)->findOneBy(['title' => $newTitle]); |
||||||
|
if ($existingFile) { |
||||||
|
error_log('MIGRATIONS :: Skipping file -- ' . $file . ' (Already exists)'); |
||||||
|
continue; |
||||||
|
} |
||||||
|
|
||||||
|
error_log('MIGRATIONS :: Processing file -- ' . $file); |
||||||
|
|
||||||
|
$personalFile = new PersonalFile(); |
||||||
|
$personalFile->setTitle($newTitle); |
||||||
|
$personalFile->setCreator($userEntity); |
||||||
|
$personalFile->setParentResourceNode($userEntity->getResourceNode()->getId()); |
||||||
|
$personalFile->setResourceName($newTitle); |
||||||
|
$mimeType = mime_content_type($file); |
||||||
|
$uploadedFile = new UploadedFile($file, $newTitle, $mimeType, null, true); |
||||||
|
$personalFile->setUploadFile($uploadedFile); |
||||||
|
$personalFile->addUserLink($userEntity); |
||||||
|
|
||||||
|
$em->persist($personalFile); |
||||||
|
$em->flush(); |
||||||
|
|
||||||
|
// Update the record in gradebook_certificate with the new title |
||||||
|
$certificate->setPathCertificate('/' . $newTitle); |
||||||
|
$em->flush(); |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,149 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Repository; |
||||||
|
|
||||||
|
use Chamilo\CoreBundle\Entity\GradebookCategory; |
||||||
|
use Chamilo\CoreBundle\Entity\GradebookCertificate; |
||||||
|
use Chamilo\CoreBundle\Entity\PersonalFile; |
||||||
|
use Chamilo\CoreBundle\Entity\User; |
||||||
|
use DateTime; |
||||||
|
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; |
||||||
|
use Doctrine\ORM\AbstractQuery; |
||||||
|
use Doctrine\Persistence\ManagerRegistry; |
||||||
|
use Symfony\Component\HttpFoundation\File\UploadedFile; |
||||||
|
|
||||||
|
class GradebookCertificateRepository extends ServiceEntityRepository |
||||||
|
{ |
||||||
|
public function __construct(ManagerRegistry $registry) |
||||||
|
{ |
||||||
|
parent::__construct($registry, GradebookCertificate::class); |
||||||
|
} |
||||||
|
|
||||||
|
public function getCertificateByUserId(?int $catId, int $userId, bool $asArray = false) |
||||||
|
{ |
||||||
|
$qb = $this->createQueryBuilder('gc') |
||||||
|
->where('gc.user = :userId') |
||||||
|
->setParameter('userId', $userId) |
||||||
|
->setMaxResults(1); |
||||||
|
|
||||||
|
if ($catId === 0) { |
||||||
|
$catId = null; |
||||||
|
} |
||||||
|
|
||||||
|
if (null === $catId) { |
||||||
|
$qb->andWhere('gc.category IS NULL'); |
||||||
|
} else { |
||||||
|
$qb->andWhere('gc.category = :catId') |
||||||
|
->setParameter('catId', $catId); |
||||||
|
} |
||||||
|
|
||||||
|
$qb->orderBy('gc.id', 'ASC'); |
||||||
|
|
||||||
|
$query = $qb->getQuery(); |
||||||
|
|
||||||
|
if ($asArray) { |
||||||
|
try { |
||||||
|
return $query->getOneOrNullResult(AbstractQuery::HYDRATE_ARRAY); |
||||||
|
} catch (\Doctrine\ORM\NonUniqueResultException $e) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} else { |
||||||
|
try { |
||||||
|
return $query->getOneOrNullResult(); |
||||||
|
} catch (\Doctrine\ORM\NonUniqueResultException $e) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public function registerUserInfoAboutCertificate(int $catId, int $userId, float $scoreCertificate, string $fileName = ''): void |
||||||
|
{ |
||||||
|
$existingCertificate = $this->getCertificateByUserId($catId === 0 ? null : $catId, $userId); |
||||||
|
|
||||||
|
if (!$existingCertificate) { |
||||||
|
$certificate = new GradebookCertificate(); |
||||||
|
|
||||||
|
$category = $catId === 0 ? null : $this->_em->getRepository(GradebookCategory::class)->find($catId); |
||||||
|
$user = $this->_em->getRepository(User::class)->find($userId); |
||||||
|
|
||||||
|
if (!empty($fileName)) { |
||||||
|
$fileName = '/'.$fileName; |
||||||
|
} |
||||||
|
|
||||||
|
if ($category) { |
||||||
|
$certificate->setCategory($category); |
||||||
|
} |
||||||
|
$certificate->setUser($user); |
||||||
|
$certificate->setPathCertificate($fileName); |
||||||
|
$certificate->setScoreCertificate($scoreCertificate); |
||||||
|
$certificate->setCreatedAt(new DateTime()); |
||||||
|
|
||||||
|
$this->_em->persist($certificate); |
||||||
|
$this->_em->flush(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public function generateCertificatePersonalFile(int $userId, string $fileName, string $certificateContent): ?PersonalFile |
||||||
|
{ |
||||||
|
$em = $this->getEntityManager(); |
||||||
|
$userEntity = $em->getRepository(User::class)->find($userId); |
||||||
|
|
||||||
|
$existingFile = $em->getRepository(PersonalFile::class)->findOneBy(['title' => $fileName]); |
||||||
|
|
||||||
|
if (!$existingFile) { |
||||||
|
$tempFilePath = tempnam(sys_get_temp_dir(), 'cert'); |
||||||
|
file_put_contents($tempFilePath, $certificateContent); |
||||||
|
|
||||||
|
$mimeType = mime_content_type($tempFilePath); |
||||||
|
$uploadedFile = new UploadedFile($tempFilePath, $fileName, $mimeType, null, true); |
||||||
|
|
||||||
|
$personalFile = new PersonalFile(); |
||||||
|
$personalFile->setTitle($fileName); |
||||||
|
$personalFile->setCreator($userEntity); |
||||||
|
$personalFile->setParentResourceNode($userEntity->getResourceNode()->getId()); |
||||||
|
$personalFile->setResourceName($fileName); |
||||||
|
$personalFile->setUploadFile($uploadedFile); |
||||||
|
$personalFile->addUserLink($userEntity); |
||||||
|
|
||||||
|
$em->persist($personalFile); |
||||||
|
$em->flush(); |
||||||
|
|
||||||
|
unlink($tempFilePath); |
||||||
|
|
||||||
|
return $personalFile; |
||||||
|
} |
||||||
|
|
||||||
|
return $existingFile; |
||||||
|
} |
||||||
|
|
||||||
|
public function deleteCertificateAndRelatedFiles(int $userId, int $catId): bool |
||||||
|
{ |
||||||
|
$em = $this->getEntityManager(); |
||||||
|
$certificate = $this->getCertificateByUserId($catId, $userId); |
||||||
|
|
||||||
|
if (!$certificate) { |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
$title = basename(ltrim($certificate->getPathCertificate(), '/')); |
||||||
|
$personalFile = $em->getRepository(PersonalFile::class)->findOneBy(['title' => $title]); |
||||||
|
|
||||||
|
if (!$personalFile) { |
||||||
|
|
||||||
|
return false; |
||||||
|
} |
||||||
|
|
||||||
|
$em->remove($personalFile); |
||||||
|
$em->flush(); |
||||||
|
|
||||||
|
$em->remove($certificate); |
||||||
|
$em->flush(); |
||||||
|
|
||||||
|
return true; |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue