Files
unionflow-server-impl-quarkus/audit-migrations-simple.ps1
dahoud 00b981c510 fix(backend): corriger format log UUID dans OrganisationResource
Erreur corrigée : UUID passé à %d (entier) au lieu de %s (string)
- OrganisationResource.java:227 : LOG.infof(..., %s, id)

Note : 36 tests échouent encore (problèmes d'auth, validation, NPE)
Couverture actuelle : 50% (objectif 100% reporté)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-03-18 02:08:27 +00:00

249 lines
8.3 KiB
PowerShell

# Script d'audit simplifié des migrations Flyway vs Entités JPA
# Auteur: Lions Dev
# Date: 2026-03-13
$ErrorActionPreference = "Stop"
$projectRoot = $PSScriptRoot
Write-Host "`n╔══════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host "║ Audit Migrations Flyway vs Entités JPA - UnionFlow ║" -ForegroundColor Cyan
Write-Host "╚══════════════════════════════════════════════════════════╝`n" -ForegroundColor Cyan
# 1. Extraire toutes les entités et leurs noms de tables
Write-Host "[1/3] Extraction des entités JPA..." -ForegroundColor Yellow
$entityFiles = Get-ChildItem -Path "$projectRoot\src\main\java\dev\lions\unionflow\server\entity" -Filter "*.java" -Recurse | Where-Object { $_.Name -ne "package-info.java" }
$entities = @{}
foreach ($file in $entityFiles) {
$content = Get-Content $file.FullName -Raw
# Extraire le nom de la classe
if ($content -match 'class\s+(\w+)') {
$className = $Matches[1]
$tableName = $null
# Chercher @Table(name="...")
if ($content -match '@Table.*name\s*=\s*"(\w+)"') {
$tableName = $Matches[1]
} else {
# Conversion basique du nom de classe vers snake_case
# Organisation -> organisation, TransactionApproval -> transaction_approval
$temp = $className -replace '([a-z])([A-Z])', '$1_$2'
$tableName = $temp.ToLower()
}
$entities[$className] = $tableName
Write-Host "$className : $tableName" -ForegroundColor Gray
}
}
Write-Host "$($entities.Count) entités trouvées" -ForegroundColor Green
# 2. Lister toutes les migrations et extraire les tables
Write-Host "`n[2/3] Analyse des migrations Flyway..." -ForegroundColor Yellow
$migrations = Get-ChildItem -Path "$projectRoot\src\main\resources\db\migration" -Filter "V*.sql" | Sort-Object Name
$allTables = @{}
foreach ($migration in $migrations) {
Write-Host "$($migration.Name)" -ForegroundColor Gray
$content = Get-Content $migration.FullName -Raw
# Méthode simple : chercher ligne par ligne
$lines = Get-Content $migration.FullName
foreach ($line in $lines) {
if ($line -match '^\s*CREATE\s+TABLE') {
# Extraire le nom de la table
if ($line -match 'TABLE\s+(IF\s+NOT\s+EXISTS\s+)?(\w+)') {
$tableName = $Matches[2]
if (-not $allTables.ContainsKey($tableName)) {
$allTables[$tableName] = @()
}
$allTables[$tableName] += $migration.Name
Write-Host "$tableName" -ForegroundColor DarkGray
}
}
}
}
Write-Host "$($allTables.Keys.Count) tables uniques trouvées dans les migrations" -ForegroundColor Green
# 3. Comparaison
Write-Host "`n[3/3] Comparaison et génération du rapport..." -ForegroundColor Yellow
$report = @"
# Rapport d'Audit - Migrations Flyway vs Entités JPA
Date: $(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
## Résumé
- **Entités JPA**: $($entities.Count)
- **Tables dans migrations**: $($allTables.Keys.Count)
---
## 1. Entités JPA et leurs tables attendues
| Entité | Table attendue | Existe dans migrations? | Migrations |
|--------|----------------|------------------------|------------|
"@
$okCount = 0
$missingCount = 0
foreach ($entity in $entities.Keys | Sort-Object) {
$tableName = $entities[$entity]
$exists = $allTables.ContainsKey($tableName)
$migrations = if ($exists) { $allTables[$tableName] -join ", " } else { "❌ MANQUANT" }
if ($exists) {
$okCount++
$report += "`n| $entity | ``$tableName`` | ✅ Oui | $migrations |"
} else {
$missingCount++
$report += "`n| **$entity** | ``$tableName`` | **❌ NON** | - |"
}
}
$report += @"
**Résultat**: $okCount/$($entities.Count) entités ont une table correspondante, $missingCount manquantes.
---
## 2. Tables dans migrations SANS entité correspondante
"@
$orphanTables = @()
foreach ($table in $allTables.Keys | Sort-Object) {
$found = $false
foreach ($entity in $entities.Keys) {
if ($entities[$entity] -eq $table) {
$found = $true
break
}
}
if (-not $found) {
$orphanTables += @{
Table = $table
Migrations = $allTables[$table] -join ", "
}
}
}
if ($orphanTables.Count -gt 0) {
$report += "**⚠️ ATTENTION**: $($orphanTables.Count) tables n'ont pas d'entité correspondante!`n`n"
$report += "| Table | Migration(s) | Action recommandée |`n"
$report += "|-------|--------------|-------------------|`n"
foreach ($item in $orphanTables) {
$report += "| ``$($item.Table)`` | $($item.Migrations) | Supprimer ou créer entité |`n"
}
} else {
$report += "✅ Toutes les tables ont une entité correspondante.`n"
}
$report += @"
---
## 3. Duplications de CREATE TABLE
"@
$duplicates = $allTables.GetEnumerator() | Where-Object { $_.Value.Count -gt 1 }
if ($duplicates.Count -gt 0) {
$report += "**⚠️ ATTENTION**: $($duplicates.Count) tables sont créées dans plusieurs migrations!`n`n"
$report += "| Table | Migrations | Action recommandée |`n"
$report += "|-------|------------|-------------------|`n"
foreach ($dup in $duplicates | Sort-Object { $_.Key }) {
$report += "| ``$($dup.Key)`` | $($dup.Value -join ", ") | Garder seulement une version |`n"
}
} else {
$report += "✅ Aucune duplication détectée.`n"
}
$report += @"
---
## Recommandations de nettoyage
### Priorité 1 - Tables manquantes ($missingCount)
"@
if ($missingCount -gt 0) {
$report += "`nCréer les tables manquantes pour ces entités :`n`n"
foreach ($entity in $entities.Keys | Sort-Object) {
$tableName = $entities[$entity]
if (-not $allTables.ContainsKey($tableName)) {
$report += "- [ ] ``$tableName`` (entité: $entity)`n"
}
}
} else {
$report += "`n✅ Aucune table manquante.`n"
}
$report += @"
### Priorité 2 - Tables obsolètes ($($orphanTables.Count))
"@
if ($orphanTables.Count -gt 0) {
$report += "`nSupprimer ces tables des migrations (ou créer les entités) :`n`n"
foreach ($item in $orphanTables | Sort-Object { $_.Table }) {
$report += "- [ ] ``$($item.Table)`` (migrations: $($item.Migrations))`n"
}
} else {
$report += "`n✅ Aucune table obsolète.`n"
}
$report += @"
### Priorité 3 - Duplications ($($duplicates.Count))
"@
if ($duplicates.Count -gt 0) {
$report += "`nÉliminer les duplications en gardant seulement la version avec IF NOT EXISTS :`n`n"
foreach ($dup in $duplicates | Sort-Object { $_.Key }) {
$report += "- [ ] ``$($dup.Key)`` → Nettoyer dans: $($dup.Value -join ", ")`n"
}
} else {
$report += "`n✅ Aucune duplication.`n"
}
$report += @"
---
*Généré par audit-migrations-simple.ps1 - Lions Dev*
"@
# Sauvegarder le rapport
$reportPath = "$projectRoot\AUDIT_MIGRATIONS.md"
$report | Out-File -FilePath $reportPath -Encoding UTF8
Write-Host "`n✅ Rapport sauvegardé: $reportPath" -ForegroundColor Green
# Résumé
Write-Host "`n╔══════════════════════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host "║ RÉSUMÉ ║" -ForegroundColor Cyan
Write-Host "╚══════════════════════════════════════════════════════════╝" -ForegroundColor Cyan
Write-Host " ✅ OK: $okCount/$($entities.Count)" -ForegroundColor Green
Write-Host " ❌ Tables manquantes: $missingCount" -ForegroundColor $(if ($missingCount -gt 0) { "Yellow" } else { "Green" })
Write-Host " ⚠️ Tables orphelines: $($orphanTables.Count)" -ForegroundColor $(if ($orphanTables.Count -gt 0) { "Yellow" } else { "Green" })
Write-Host " ⚠️ Duplications: $($duplicates.Count)" -ForegroundColor $(if ($duplicates.Count -gt 0) { "Red" } else { "Green" })
Write-Host "`n📄 Rapport complet: $reportPath`n" -ForegroundColor Cyan