< Summary

Information
Class: OzonOrdersWeb.Extensions.DatabaseMigrationExtensions
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Extensions/DatabaseMigrationExtensions.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 21
Coverable lines: 21
Total lines: 69
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
IsMigrateDatabaseRun(...)100%210%
MigrateDatabaseAsync()100%210%
MigrateAsync()0%620%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Extensions/DatabaseMigrationExtensions.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonRepositories.Context;
 3using OzonRepositories.Context.Identity;
 4
 5namespace OzonOrdersWeb.Extensions;
 6
 7/// <summary>
 8/// Накат EF-миграций из самого приложения.
 9///
 10/// Используется двумя способами:
 11///   • на сервере — шагом деплоя, из уже выкаченного образа:
 12///     docker run --rm ... ghcr.io/evgenibondarev/studio2:TAG --migrate-database
 13///   • локально — dotnet run --project OzonOrdersWeb -- --migrate-database
 14///
 15/// Именно приложение, а не заливка сгенерированного .sql клиентом mariadb: часть
 16/// миграций создаёт триггеры с многооператорным телом, и клиент разбил бы их
 17/// по внутренним «;». Здесь каждый оператор уходит в драйвер целиком.
 18/// </summary>
 19public static class DatabaseMigrationExtensions
 20{
 21    /// <summary>Аргумент командной строки, включающий режим наката миграций.</summary>
 22    public const string MigrateArgument = "--migrate-database";
 23
 24    public static bool IsMigrateDatabaseRun(string[] args) =>
 025        args.Contains(MigrateArgument, StringComparer.OrdinalIgnoreCase);
 26
 27    /// <summary>
 28    /// Накатывает миграции обоих контекстов и возвращает код возврата процесса.
 29    /// Хостинг при этом не стартует: веб-сервер, Hangfire и фоновые сервисы не поднимаются.
 30    /// </summary>
 31    public static async Task<int> MigrateDatabaseAsync(this WebApplication app)
 32    {
 033        using var scope = app.Services.CreateScope();
 034        var logger = app.Services.GetRequiredService<ILoggerFactory>().CreateLogger("DatabaseMigration");
 35
 36        try
 37        {
 038            await MigrateAsync<ApplicationDbContext>(scope.ServiceProvider, logger);
 039            await MigrateAsync<OzonIdentityOrderContext>(scope.ServiceProvider, logger);
 040            return 0;
 41        }
 042        catch (Exception ex)
 43        {
 044            logger.LogError(ex, "Накат миграций завершился ошибкой");
 045            return 1;
 46        }
 047    }
 48
 49    private static async Task MigrateAsync<TContext>(IServiceProvider services, ILogger logger)
 50        where TContext : DbContext
 51    {
 052        var context = services.GetRequiredService<TContext>();
 053        string name = typeof(TContext).Name;
 54
 055        var pending = (await context.Database.GetPendingMigrationsAsync()).ToList();
 056        if (pending.Count == 0)
 57        {
 058            logger.LogInformation("{Context}: применять нечего", name);
 059            return;
 60        }
 61
 062        logger.LogInformation("{Context}: применяю {Count} миграций: {Migrations}",
 063            name, pending.Count, string.Join(", ", pending));
 64
 065        await context.Database.MigrateAsync();
 66
 067        logger.LogInformation("{Context}: миграции применены", name);
 068    }
 69}