Olivier Massot 4 月之前
父节点
当前提交
544f468be3

+ 0 - 56
src/Commands/Doctrine/OtDbCheckCommand.php

@@ -1,56 +0,0 @@
-<?php
-
-declare(strict_types=1);
-
-namespace App\Commands\Doctrine;
-
-use App\Service\Cron\Job\DbCheck;
-use Psr\Log\LoggerInterface;
-use Symfony\Component\Console\Attribute\AsCommand;
-use Symfony\Component\Console\Command\Command;
-use Symfony\Component\Console\Input\InputInterface;
-use Symfony\Component\Console\Output\OutputInterface;
-use Symfony\Contracts\Service\Attribute\Required;
-
-/**
- * Vérifie l'intégrité de la base de données par rapport aux entités du projet.
- *
- * Cette commande permet de vérifier qu'un dump de la base de données qui a été
- * remonté sur un serveur de test est intègre. Elle effectue les vérifications suivantes :
- *
- * 1. Vérification de la connexion à la base de données
- * 2. Vérification du schéma de la base de données par rapport aux définitions des entités
- *    - Validation des mappings des entités
- *    - Vérification de la synchronisation du schéma de la base de données avec les entités
- * 3. Vérification que les tables contiennent des données
- *
- * Utilisation :
- *   php bin/console ot:db:check                  # Vérification standard
- *   php bin/console ot:db:check --verbose        # Affiche des informations détaillées, y compris les requêtes SQL nécessaires pour mettre à jour le schéma
- *
- * Types de différences détectées :
- *   - SCHEMA_DIFF : Différence de schéma (colonnes, types, etc.)
- *   - MISSING_TABLE : Table manquante dans la base de données
- *   - EXTRA_TABLE : Table supplémentaire dans la base de données
- *
- * Codes de retour :
- *   - 0 (SUCCESS) : La base de données est intègre
- *   - 1 (FAILURE) : Des problèmes ont été détectés dans la base de données
- */
-#[AsCommand(
-    name: 'ot:db:check',
-    description: 'Vérifie l\'intégrité de la base de données par rapport aux entités du projet'
-)]
-class OtDbCheckCommand extends Command
-{
-    public function __construct(
-        private readonly DbCheck $dbCheck,
-    ) {
-        parent::__construct();
-    }
-
-    protected function execute(InputInterface $input, OutputInterface $output): int
-    {
-        return $this->dbCheck->execute();
-    }
-}

+ 3 - 3
src/Service/Access/Utils.php

@@ -19,9 +19,9 @@ use Symfony\Component\Security\Core\Role\RoleHierarchyInterface;
 class Utils
 {
     public function __construct(
-        readonly private RoleHierarchyInterface $roleHierarchy,
-        readonly private AccessRepository $accessRepository,
-        readonly private OptionalsRolesIterator $optionalsRolesIterator,
+        private readonly RoleHierarchyInterface $roleHierarchy,
+        private readonly AccessRepository $accessRepository,
+        private readonly OptionalsRolesIterator $optionalsRolesIterator,
     ) {
     }
 

+ 1 - 1
src/Service/ApiLegacy/ApiLegacyRequestService.php

@@ -25,7 +25,7 @@ class ApiLegacyRequestService extends ApiRequestService
         HttpClientInterface $apiLegacyClient,
         private readonly Security $security,
         private readonly JWTTokenManagerInterface $jwtManager,
-        readonly private string $internalRequestsToken,
+        private readonly string $internalRequestsToken,
     ) {
         parent::__construct($apiLegacyClient);
     }

+ 2 - 2
src/Service/Constraint/DateTimeConstraint.php

