ldc-arcadia-api/database/arcadia-replicate/Migrator.php

192 lines
7.1 KiB
PHP
Raw Permalink Normal View History

<?php
declare(strict_types=1);
namespace Database\ArcadiaReplicate;
use Database\ArcadiaReplicate\Tables\Metap\MetaUtilTable;
use Database\ArcadiaReplicate\Tables\Refp\AdditifTable;
use Database\ArcadiaReplicate\Tables\Refp\ArticleAssoProduitsTable;
use Database\ArcadiaReplicate\Tables\Refp\ArticleRefTable;
use Database\ArcadiaReplicate\Tables\Refp\ArtRayonTable;
use Database\ArcadiaReplicate\Tables\Refp\AssoCommunesCpTable;
use Database\ArcadiaReplicate\Tables\Refp\AssoIncoZoneVersioCcialTable;
use Database\ArcadiaReplicate\Tables\Refp\AssoIncoZoneVersioMktTable;
use Database\ArcadiaReplicate\Tables\Refp\AssoIncoZoneVersioQualTable;
use Database\ArcadiaReplicate\Tables\Refp\CalibreOeufsTable;
use Database\ArcadiaReplicate\Tables\Refp\FamRgptTable;
use Database\ArcadiaReplicate\Tables\Refp\FamVenteTable;
use Database\ArcadiaReplicate\Tables\Refp\GroupementQualTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoAllegationsTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoAllergeneTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoAssoAllergeneTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoAssoTraceTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoBriqueGpcTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoCompoTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoDoaTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoInterprofessionTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoNeaTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoOrigininfoTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoSitProdTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoSuiviEnvoiTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoTable;
use Database\ArcadiaReplicate\Tables\Refp\IncoVersionTable;
use Database\ArcadiaReplicate\Tables\Refp\InseeCommunesTable;
use Database\ArcadiaReplicate\Tables\Refp\MarqueTable;
use Database\ArcadiaReplicate\Tables\Refp\MediaAssoArticleTable;
use Database\ArcadiaReplicate\Tables\Refp\MutTable;
use Database\ArcadiaReplicate\Tables\Refp\NdpTable;
use Database\ArcadiaReplicate\Tables\Refp\OrgCertifTable;
use Database\ArcadiaReplicate\Tables\Refp\PaletteIncoTable;
use Database\ArcadiaReplicate\Tables\Refp\RuPersonneSirhTable;
use Database\ArcadiaReplicate\Tables\Refp\ServiceConsoIncoTable;
use Database\ArcadiaReplicate\Tables\Refp\SiteProdGrpTable;
use Database\ArcadiaReplicate\Tables\Refp\SocieteInvTable;
use Database\ArcadiaReplicate\Tables\Refp\SousFamTable;
use Database\ArcadiaReplicate\Tables\Refp\TypeConditTable;
use Database\ArcadiaReplicate\Tables\Refp\TypeConservationTable;
use Database\ArcadiaReplicate\Tables\Refp\TypEmbTable;
use Database\ArcadiaReplicate\Tables\Refp\UtilisableTable;
use Database\ArcadiaReplicate\Views\Gcp\DunIncoInfView;
use Database\ArcadiaReplicate\Views\Gcp\IncoLangView;
use Database\ArcadiaReplicate\Views\Gcp\VIncoArtSiteView;
use Database\ArcadiaReplicate\Views\Refp\ArticleRefGencodView;
use Database\ArcadiaReplicate\Views\Refp\DunIncoNosocView;
use Database\ArcadiaReplicate\Views\Refp\DunIncoView;
use Database\ArcadiaReplicate\Views\Refp\EpurerFamVenteView;
use Database\ArcadiaReplicate\Views\Refp\IncoArticleView;
use Database\ArcadiaReplicate\Views\Refp\IncoCompoNutriscoreView;
use Database\ArcadiaReplicate\Views\Refp\IncoSocRefIncoView;
use Database\ArcadiaReplicate\Views\Refp\SitProdIncoView;
use Database\ArcadiaReplicate\Views\Refp\SocDlcIncoView;
use Database\ArcadiaReplicate\Views\Refp\VisuelExportGenfiView;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
final class Migrator
{
/** @var list<class-string<TableOrView>> */
public const DEFINITIONS = [
DunIncoInfView::class,
IncoLangView::class,
VIncoArtSiteView::class,
MetaUtilTable::class,
ArticleRefTable::class,
AssoIncoZoneVersioCcialTable::class,
AssoIncoZoneVersioMktTable::class,
AssoIncoZoneVersioQualTable::class,
IncoTable::class,
IncoCompoTable::class,
IncoOrigininfoTable::class,
IncoVersionTable::class,
RuPersonneSirhTable::class,
AdditifTable::class,
ArticleAssoProduitsTable::class,
ArticleRefGencodView::class,
ArtRayonTable::class,
AssoCommunesCpTable::class,
CalibreOeufsTable::class,
DunIncoView::class,
DunIncoNosocView::class,
EpurerFamVenteView::class,
FamRgptTable::class,
FamVenteTable::class,
GroupementQualTable::class,
IncoAllegationsTable::class,
IncoAllergeneTable::class,
IncoArticleView::class,
IncoAssoAllergeneTable::class,
IncoAssoTraceTable::class,
IncoBriqueGpcTable::class,
IncoCompoNutriscoreView::class,
IncoDoaTable::class,
IncoInterprofessionTable::class,
IncoNeaTable::class,
IncoSitProdTable::class,
IncoSocRefIncoView::class,
IncoSuiviEnvoiTable::class,
InseeCommunesTable::class,
MarqueTable::class,
MediaAssoArticleTable::class,
MutTable::class,
NdpTable::class,
OrgCertifTable::class,
PaletteIncoTable::class,
ServiceConsoIncoTable::class,
SiteProdGrpTable::class,
SitProdIncoView::class,
SocDlcIncoView::class,
SocieteInvTable::class,
SousFamTable::class,
TypeConditTable::class,
TypeConservationTable::class,
TypEmbTable::class,
UtilisableTable::class,
VisuelExportGenfiView::class,
];
public function __construct(private readonly string $connection)
{
}
public function up(): void
{
$conn = DB::connection($this->connection);
/** @var list<string> */
$schemas = [];
foreach (self::DEFINITIONS as $definition) {
$schemas[$definition::schemaName()] = $definition::schemaName();
}
if ($conn->getDriverName() === 'oracle') {
foreach ($schemas as $schemaUser) {
try {
$conn->statement("CREATE USER {$schemaUser} IDENTIFIED BY {$schemaUser} DEFAULT TABLESPACE USERS QUOTA UNLIMITED ON USERS");
} catch (\Throwable $e) {
unset($e);
}
}
}
if (app()->environment('local', 'testing')) {
$this->down();
}
$schema = Schema::connection($this->connection);
foreach (self::DEFINITIONS as $definition) {
$definition::up($schema);
}
}
public function down(): void
{
$schema = Schema::connection($this->connection);
foreach (array_reverse(self::DEFINITIONS) as $definition) {
$definition::down($schema);
}
$conn = DB::connection($this->connection);
if ($conn->getDriverName() === 'oracle') {
try {
$conn->statement('PURGE RECYCLEBIN');
} catch (\Throwable $e) {
unset($e);
}
}
}
public static function runUp(string $connection): void
{
(new self($connection))->up();
}
public static function runDown(string $connection): void
{
(new self($connection))->down();
}
}