Skip to content

Commit d52980f

Browse files
Merge pull request chamilo#6811 from christianbeeznest/ras-22987
User: purge extra fields on delete + orphan cleanup migration - refs #22987
2 parents 7ae621d + 35d56d2 commit d52980f

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/* For licensing terms, see /license.txt */
6+
7+
namespace Chamilo\CoreBundle\Migrations\Schema\V200;
8+
9+
use Chamilo\CoreBundle\Migrations\AbstractMigrationChamilo;
10+
use Doctrine\DBAL\Schema\Schema;
11+
12+
final class Version20250926070900 extends AbstractMigrationChamilo
13+
{
14+
public function getDescription(): string
15+
{
16+
return 'Purge orphan user extra fields (values + tags) where user no longer exists.';
17+
}
18+
19+
public function up(Schema $schema): void
20+
{
21+
$this->addSql("
22+
DELETE v FROM extra_field_values v
23+
INNER JOIN extra_field f ON f.id = v.field_id
24+
LEFT JOIN `user` u ON u.id = v.item_id
25+
WHERE f.item_type = 1 AND u.id IS NULL
26+
");
27+
28+
$this->addSql("
29+
DELETE r FROM extra_field_rel_tag r
30+
INNER JOIN extra_field f ON f.id = r.field_id
31+
LEFT JOIN `user` u ON u.id = r.item_id
32+
WHERE f.item_type = 1 AND u.id IS NULL
33+
");
34+
}
35+
36+
public function down(Schema $schema): void
37+
{
38+
// No-op (data purge).
39+
}
40+
}

src/CoreBundle/Repository/Node/UserRepository.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,21 @@ public function deleteUser(User $user, bool $destroy = false): void
166166
$this->reassignUserResourcesToFallbackSQL($user, $fallbackUser, $connection);
167167
}
168168

169+
// Remove extra fields
170+
$connection->executeStatement(
171+
'DELETE v FROM extra_field_values v
172+
INNER JOIN extra_field f ON f.id = v.field_id
173+
WHERE f.item_type = :userType AND v.item_id = :uid',
174+
['userType' => ExtraField::USER_FIELD_TYPE, 'uid' => $user->getId()]
175+
);
176+
177+
$connection->executeStatement(
178+
'DELETE r FROM extra_field_rel_tag r
179+
INNER JOIN extra_field f ON f.id = r.field_id
180+
WHERE f.item_type = :userType AND r.item_id = :uid',
181+
['userType' => ExtraField::USER_FIELD_TYPE, 'uid' => $user->getId()]
182+
);
183+
169184
// Remove group relationships
170185
$connection->executeStatement(
171186
'DELETE FROM usergroup_rel_user WHERE user_id = :userId',

0 commit comments

Comments
 (0)