Merge pull request #5818 from christianbeeznest/rna-22039

Migration: Handle missing users in migration by assigning files to fallback_user - refs BT#22039
pull/5838/head
christianbeeznest 11 months ago committed by GitHub
commit 5b64cf532b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 157
      src/CoreBundle/Migrations/Schema/V200/Version20230720143000.php
  2. 6
      src/CoreBundle/Migrations/Schema/V200/Version20230720222140.php

@ -26,89 +26,106 @@ final class Version20230720143000 extends AbstractMigrationChamilo
$kernel = $this->container->get('kernel'); $kernel = $this->container->get('kernel');
$rootPath = $kernel->getProjectDir(); $rootPath = $kernel->getProjectDir();
$q = $this->entityManager->createQuery('SELECT u FROM Chamilo\CoreBundle\Entity\User u'); $fallbackUser = $this->getFallbackUser();
$directory = $this->getUpdateRootPath().'/app/upload/users/';
/** @var User $userEntity */
foreach ($q->toIterable() as $userEntity) { $variable = 'split_users_upload_directory';
$id = $userEntity->getId(); $query = $this->entityManager->createQuery('SELECT s.selectedValue FROM Chamilo\CoreBundle\Entity\SettingsCurrent s WHERE s.variable = :variable')
$path = "users/{$id}/"; ->setParameter('variable', $variable);
$result = $query->getOneOrNullResult();
$variable = 'split_users_upload_directory'; $splitUsersUploadDirectory = $result['selectedValue'] ?? 'false';
// Query the 'selected_value' from the 'settings' table where the 'variable' is 'split_users_upload_directory'
$query = $this->entityManager->createQuery('SELECT s.selectedValue FROM Chamilo\CoreBundle\Entity\SettingsCurrent s WHERE s.variable = :variable') if ('true' === $splitUsersUploadDirectory) {
->setParameter('variable', $variable) $parentDirectories = glob($directory.'*', GLOB_ONLYDIR);
;
foreach ($parentDirectories as $parentDir) {
// Get the result of the query (it should return a single row with the 'selected_value' column) $firstDigit = basename($parentDir);
$result = $query->getOneOrNullResult(); $subDirectories = glob($parentDir.'/*', GLOB_ONLYDIR);
$settingValueAsString = 'false'; foreach ($subDirectories as $userDir) {
if (null !== $result) { $userId = basename($userDir);
// Convert the 'selected_value' to a string and store it in $settingValueAsString $this->processUserDirectory($userId, $userDir, $fallbackUser, true);
$settingValue = $result['selectedValue']; }
$settingValueAsString = (string) $settingValue;
} }
} else {
// If the 'split_users_upload_directory' setting is 'true', adjust the path accordingly $userDirectories = glob($directory.'*', GLOB_ONLYDIR);
if ('true' === $settingValueAsString) { foreach ($userDirectories as $userDir) {
$path = 'users/'.substr((string) $id, 0, 1).'/'.$id.'/'; $userId = basename($userDir);
$this->processUserDirectory($userId, $userDir, $fallbackUser, false);
} }
}
}
$baseDir = $this->getUpdateRootPath().'/app/upload/'.$path; private function processUserDirectory(string $userId, string $userDir, User $fallbackUser, bool $splitUsersUploadDirectory): void
{
$userEntity = $this->entityManager->getRepository(User::class)->find($userId);
$userToAssign = $userEntity ?? $fallbackUser;
// Check if the base directory exists, if not, continue to the next user if ($userEntity === null) {
if (!is_dir($baseDir)) { error_log("User with ID {$userId} not found. Using fallback_user.");
continue; } else {
} error_log("Processing files for user with ID {$userId}.");
}
// Get all the files in the 'my_files' directory if ($splitUsersUploadDirectory) {
$myFilesDir = $baseDir.'my_files/'; $baseDir = $userDir.'/';
$files = glob($myFilesDir.'*'); } else {
$baseDir = $this->getUpdateRootPath().'/app/upload/users/'.$userId.'/';
}
// $files now contains a list of all files in the 'my_files' directory error_log("Final path to check: {$baseDir}");
foreach ($files as $file) {
if (!is_file($file)) {
continue;
}
$title = basename($file); if (!is_dir($baseDir)) {
$queryBuilder = $this->entityManager->createQueryBuilder(); error_log("Directory not found for user with ID {$userId}. Skipping.");
return;
}
// Build the query to join the ResourceNode and PersonalFile tables $myFilesDir = $baseDir.'my_files/';
$queryBuilder $files = glob($myFilesDir.'*');
->select('p')
->from(ResourceNode::class, 'n')
->innerJoin(PersonalFile::class, 'p', Join::WITH, 'p.resourceNode = n.id')
->where('n.title = :title')
->andWhere('n.creator = :creator')
->setParameter('title', $title)
->setParameter('creator', $id)
;
$result = $queryBuilder->getQuery()->getOneOrNullResult(); foreach ($files as $file) {
if (!is_file($file)) {
continue;
}
if ($result) { $title = basename($file);
// Skip creating a new entity and log a message error_log("Processing file: {$file} for user with ID {$userToAssign->getId()}.");
error_log('MIGRATIONS :: $file -- '.$file.' (Skipped: Already exists) ...');
continue; $queryBuilder = $this->entityManager->createQueryBuilder();
} $queryBuilder
->select('p')
->from(ResourceNode::class, 'n')
->innerJoin(PersonalFile::class, 'p', Join::WITH, 'p.resourceNode = n.id')
->where('n.title = :title')
->andWhere('n.creator = :creator')
->setParameter('title', $title)
->setParameter('creator', $userToAssign->getId());
$result = $queryBuilder->getQuery()->getOneOrNullResult();
error_log('MIGRATIONS :: $file -- '.$file.' ...'); if ($result) {
// Create a new PersonalFile entity if it doesn't already exist error_log('MIGRATIONS :: '.$file.' (Skipped: Already exists) ...');
$personalFile = new PersonalFile(); continue;
$personalFile->setTitle($title); // Set the file name as the title
$personalFile->setCreator($userEntity);
$personalFile->setParentResourceNode($userEntity->getResourceNode()->getId());
$personalFile->setResourceName($title);
$mimeType = mime_content_type($file);
$uploadedFile = new UploadedFile($file, $title, $mimeType, null, true);
$personalFile->setUploadFile($uploadedFile);
$personalFile->addUserLink($userEntity);
// Save the object to the database
$this->entityManager->persist($personalFile);
$this->entityManager->flush();
} }
error_log("MIGRATIONS :: Associating file {$file} to user with ID {$userToAssign->getId()}.");
$personalFile = new PersonalFile();
$personalFile->setTitle($title);
$personalFile->setCreator($userToAssign);
$personalFile->setParentResourceNode($userToAssign->getResourceNode()->getId());
$personalFile->setResourceName($title);
$mimeType = mime_content_type($file);
$uploadedFile = new UploadedFile($file, $title, $mimeType, null, true);
$personalFile->setUploadFile($uploadedFile);
$personalFile->addUserLink($userToAssign);
// Save the object to the database
$this->entityManager->persist($personalFile);
$this->entityManager->flush();
} }
} }
private function getFallbackUser(): ?User
{
return $this->entityManager->getRepository(User::class)->findOneBy(['status' => User::ROLE_FALLBACK], ['id' => 'ASC']);
}
} }

