mirror of
https://git.v0l.io/Kieran/void.cat.git
synced 2025-03-27 16:41:44 +01:00
Co-authored-by: Kieran <kieran@harkin.me> Reviewed-on: https://git.v0l.io/Kieran/void.cat/pulls/65
89 lines
3.4 KiB
C#
89 lines
3.4 KiB
C#
using System.Data.Common;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Npgsql;
|
|
using VoidCat.Model;
|
|
|
|
namespace VoidCat.Services.Migrations;
|
|
|
|
public class EFMigrationSetup : IMigration
|
|
{
|
|
private readonly VoidContext _db;
|
|
private readonly VoidSettings _settings;
|
|
|
|
public EFMigrationSetup(VoidContext db, VoidSettings settings)
|
|
{
|
|
_db = db;
|
|
_settings = settings;
|
|
}
|
|
|
|
public int Order => -99;
|
|
|
|
public async ValueTask<IMigration.MigrationResult> Migrate(string[] args)
|
|
{
|
|
if (!_settings.HasPostgres()) return IMigration.MigrationResult.Skipped;
|
|
|
|
var conn = (_db.Database.GetDbConnection() as NpgsqlConnection)!;
|
|
await conn.OpenAsync();
|
|
try
|
|
{
|
|
await using var cmd = new NpgsqlCommand("select max(\"Version\") from \"VersionInfo\"", conn);
|
|
|
|
var vMax = await cmd.ExecuteScalarAsync() as long?;
|
|
if (!(vMax > 0)) return IMigration.MigrationResult.Skipped;
|
|
|
|
await PrepEfMigration(conn);
|
|
}
|
|
catch (DbException dx) when (dx.SqlState is "42P01")
|
|
{
|
|
//ignored, VersionInfo does not exist
|
|
return IMigration.MigrationResult.Skipped;
|
|
}
|
|
|
|
return IMigration.MigrationResult.Completed;
|
|
}
|
|
|
|
private static async Task PrepEfMigration(NpgsqlConnection conn)
|
|
{
|
|
await using var tx = await conn.BeginTransactionAsync();
|
|
|
|
await new NpgsqlCommand(@"
|
|
ALTER TABLE ""Files"" ALTER COLUMN ""Size"" TYPE numeric(20) USING ""Size""::numeric;
|
|
ALTER TABLE ""Payment"" RENAME COLUMN ""File"" TO ""FileId"";
|
|
ALTER TABLE ""UserFiles"" RENAME COLUMN ""File"" TO ""FileId"";
|
|
ALTER TABLE ""UserFiles"" RENAME COLUMN ""User"" TO ""UserId"";
|
|
ALTER TABLE ""UserRoles"" RENAME COLUMN ""User"" TO ""UserId"";
|
|
ALTER TABLE ""UsersAuthToken"" RENAME COLUMN ""User"" TO ""UserId"";
|
|
ALTER TABLE ""UsersAuthToken"" ADD ""IdToken"" text NULL;
|
|
ALTER TABLE ""VirusScanResult"" RENAME COLUMN ""File"" TO ""FileId"";
|
|
ALTER TABLE ""ApiKey"" RENAME CONSTRAINT ""FK_ApiKey_UserId_Users_Id"" TO ""FK_ApiKey_Users_UserId"";
|
|
ALTER TABLE ""UserFiles"" RENAME CONSTRAINT ""FK_UserFiles_File_Files_Id"" TO ""FK_UserFiles_Files_FileId"";
|
|
ALTER TABLE ""UserFiles"" RENAME CONSTRAINT ""FK_UserFiles_User_Users_Id"" TO ""FK_UserFiles_Users_UserId"";
|
|
ALTER TABLE ""UserRoles"" RENAME CONSTRAINT ""FK_UserRoles_User_Users_Id"" TO ""FK_UserRoles_Users_UserId"";
|
|
ALTER TABLE ""UsersAuthToken"" RENAME CONSTRAINT ""FK_UsersAuthToken_User_Users_Id"" TO ""FK_UsersAuthToken_Users_UserId"";
|
|
ALTER TABLE ""VirusScanResult"" RENAME CONSTRAINT ""FK_VirusScanResult_File_Files_Id"" TO ""FK_VirusScanResult_Files_FileId"";
|
|
|
|
DROP TABLE ""EmailVerification"";
|
|
DROP TABLE ""PaymentOrderLightning"";
|
|
DROP TABLE ""PaymentOrder"";
|
|
DROP TABLE ""PaymentStrike"";
|
|
DROP TABLE ""Payment"";
|
|
DROP TABLE ""VersionInfo"";
|
|
", conn, tx).ExecuteNonQueryAsync();
|
|
|
|
// manually create init migration entry for EF to skip Init migration
|
|
await new NpgsqlCommand(@"
|
|
CREATE TABLE ""__EFMigrationsHistory"" (
|
|
""MigrationId"" varchar(150) NOT NULL,
|
|
""ProductVersion"" varchar(32) NOT NULL,
|
|
CONSTRAINT ""PK___EFMigrationsHistory"" PRIMARY KEY (""MigrationId"")
|
|
)", conn, tx).ExecuteNonQueryAsync();
|
|
|
|
await new NpgsqlCommand(
|
|
"INSERT INTO \"__EFMigrationsHistory\" (\"MigrationId\", \"ProductVersion\") VALUES('20230503115108_Init', '7.0.5')", conn,
|
|
tx)
|
|
.ExecuteNonQueryAsync();
|
|
|
|
await tx.CommitAsync();
|
|
}
|
|
}
|