PostUpgradeCommand.php 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace App\Commands\PostUpgrade\V0_2;
  3. use PDO;
  4. use Psr\Log\LoggerInterface;
  5. use Symfony\Component\Console\Attribute\AsCommand;
  6. use Symfony\Component\Console\Command\Command;
  7. use Symfony\Component\Console\Input\InputInterface;
  8. use Symfony\Component\Console\Output\OutputInterface;
  9. #[AsCommand(
  10. name: 'ot:upgrade:0.2',
  11. description: 'Execute the post-upgrade scripts for Ap2i v0.2'
  12. )]
  13. class PostUpgradeCommand extends Command
  14. {
  15. public const TARGETED_VERSION = "0.2";
  16. public function __construct(private LoggerInterface $logger) {
  17. parent::__construct();
  18. }
  19. protected function configure(): void
  20. {}
  21. /**
  22. * @throws \Exception
  23. */
  24. protected function execute(InputInterface $input, OutputInterface $output): int
  25. {
  26. $this->logger->info('Run post-upgrade scripts for version ' . self::TARGETED_VERSION);
  27. // $this->populateSubdomains();
  28. $this->genEventsUuid();
  29. $output->writeln("Post-upgrade operations successfully executed");
  30. return Command::SUCCESS;
  31. }
  32. private function getOpentalentConnexion() {
  33. $dbUrl = $_ENV['DATABASE_URL'];
  34. $matches = [];
  35. preg_match(
  36. "/^mysql:\/\/(\w+):([^\s@]+)@([\w\-]+):(\d+)\/(\w+)/",
  37. $dbUrl,
  38. $matches
  39. );
  40. [$dbUser, $dbPwd, $dbHost, $dbPort, $dbName] = array_slice($matches, 1);
  41. $opentalentCnn = new PDO(
  42. "mysql:host=" . $dbHost . ";dbname=" . $dbName,
  43. $dbUser,
  44. $dbPwd,
  45. array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  46. $opentalentCnn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  47. return $opentalentCnn;
  48. }
  49. /**
  50. * Populate the new Subdomain table
  51. * @throws \Exception
  52. */
  53. private function populateSubdomains(): void
  54. {
  55. $opentalentCnn = $this->getOpentalentConnexion();
  56. $opentalentCnn->beginTransaction();
  57. $openassosCnn = new PDO(
  58. "mysql:host=prod-front;dbname=openassos",
  59. 'dbcloner',
  60. 'wWZ4hYcrmHLW2mUK',
  61. array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
  62. try {
  63. $stmt = $opentalentCnn->query("select count(*) from opentalent.Subdomain;");
  64. if ($stmt->fetchColumn(0)[0] > 0) {
  65. throw new \RuntimeException('Subdomain table is not empty');
  66. }
  67. $this->logger->info('Populate with reserved subdomains');
  68. $reservedSubdomains = [
  69. 'app', 'my', 'api', 'ap2i', 'assistance', 'local', 'ressources', 'logs', 'stats', 'support', 'preprod',
  70. 'test', 'admin', 'statistiques', 'drive', 'cloud', 'git', 'frames', 'v6', 'v59', 'www', 'myadmin'
  71. ];
  72. foreach ($reservedSubdomains as $reserved) {
  73. $sql = "insert into opentalent.Subdomain (organization_id, subdomain, active)
  74. values (13, '" . $reserved . "', 0);";
  75. $opentalentCnn->query($sql);
  76. }
  77. $this->logger->info('Populate Subdomain table from openassos.sys_domain');
  78. $sql = "SELECT d.pid, REGEXP_REPLACE(d.domainName, '^(.+)\\\\.opentalent\\\\.fr$', '\\\\1')
  79. FROM openassos.sys_domain d
  80. where d.domainName like '%.opentalent.fr';";
  81. $statement = $openassosCnn->query($sql);
  82. foreach ($statement->fetchAll() as $row) {
  83. [$cmsId, $subdomain] = $row;
  84. if (!empty($subdomain) and is_numeric($cmsId)) {
  85. $sql = "INSERT INTO opentalent.Subdomain (organization_id, subdomain)
  86. SELECT o.id, '" . $subdomain . "'
  87. from opentalent.Organization o
  88. where o.cmsId = " . $cmsId . ";";
  89. $opentalentCnn->query($sql);
  90. }
  91. }
  92. $sql = "delete
  93. from opentalent.Subdomain
  94. where subdomain REGEXP '^(.*)\\\\.(.*)$'
  95. and REGEXP_REPLACE(subdomain, '\\\\.', '-') in (select subdomain from opentalent.Subdomain);";
  96. $opentalentCnn->query($sql);
  97. $sql = "update opentalent.Subdomain
  98. set subdomain = REGEXP_REPLACE(subdomain, '\\\\.', '-')
  99. where subdomain REGEXP '^(.*)\\\\.(.*)$';";
  100. $opentalentCnn->query($sql);
  101. $this->logger->info('Complete with subdomains from Parameters table');
  102. $sql = "insert into opentalent.Subdomain (organization_id, subdomain)
  103. select distinct o.id, p.subDomain
  104. from opentalent.Parameters p
  105. inner join opentalent.Organization o on o.parameters_id = p.id
  106. left join opentalent.Subdomain s on s.organization_id = o.id
  107. where p.subDomain is not null and not p.subDomain in (select subdomain from opentalent.Subdomain);";
  108. $opentalentCnn->query($sql);
  109. $this->logger->info('Set the current subdomains');
  110. $sql = "update opentalent.Subdomain s set s.active = false;";
  111. $opentalentCnn->query($sql);
  112. $sql = "update opentalent.Subdomain s
  113. inner join opentalent.Organization o on o.id = s.organization_id
  114. inner join opentalent.Parameters p on p.id = o.parameters_id and s.subdomain = p.subDomain
  115. set s.active = true;";
  116. $opentalentCnn->query($sql);
  117. $this->logger->info('Set the custom domains');
  118. $sql = "update opentalent.Parameters
  119. set customDomain = otherWebsite
  120. where otherWebsite not like '%.opentalent.fr'";
  121. $opentalentCnn->query($sql);
  122. $opentalentCnn->commit();
  123. $this->logger->info('Subdomain table was successfully populated');
  124. } catch (\Exception $e) {
  125. $opentalentCnn->rollBack();
  126. $this->logger->critical('Error while running the post-upgrade script, abort and rollback');
  127. throw $e;
  128. }
  129. }
  130. private function genEventsUuid() {
  131. $opentalentCnn = $this->getOpentalentConnexion();
  132. $opentalentCnn->beginTransaction();
  133. try {
  134. $this->logger->info('Generate events uuids');
  135. // Generating Uuid1 with native mysql function
  136. $sql = "update opentalent.Booking set uuid = UUID();";
  137. $opentalentCnn->query($sql);
  138. $sql = "update opentalent.AwinProduct set uuid = UUID();";
  139. $opentalentCnn->query($sql);
  140. $opentalentCnn->commit();
  141. $this->logger->info('Events uuid were successfully generated');
  142. } catch (\Exception $e) {
  143. $opentalentCnn->rollBack();
  144. $this->logger->critical('Error while running the post-upgrade script, abort and rollback');
  145. throw $e;
  146. }
  147. }
  148. }