diff --git a/JobTrackerApi/Program.cs b/JobTrackerApi/Program.cs index 6680dd4..a5487c9 100644 --- a/JobTrackerApi/Program.cs +++ b/JobTrackerApi/Program.cs @@ -723,11 +723,62 @@ CREATE TABLE IF NOT EXISTS "GmailConnections" ( var admin = users.FindByEmailAsync(adminEmail).GetAwaiter().GetResult(); if (admin is not null) { - db.Database.ExecuteSqlRaw( - "UPDATE Companies SET OwnerUserId = {0} WHERE OwnerUserId IS NULL;" + - "UPDATE JobApplications SET OwnerUserId = {0} WHERE OwnerUserId IS NULL;", - admin.Id - ); + try + { + using var conn = db.Database.GetDbConnection(); + conn.Open(); + + static bool ColumnExists(DbConnection c, string providerName, string table, string column) + { + using var cmd = c.CreateCommand(); + if (providerName is "mysql" or "mariadb") + { + var databaseName = c.Database; + cmd.CommandText = "SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schema AND TABLE_NAME = @table AND COLUMN_NAME = @column LIMIT 1;"; + + var schemaParam = cmd.CreateParameter(); + schemaParam.ParameterName = "@schema"; + schemaParam.Value = databaseName; + cmd.Parameters.Add(schemaParam); + + var tableParam = cmd.CreateParameter(); + tableParam.ParameterName = "@table"; + tableParam.Value = table; + cmd.Parameters.Add(tableParam); + + var columnParam = cmd.CreateParameter(); + columnParam.ParameterName = "@column"; + columnParam.Value = column; + cmd.Parameters.Add(columnParam); + } + else + { + cmd.CommandText = $"SELECT 1 FROM pragma_table_info('{table}') WHERE name = '{column}' LIMIT 1;"; + } + + return cmd.ExecuteScalar() is not null; + } + + var companyOwnershipExists = ColumnExists(conn, provider, "Companies", "OwnerUserId"); + var jobOwnershipExists = ColumnExists(conn, provider, "JobApplications", "OwnerUserId"); + + if (companyOwnershipExists || jobOwnershipExists) + { + if (companyOwnershipExists) + { + db.Database.ExecuteSqlRaw("UPDATE Companies SET OwnerUserId = {0} WHERE OwnerUserId IS NULL;", admin.Id); + } + + if (jobOwnershipExists) + { + db.Database.ExecuteSqlRaw("UPDATE JobApplications SET OwnerUserId = {0} WHERE OwnerUserId IS NULL;", admin.Id); + } + } + } + catch (Exception ex) + { + app.Logger.LogWarning(ex, "Skipping legacy ownership claim because the current schema does not support it yet."); + } } } }