parent
05ca7d7d41
commit
aa7e6b432b
@ -0,0 +1,115 @@ |
|||||||
|
<?php |
||||||
|
|
||||||
|
declare(strict_types=1); |
||||||
|
|
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
namespace Chamilo\CoreBundle\Migrations\Schema\V200; |
||||||
|
|
||||||
|
use Chamilo\CoreBundle\Entity\Asset; |
||||||
|
use Chamilo\CoreBundle\Entity\AttemptFile; |
||||||
|
use Chamilo\CoreBundle\Entity\TrackEAttempt; |
||||||
|
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo; |
||||||
|
use Doctrine\DBAL\Schema\Schema; |
||||||
|
use Symfony\Component\HttpFoundation\File\UploadedFile; |
||||||
|
|
||||||
|
final class Version20240519210000 extends AbstractMigrationChamilo |
||||||
|
{ |
||||||
|
public function getDescription(): string |
||||||
|
{ |
||||||
|
return 'Migrate exercise audio files'; |
||||||
|
} |
||||||
|
|
||||||
|
public function up(Schema $schema): void |
||||||
|
{ |
||||||
|
$attemptRepo = $this->entityManager->getRepository(TrackEAttempt::class); |
||||||
|
|
||||||
|
// Migrate exercise audio files |
||||||
|
$sql = "SELECT ta.exe_id, ta.question_id, ta.user_id, ta.session_id, te.exe_exo_id, ta.filename |
||||||
|
FROM track_e_attempt ta |
||||||
|
INNER JOIN track_e_exercises te ON te.exe_id = ta.exe_id |
||||||
|
WHERE (ta.filename IS NOT NULL AND ta.filename != '')"; |
||||||
|
$result = $this->connection->executeQuery($sql); |
||||||
|
$attempts = $result->fetchAllAssociative(); |
||||||
|
|
||||||
|
foreach ($attempts as $attemptData) { |
||||||
|
$sessionId = (int) $attemptData['session_id']; |
||||||
|
$exerciseId = (int) $attemptData['exe_exo_id']; |
||||||
|
$questionId = (int) $attemptData['question_id']; |
||||||
|
$userId = (int) $attemptData['user_id']; |
||||||
|
$filename = $attemptData['filename']; |
||||||
|
|
||||||
|
$pathPattern = "{$sessionId}/{$exerciseId}/{$questionId}/{$userId}/{$filename}"; |
||||||
|
$courseDir = $this->findCourseDirectory($pathPattern); |
||||||
|
|
||||||
|
if ($courseDir) { |
||||||
|
$filePath = "app/courses/{$courseDir}/exercises/{$pathPattern}"; |
||||||
|
$this->processFile($filePath, $attemptRepo, $attemptData); |
||||||
|
} else { |
||||||
|
error_log('MIGRATIONS :: File not found for pattern: ' . $pathPattern); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
$this->entityManager->flush(); |
||||||
|
} |
||||||
|
|
||||||
|
private function findCourseDirectory(string $pathPattern): ?string |
||||||
|
{ |
||||||
|
$kernel = $this->container->get('kernel'); |
||||||
|
$rootPath = $kernel->getProjectDir() . '/app/courses/'; |
||||||
|
$iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($rootPath)); |
||||||
|
|
||||||
|
foreach ($iterator as $file) { |
||||||
|
if (str_contains($file->getPathname(), $pathPattern)) { |
||||||
|
$relativePath = str_replace($rootPath, '', $file->getPath()); |
||||||
|
|
||||||
|
return explode('/', $relativePath)[0]; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private function processFile(string $filePath, $attemptRepo, array $attemptData): void |
||||||
|
{ |
||||||
|
if (file_exists($filePath)) { |
||||||
|
$fileName = basename($filePath); |
||||||
|
|
||||||
|
/** @var TrackEAttempt $attempt */ |
||||||
|
$attempt = $attemptRepo->findOneBy([ |
||||||
|
'user' => $attemptData['user_id'], |
||||||
|
'questionId' => $attemptData['question_id'], |
||||||
|
'filename' => $fileName, |
||||||
|
]); |
||||||
|
|
||||||
|
if (null !== $attempt) { |
||||||
|
if ($attempt->getAttemptFiles()->count() > 0) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
$mimeType = mime_content_type($filePath); |
||||||
|
$file = new UploadedFile($filePath, $fileName, $mimeType, null, true); |
||||||
|
|
||||||
|
$asset = (new Asset()) |
||||||
|
->setCategory(Asset::EXERCISE_ATTEMPT) |
||||||
|
->setTitle($fileName) |
||||||
|
->setFile($file); |
||||||
|
$this->entityManager->persist($asset); |
||||||
|
$this->entityManager->flush(); |
||||||
|
|
||||||
|
$attemptFile = (new AttemptFile()) |
||||||
|
->setAsset($asset); |
||||||
|
$attempt->addAttemptFile($attemptFile); |
||||||
|
$this->entityManager->persist($attemptFile); |
||||||
|
$this->entityManager->flush(); |
||||||
|
|
||||||
|
error_log('MIGRATIONS :: File processed and inserted as asset and attempt file: ' . $filePath); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
public function down(Schema $schema): void |
||||||
|
{ |
||||||
|
// This migration is not reversible |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue