From 3e96405954df43cbeeef17f27e1a3b1d45323ba0 Mon Sep 17 00:00:00 2001
From: Toastie <toastie@toastiet0ast.com>
Date: Fri, 24 Jan 2025 18:30:37 +1300
Subject: [PATCH] updated migrate.ps1

---
 src/EllieBot/migrate.ps1 | 102 +++++++++++++++++++++------------------
 1 file changed, 54 insertions(+), 48 deletions(-)

diff --git a/src/EllieBot/migrate.ps1 b/src/EllieBot/migrate.ps1
index 7a6d4a0..eac43a4 100644
--- a/src/EllieBot/migrate.ps1
+++ b/src/EllieBot/migrate.ps1
@@ -1,49 +1,55 @@
-if ($args.Length -eq 0) {
-    Write-Host "Please provide a migration name." -ForegroundColor Red
-}
-else {
-    $migrationName = $args[0]
-    
-    # find the first .cs item in the folder and get the name without extension
-    $firstMigration = (Get-ChildItem -Path "Migrations/Sqlite" -Filter *.cs | Select-Object -First 1).BaseName
-    $firstPgMigration = (Get-ChildItem -Path "Migrations/PostgreSql" -Filter *.cs | Select-Object -First 1).BaseName
-    
-    dotnet build EllieBot.csproj
-     
-    dotnet ef migrations add "${migrationName}_p1" --context SqliteContext --project EllieBot.csproj --no-build
-    dotnet ef migrations add "${migrationName}_p1" --context PostgresqlContext --project EllieBot.csproj --no-build
+param(
+    [Parameter(Mandatory=$true)]
+    [string]$MigrationName
+)
 
-    dotnet build EllieBot.csproj
-    dotnet ef migrations add $migrationName --context SqliteContext --project EllieBot.csproj --no-build
-      
-#     dotnet ef migrations add "${migrationName}_p1" --context PostgresqlContext --project EllieBot.csproj --no-build
-#     dotnet ef migrations add $migrationName --context PostgresqlContext --project EllieBot.csproj --no-build
-    
-    dotnet build EllieBot.csproj
-    
-    # list migrations as json, get their id and name
-    $sqliteMigNames = (dotnet ef migrations list --no-build --no-connect --project EllieBot.csproj -c SqliteContext --json | ConvertFrom-Json | Select-Object -Last 2)
-    
-    $sqliteMigName = ($sqliteMigNames[1] | Select-Object -ExpandProperty id).Split(' ')[0].Trim()
-    $sqliteTempMigName = ($sqliteMigNames[0] | Select-Object -ExpandProperty id).Split(' ')[0].Trim()
-    
-     
-#     $pgMigrationFullName = (dotnet ef migrations list --no-build --no-connect --project EllieBot.csproj -c PostgresqlContext | Select-Object -Last 1)
-#     $pgMigName1 = $sqliteMigNames[0].Split(' ')[0].Trim()
-#     $pgMigName2 = $sqliteMigNames[1].Split(' ')[0].Trim()
-    
-    dotnet ef migrations script $firstMigration $migrationName --project EllieBot.csproj --context SqliteContext --output Migrations/Sqlite/$sqliteMigName.sql --no-build
-#     dotnet ef migrations script $firstMigration $migrationName --project EllieBot.csproj --context PostgresqlContext --output Migrations/PostgreSql/$pgMigName2.sql --no-build
-    
-    # delete the old first migration .cs and .Designer.cs
-    Remove-Item "Migrations/Sqlite/$firstMigration.cs"
-    Remove-Item "Migrations/Sqlite/$firstMigration.Designer.cs"
-    Remove-Item "Migrations/Sqlite/${sqliteTempMigName}.cs"
-    Remove-Item "Migrations/Sqlite/${sqliteTempMigName}.Designer.cs"
-    
-    
-#     Remove-Item "Migrations/PostgreSql/$firstPgMigration.cs"
-#     Remove-Item "Migrations/PostgreSql/$firstPgMigration.Designer.cs"
-#     Remove-Item "Migrations/PostgreSql/${pgMigName1}.cs"
-#     Remove-Item "Migrations/PostgreSql/${pgMigName1}.Designer.cs"
-}
\ No newline at end of file
+Write-Output "Creating new migration..."
+
+# Step 1: Create initial migrations
+dotnet build
+
+# Get previous migration IDs
+$firstMigrationIdSqlite = (dotnet ef migrations list --context SqliteContext --no-build --no-connect | Select-Object -Last 2 | Select-Object -First 1) -split ' ' | Select-Object -First 1
+$firstMigrationIdPostgresql = (dotnet ef migrations list --context PostgresqlContext --no-build --no-connect | Select-Object -Last 2 | Select-Object -First 1) -split ' ' | Select-Object -First 1
+
+dotnet ef migrations add $MigrationName --context SqliteContext --output-dir "Migrations/Sqlite" --no-build
+dotnet ef migrations add $MigrationName --context PostgresqlContext --output-dir "Migrations/PostgreSql" --no-build
+
+dotnet build
+
+if ($LASTEXITCODE -ne 0) {
+    Write-Error "Error: Failed to create migrations"
+    exit 1
+}
+
+# Step 2: Generate SQL scripts
+Write-Output "Generating diff SQL scripts..."
+
+$newMigrationIdSqlite = (dotnet ef migrations list --context SqliteContext --no-build --no-connect | Select-Object -Last 2 | Select-Object -First 1) -split ' ' | Select-Object -First 1
+$newMigrationIdPostgresql = (dotnet ef migrations list --context PostgresqlContext --no-build --no-connect | Select-Object -Last 2 | Select-Object -First 1) -split ' ' | Select-Object -First 1
+
+dotnet ef migrations script ($firstMigrationIdSqlite -replace '^.*_', '') $MigrationName --context SqliteContext -o "Migrations/Sqlite/$newMigrationIdSqlite.sql" --no-build
+dotnet ef migrations script ($firstMigrationIdPostgresql -replace '^.*_', '') $MigrationName --context PostgresqlContext -o "Migrations/Postgresql/$newMigrationIdPostgresql.sql" --no-build
+
+if ($LASTEXITCODE -ne 0) {
+    Write-Error "Error: Failed to generate SQL script"
+    exit 1
+}
+
+# Step 3: Cleanup migration files
+Write-Output "Cleaning up all migration files..."
+
+Get-ChildItem "Migrations/Sqlite" -File | Where-Object { $_.Name -like '*_*.cs' } | ForEach-Object {
+    Write-Output "Deleting: $($_.Name)"
+    Remove-Item $_.FullName -ErrorAction SilentlyContinue
+}
+
+Get-ChildItem "Migrations/Postgresql" -File | Where-Object { $_.Name -like '*_*.cs' } | ForEach-Object {
+    Write-Output "Deleting: $($_.Name)"
+    Remove-Item $_.FullName -ErrorAction SilentlyContinue
+}
+
+# Step 4: Create new initial migrations
+Write-Output "Creating new initial migration..."
+dotnet ef migrations add $MigrationName --context SqliteContext --output-dir "Migrations/Sqlite" --no-build
+dotnet ef migrations add $MigrationName --context PostgresqlContext --output-dir "Migrations/PostgreSql" --no-build
\ No newline at end of file