@@ -16,8 +16,8 @@ use Doctrine\ORM\EntityManagerInterface;
 class DateTimeConstraint extends AbstractTimeConstraintUtils implements TimeConstraintInterface
 {
     public function __construct(
-        readonly private EntityManagerInterface $entityManager,
-        readonly private OrganizationUtils $organizationUtils,
+        private readonly EntityManagerInterface $entityManager,
+        private readonly OrganizationUtils $organizationUtils,
     ) {
     }
 

+ 16 - 14
src/Service/Cron/Job/DbCheck.php

@@ -4,11 +4,9 @@ declare(strict_types=1);
 
 namespace App\Service\Cron\Job;
 
-use App\Entity\Organization\Organization;
 use App\Service\Cron\BaseCronJob;
 use Doctrine\DBAL\Connection;
 use Doctrine\ORM\EntityManagerInterface;
-use Symfony\Component\Console\Command\Command;
 
 /**
  * Cron job dédié au contrôle du backup de la DB Opentalent.
@@ -24,7 +22,7 @@ use Symfony\Component\Console\Command\Command;
  */
 class DbCheck extends BaseCronJob
 {
-    const IGNORE_EMPTY_TABLES = [
+    public const IGNORE_EMPTY_TABLES = [
         'messenger_messages',
         'enqueue',
         'zzz_.*',
@@ -38,7 +36,7 @@ class DbCheck extends BaseCronJob
         'tag_control',
         'tag_educationNotation',
         'tag_educationStudent',
-        'tag_repair'
+        'tag_repair',
     ];
 
     public function __construct(
@@ -47,12 +45,13 @@ class DbCheck extends BaseCronJob
         parent::__construct();
     }
 
-    public function preview(): void {
+    public function preview(): void
+    {
         $this->ui->print('No preview available for this job');
     }
 
     /**
-     * Execute database integrity checks
+     * Execute database integrity checks.
      */
     public function execute(): void
     {
@@ -63,6 +62,8 @@ class DbCheck extends BaseCronJob
             $connection = $this->getDbConnection();
         } catch (\Exception $e) {
             $this->logger->critical($e->getMessage());
+
+            return;
         }
 
         $this->logger->info('2. Vérification de l\'intégrité des données');
@@ -75,7 +76,7 @@ class DbCheck extends BaseCronJob
 
             foreach ($tables as $table) {
                 try {
-                    if (preg_match('/^' . implode('|', self::IGNORE_EMPTY_TABLES) . '$/', $table)) {
+                    if (preg_match('/^'.implode('|', self::IGNORE_EMPTY_TABLES).'$/', $table)) {
                         $this->logger->debug(sprintf('Table %s: -- ignored --', $table));
                         continue;
                     }
@@ -96,23 +97,24 @@ class DbCheck extends BaseCronJob
                 $this->logger->critical('%d tables vides détectées sur %d tables au total');
                 $this->logger->error('Tables vides:');
                 foreach ($emptyTables as $table) {
-                    $this->logger->error('- ' . $table);
+                    $this->logger->error('- '.$table);
                 }
             } else {
                 $this->logger->info('Toutes les tables sont présentes et contiennent des données');
             }
         } catch (\Exception $e) {
-            $this->logger->critical('Erreur lors de la vérification de l\'intégrité des données: ' . $e->getMessage());
-            $this->logger->debug('Stack trace: ' . $e->getTraceAsString());
+            $this->logger->critical('Erreur lors de la vérification de l\'intégrité des données: '.$e->getMessage());
+            $this->logger->debug('Stack trace: '.$e->getTraceAsString());
         }
     }
 
     /**
      * Establishes a connection to the database.
      *
-     * @return Connection The active database connection.
-     * @throws \RuntimeException If the connection could not be established
-     *                           or if an error occurs during the process.
+     * @return Connection the active database connection
+     *
+     * @throws \RuntimeException if the connection could not be established
+     *                           or if an error occurs during the process
      */
     private function getDbConnection(): Connection
     {
@@ -137,7 +139,7 @@ class DbCheck extends BaseCronJob
                 throw new \RuntimeException('Impossible de se connecter à la base de données');
             }
         } catch (\Exception $e) {
-            throw new \RuntimeException('Erreur lors de la connexion à la base de données: ' . $e->getMessage());
+            throw new \RuntimeException('Erreur lors de la connexion à la base de données: '.$e->getMessage());
         }
 
         return $connection;

+ 1 - 1
src/Service/Security/InternalRequestsService.php

@@ -27,7 +27,7 @@ class InternalRequestsService
     ];
 
     public function __construct(
-        readonly private string $internalRequestsToken,
+        private readonly string $internalRequestsToken,
         private Security $security,
     ) {
     }

+ 2 - 2
src/Service/Security/Module.php

@@ -17,8 +17,8 @@ use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 class Module
 {
     public function __construct(
-        readonly private Reflection $reflection,
-        readonly private ParameterBagInterface $parameterBag,
+        private readonly Reflection $reflection,
+        private readonly ParameterBagInterface $parameterBag,
     ) {
     }
 

+ 1 - 1
src/Service/ServiceIterator/CronjobIterator.php

@@ -19,7 +19,7 @@ class CronjobIterator
      */
     public function __construct(
         #[AutowireIterator('app.cronjob')]
-        readonly private iterable $cronjobServices,
+        private readonly iterable $cronjobServices,
     ) {
     }
 

+ 1 - 1
src/Service/ServiceIterator/CurrentAccessExtensionIterator.php

@@ -12,7 +12,7 @@ class CurrentAccessExtensionIterator
     /**
      * @param iterable<AdditionalAccessExtensionInterface> $extensions
      */
-    public function __construct(readonly private iterable $extensions)
+    public function __construct(private readonly iterable $extensions)
     {
     }
 

+ 1 - 1
src/Service/ServiceIterator/EncoderIterator.php

@@ -17,7 +17,7 @@ class EncoderIterator
      * @param iterable<EncoderInterface> $encoders
      */
     public function __construct(
-        readonly private iterable $encoders,
+        private readonly iterable $encoders,
     ) {
     }
 

+ 1 - 1
src/Service/ServiceIterator/ExporterIterator.php

@@ -18,7 +18,7 @@ class ExporterIterator
      * @param iterable<ExporterInterface> $exportServices
      */
     public function __construct(
-        readonly private iterable $exportServices,
+        private readonly iterable $exportServices,
     ) {
     }
 

+ 1 - 1
src/Service/ServiceIterator/Mailer/BuilderIterator.php

@@ -18,7 +18,7 @@ class BuilderIterator
      * @param iterable<BuilderInterface> $builderServices
      */
     public function __construct(
-        readonly private iterable $builderServices,
+        private readonly iterable $builderServices,
     ) {
     }
 

+ 1 - 1
src/Service/ServiceIterator/OptionalsRolesIterator.php

@@ -12,7 +12,7 @@ class OptionalsRolesIterator
     /**
      * @param iterable<OptionalsRolesInterface> $optionalsRoles
      */
-    public function __construct(readonly private iterable $optionalsRoles)
+    public function __construct(private readonly iterable $optionalsRoles)
     {
     }
 

+ 1 - 1
src/Service/ServiceIterator/StorageIterator.php

@@ -18,7 +18,7 @@ class StorageIterator
      * @param iterable<FileStorageInterface> $storageServices
      */
     public function __construct(
-        readonly private iterable $storageServices,
+        private readonly iterable $storageServices,
     ) {
     }
 

+ 1 - 1
src/Service/Twig/AssetsExtension.php

@@ -20,7 +20,7 @@ use Twig\TwigFunction;
 class AssetsExtension extends AbstractExtension
 {
     public function __construct(
-        readonly private FileManager $fileManager,
+        private readonly FileManager $fileManager,
     ) {
     }
 

+ 1 - 1
src/Service/Utils/Reflection.php

@@ -11,7 +11,7 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
  */
 class Reflection
 {
-    public function __construct(readonly private ContainerInterface $container)
+    public function __construct(private readonly ContainerInterface $container)
     {
     }
 

+ 13 - 11
tests/Unit/Service/Cron/Job/DbCheckTest.php

@@ -6,7 +6,6 @@ namespace App\Tests\Unit\Service\Cron\Job;
 
 use App\Service\Cron\Job\DbCheck;
 use App\Service\Cron\UI\CronUIInterface;
-use App\Tests\Unit\Service\Cron\Job\TestableDbCheck;
 use Doctrine\DBAL\Connection;
 use Doctrine\DBAL\Result;
 use Doctrine\DBAL\Schema\AbstractSchemaManager;
@@ -35,7 +34,7 @@ class DbCheckTest extends TestCase
     }
 
     /**
-     * Sets up common connection expectations
+     * Sets up common connection expectations.
      */
     private function setupConnectionExpectations(): void
     {
@@ -46,19 +45,18 @@ class DbCheckTest extends TestCase
             'host' => 'localhost',
             'port' => '3306',
             'dbname' => 'testdb',
-            'user' => 'testuser'
+            'user' => 'testuser',
         ]);
     }
 
     /**
-     * Creates and sets up a schema manager mock
-     *
-     * @return AbstractSchemaManager|MockObject
+     * Creates and sets up a schema manager mock.
      */
     private function setupSchemaManager(): AbstractSchemaManager|MockObject
     {
         $schemaManager = $this->getMockBuilder(AbstractSchemaManager::class)->disableOriginalConstructor()->getMock();
         $this->connection->method('createSchemaManager')->willReturn($schemaManager);
+
         return $schemaManager;
     }
 
@@ -127,6 +125,7 @@ class DbCheckTest extends TestCase
                 } elseif (strpos($query, 'table2') !== false) {
                     return $result2;
                 }
+
                 return $this->getMockBuilder(Result::class)->disableOriginalConstructor()->getMock();
             });
 
