From 1aec1eb3f0822e17793d43e040efdf127ea8e561 Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 12 Feb 2021 22:10:56 +0800 Subject: feat: Add databse custom migration service. --- .../Services/Migration/CustomMigrationManager.cs | 55 +++++++++++++++++ .../Services/Migration/ICustomMigration.cs | 11 ++++ .../MigationServiceCollectionExtensions.cs | 14 +++++ .../TimelinePostContentToDataMigration.cs | 69 ++++++++++++++++++++++ 4 files changed, 149 insertions(+) create mode 100644 BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs create mode 100644 BackEnd/Timeline/Services/Migration/ICustomMigration.cs create mode 100644 BackEnd/Timeline/Services/Migration/MigationServiceCollectionExtensions.cs create mode 100644 BackEnd/Timeline/Services/Migration/TimelinePostContentToDataMigration.cs (limited to 'BackEnd/Timeline/Services/Migration') diff --git a/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs b/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs new file mode 100644 index 00000000..ba86e10b --- /dev/null +++ b/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs @@ -0,0 +1,55 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Timeline.Entities; + +namespace Timeline.Services.Migration +{ + public interface ICustomMigrationManager + { + Task Migrate(); + } + + public class CustomMigrationManager : ICustomMigrationManager + { + private IEnumerable _migrations; + private DatabaseContext _database; + + private ILogger _logger; + + public CustomMigrationManager(IEnumerable migrations, DatabaseContext database, ILogger logger) + { + _migrations = migrations; + _database = database; + _logger = logger; + } + + public async Task Migrate() + { + foreach (var migration in _migrations) + { + var name = migration.GetName(); + var did = await _database.Migrations.AnyAsync(m => m.Name == name); + + _logger.LogInformation("Found custom migration '{0}'. Did: {1}.", name, did); + + if (!did) + { + _logger.LogInformation("Begin custom migration '{0}'.", name); + + await using var transaction = await _database.Database.BeginTransactionAsync(); + + await migration.Execute(_database); + + _database.Migrations.Add(new MigrationEntity { Name = name }); + await _database.SaveChangesAsync(); + + await transaction.CommitAsync(); + + _logger.LogInformation("End custom migration '{0}'.", name); + } + } + } + } +} diff --git a/BackEnd/Timeline/Services/Migration/ICustomMigration.cs b/BackEnd/Timeline/Services/Migration/ICustomMigration.cs new file mode 100644 index 00000000..1f47df1e --- /dev/null +++ b/BackEnd/Timeline/Services/Migration/ICustomMigration.cs @@ -0,0 +1,11 @@ +using System.Threading.Tasks; +using Timeline.Entities; + +namespace Timeline.Services.Migration +{ + public interface ICustomMigration + { + string GetName(); + Task Execute(DatabaseContext database); + } +} diff --git a/BackEnd/Timeline/Services/Migration/MigationServiceCollectionExtensions.cs b/BackEnd/Timeline/Services/Migration/MigationServiceCollectionExtensions.cs new file mode 100644 index 00000000..0e6f6c0a --- /dev/null +++ b/BackEnd/Timeline/Services/Migration/MigationServiceCollectionExtensions.cs @@ -0,0 +1,14 @@ +using Microsoft.Extensions.DependencyInjection; + +namespace Timeline.Services.Migration +{ + public static class MigrationServiceCollectionExtensions + { + public static IServiceCollection AddCustomMigration(this IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + return services; + } + } +} \ No newline at end of file diff --git a/BackEnd/Timeline/Services/Migration/TimelinePostContentToDataMigration.cs b/BackEnd/Timeline/Services/Migration/TimelinePostContentToDataMigration.cs new file mode 100644 index 00000000..de2e2183 --- /dev/null +++ b/BackEnd/Timeline/Services/Migration/TimelinePostContentToDataMigration.cs @@ -0,0 +1,69 @@ +using System.Text; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using SixLabors.ImageSharp; +using Timeline.Entities; +using Timeline.Models; + +namespace Timeline.Services.Migration +{ + public class TimelinePostContentToDataMigration : ICustomMigration + { + private readonly IDataManager _dataManager; + + public TimelinePostContentToDataMigration(IDataManager dataManager) + { + _dataManager = dataManager; + } + + public string GetName() => "TimelinePostContentToData"; + + public async Task Execute(DatabaseContext database) + { +#pragma warning disable CS0618 + var postEntities = await database.TimelinePosts.ToListAsync(); + + foreach (var postEntity in postEntities) + { + if (postEntity.Content is null) + { + postEntity.Deleted = true; + } + else + { + if (postEntity.ContentType == "text") + { + var tag = await _dataManager.RetainEntry(Encoding.UTF8.GetBytes(postEntity.Content), false); + database.TimelinePostData.Add(new TimelinePostDataEntity + { + DataTag = tag, + Kind = MimeTypes.TextPlain, + Index = 0, + PostId = postEntity.Id, + LastUpdated = postEntity.LastUpdated + }); + } + else + { + var data = await _dataManager.GetEntryAndCheck(postEntity.Content, "Old image content does not have corresponding data with the tag."); + var format = Image.DetectFormat(data); + database.TimelinePostData.Add(new TimelinePostDataEntity + { + DataTag = postEntity.Content, + Kind = format.DefaultMimeType, + Index = 0, + PostId = postEntity.Id, + LastUpdated = postEntity.LastUpdated + }); + } + } + postEntity.Content = null; + postEntity.ContentType = null; + postEntity.ExtraContent = null; + } + + await database.SaveChangesAsync(); +#pragma warning restore CS0618 + } + } +} -- cgit v1.2.3 From 83910122bfd0aa9bd207b6d5f631774415312716 Mon Sep 17 00:00:00 2001 From: crupest Date: Fri, 12 Feb 2021 22:32:10 +0800 Subject: fix: Fix migration bug. --- BackEnd/Timeline/Program.cs | 14 +++++++------- BackEnd/Timeline/Properties/launchSettings.json | 5 ++--- .../Timeline/Services/Migration/CustomMigrationManager.cs | 4 ++-- 3 files changed, 11 insertions(+), 12 deletions(-) (limited to 'BackEnd/Timeline/Services/Migration') diff --git a/BackEnd/Timeline/Program.cs b/BackEnd/Timeline/Program.cs index 0f75908f..19fa6e37 100644 --- a/BackEnd/Timeline/Program.cs +++ b/BackEnd/Timeline/Program.cs @@ -4,6 +4,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System.Resources; +using System.Threading.Tasks; using Timeline.Entities; using Timeline.Services; using Timeline.Services.Migration; @@ -14,20 +15,19 @@ namespace Timeline { public static class Program { - public static void Main(string[] args) + public async static Task Main(string[] args) { var host = CreateWebHostBuilder(args).Build(); + var databaseBackupService = host.Services.GetRequiredService(); + databaseBackupService.BackupNow(); + using (var scope = host.Services.CreateScope()) { - var databaseBackupService = scope.ServiceProvider.GetRequiredService(); - databaseBackupService.BackupNow(); - var databaseContext = scope.ServiceProvider.GetRequiredService(); - databaseContext.Database.Migrate(); - + await databaseContext.Database.MigrateAsync(); var customMigrationManager = scope.ServiceProvider.GetRequiredService(); - customMigrationManager.Migrate(); + await customMigrationManager.Migrate(); } host.Run(); diff --git a/BackEnd/Timeline/Properties/launchSettings.json b/BackEnd/Timeline/Properties/launchSettings.json index 851fc6a8..3c8a465b 100644 --- a/BackEnd/Timeline/Properties/launchSettings.json +++ b/BackEnd/Timeline/Properties/launchSettings.json @@ -5,8 +5,7 @@ "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_FRONTEND": "Proxy" - }, - "applicationUrl": "http://0.0.0.0:5000" + } }, "Dev-Mock": { "commandName": "Project", @@ -30,4 +29,4 @@ } } } -} \ No newline at end of file +} diff --git a/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs b/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs index ba86e10b..f6f156cc 100644 --- a/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs +++ b/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs @@ -36,7 +36,7 @@ namespace Timeline.Services.Migration if (!did) { - _logger.LogInformation("Begin custom migration '{0}'.", name); + _logger.LogWarning("Begin custom migration '{0}'.", name); await using var transaction = await _database.Database.BeginTransactionAsync(); @@ -47,7 +47,7 @@ namespace Timeline.Services.Migration await transaction.CommitAsync(); - _logger.LogInformation("End custom migration '{0}'.", name); + _logger.LogWarning("End custom migration '{0}'.", name); } } } -- cgit v1.2.3