@ -27,6 +27,7 @@ final class Version20230720222140 extends AbstractMigrationChamilo
$userRepo = $this->container->get(UserRepository::class); $userRepo = $this->container->get(UserRepository::class);
$personalRepo = $this->container->get(PersonalFileRepository::class); $personalRepo = $this->container->get(PersonalFileRepository::class);
$fallbackUser = $userRepo->findOneBy(['status' => User::ROLE_FALLBACK], ['id' => 'ASC']);
$q = $this->entityManager->createQuery('SELECT s FROM Chamilo\CoreBundle\Entity\SocialPost s'); $q = $this->entityManager->createQuery('SELECT s FROM Chamilo\CoreBundle\Entity\SocialPost s');
@ -60,6 +61,11 @@ final class Version20230720222140 extends AbstractMigrationChamilo
// Output the user id, folder id, and filename // Output the user id, folder id, and filename
error_log('User ID: '.$userId.', Folder ID: '.$folderId.', Filename: '.$filename); error_log('User ID: '.$userId.', Folder ID: '.$folderId.', Filename: '.$filename);
$user = $userRepo->find($userId); $user = $userRepo->find($userId);
if (!$user) {
$user = $fallbackUser;
}
$personalFile = $personalRepo->getResourceByCreatorFromTitle( $personalFile = $personalRepo->getResourceByCreatorFromTitle(
$filename, $filename,
$user, $user,

Loading…
Cancel
Save