Skip to content

Commit 5cf7264

Browse files
Merge pull request #5510 from christianbeeznest/GH-5412-3
Migration: Add TrackEDownloads entries with null resourceLink - refs #5412
2 parents 3b80a20 + a47a51f commit 5cf7264

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
6+
7+
use Chamilo\CoreBundle\Entity\User;
8+
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
9+
use Doctrine\DBAL\Schema\Schema;
10+
use Chamilo\CoreBundle\Entity\TrackEDownloads;
11+
use Chamilo\CoreBundle\Entity\ResourceFile;
12+
use Chamilo\CoreBundle\Entity\ResourceNode;
13+
14+
final class Version20240515124400 extends AbstractMigrationChamilo
15+
{
16+
public function getDescription(): string
17+
{
18+
return 'Find and process TrackEDownloads entries with null resourceLink, linking them to ResourceNodes and updating downloads.';
19+
}
20+
21+
public function up(Schema $schema): void
22+
{
23+
$trackEDownloadsRepository = $this->entityManager->getRepository(TrackEDownloads::class);
24+
$resourceFileRepository = $this->entityManager->getRepository(ResourceFile::class);
25+
$resourceNodeRepository = $this->entityManager->getRepository(ResourceNode::class);
26+
$userRepository = $this->entityManager->getRepository(User::class);
27+
28+
$batchSize = 100;
29+
$offset = 0;
30+
$success = true;
31+
32+
while (true) {
33+
$downloads = $trackEDownloadsRepository->createQueryBuilder('t')
34+
->where('t.resourceLink IS NULL')
35+
->setFirstResult($offset)
36+
->setMaxResults($batchSize)
37+
->getQuery()
38+
->getResult();
39+
40+
if (empty($downloads)) {
41+
break;
42+
}
43+
44+
$this->entityManager->beginTransaction();
45+
46+
try {
47+
foreach ($downloads as $download) {
48+
$downDocPath = $download->getDownDocPath();
49+
$fileName = basename($downDocPath);
50+
51+
$resourceFile = $resourceFileRepository->findOneBy(['originalName' => $fileName]);
52+
53+
if ($resourceFile) {
54+
$resourceFileId = $resourceFile->getId();
55+
$resourceNode = $resourceNodeRepository->findOneBy(['resourceFile' => $resourceFileId]);
56+
57+
if ($resourceNode) {
58+
$downUserId = $download->getDownUserId();
59+
$user = $userRepository->find($downUserId);
60+
if (null === $user) {
61+
$user = $this->getAdmin();
62+
}
63+
64+
$firstResourceLink = $resourceNode->getResourceLinks()->first();
65+
if ($firstResourceLink && $user) {
66+
$resourceLinkId = $firstResourceLink->getId();
67+
$url = $resourceNode->getResourceFile()->getOriginalName();
68+
echo "Resource link $resourceLinkId Down id {$download->getDownId()} for $url: user " . $user->getFullname() . "\n";
69+
70+
$this->connection->executeUpdate("UPDATE track_e_downloads SET resource_link_id = ? WHERE down_id = ?", [$resourceLinkId, $download->getDownId()]);
71+
}
72+
}
73+
}
74+
}
75+
76+
$this->entityManager->commit();
77+
} catch (\Exception $e) {
78+
$this->entityManager->rollback();
79+
$success = false;
80+
echo "Failed for download ID {$download->getDownId()}: " . $e->getMessage() . "\n";
81+
break;
82+
} finally {
83+
$this->entityManager->clear();
84+
}
85+
86+
$offset += $batchSize;
87+
}
88+
89+
// Only delete if all updates were successful
90+
if ($success) {
91+
$this->connection->executeUpdate("DELETE FROM track_e_downloads WHERE resource_link_id IS NULL");
92+
} else {
93+
echo "Process failed. No records were deleted.\n";
94+
}
95+
}
96+
97+
public function down(Schema $schema): void
98+
{
99+
}
100+
}

0 commit comments

Comments
 (0)