using Microsoft.EntityFrameworkCore;
namespace MealPlan.Api.Data;
///
/// Resyncs PostgreSQL identity sequences after bulk imports or manual ID inserts.
///
public static class SequenceMaintenance
{
private static readonly (string Table, string Column)[] IdentityTables =
[
("Recipes", "Id"),
("Ingredients", "Id"),
("RecipeSteps", "Id"),
("RecipeGeneratorSessions", "Id"),
("DietGeneratorSessions", "Id"),
("DietGeneratorDraftMeals", "Id"),
("DietGeneratorDraftMealIngredients", "Id"),
("MealPlanEntries", "Id"),
];
public static async Task> ResyncIdentitySequencesAsync(
AppDbContext db,
CancellationToken ct = default)
{
var messages = new List();
foreach (var (table, column) in IdentityTables)
{
var sql = $"""
SELECT setval(
pg_get_serial_sequence('diet."{table}"', '{column}'),
COALESCE((SELECT MAX("{column}") FROM diet."{table}"), 1),
(SELECT MAX("{column}") IS NOT NULL FROM diet."{table}"))
""";
try
{
await db.Database.ExecuteSqlRawAsync(sql, ct);
messages.Add($"Resynced diet.\"{table}\".\"{column}\" sequence.");
}
catch (Exception ex)
{
messages.Add($"Skipped diet.\"{table}\": {ex.Message}");
}
}
return messages;
}
}