@@ -159,11 +158,12 @@ class DbCheckTest extends TestCase
             ->method('executeQuery')
             ->willReturnCallback(function ($query) use ($emptyResult) {
                 // Verify that only non-ignored tables are queried
-                if (strpos($query, 'messenger_messages') !== false ||
-                    strpos($query, 'enqueue') !== false ||
-                    strpos($query, 'tag_control') !== false) {
-                    $this->fail('Ignored table should not be queried: ' . $query);
+                if (strpos($query, 'messenger_messages') !== false
+                    || strpos($query, 'enqueue') !== false
+                    || strpos($query, 'tag_control') !== false) {
+                    $this->fail('Ignored table should not be queried: '.$query);
                 }
+
                 return $emptyResult;
             });
 
@@ -200,7 +200,7 @@ class DbCheckTest extends TestCase
     }
 
     /**
-     * Test that the DbCheck class handles connection errors properly
+     * Test that the DbCheck class handles connection errors properly.
      */
     public function testConnectionError(): void
     {
@@ -240,6 +240,7 @@ class DbCheckTest extends TestCase
 
         $dbCheck->execute();
     }
+
     public function testExecuteWithTableQueryException(): void
     {
         $dbCheck = $this->getMockFor('execute');
@@ -262,6 +263,7 @@ class DbCheckTest extends TestCase
                 } elseif (strpos($query, 'table2') !== false) {
                     return $result2;
                 }
+
                 return $this->getMockBuilder(Result::class)->disableOriginalConstructor()->getMock();
             });