diff options
author | crupest <crupest@outlook.com> | 2021-04-23 17:28:18 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2021-04-23 17:37:37 +0800 |
commit | 6e067a28d8527726a2a17045bef0f0e3d3430ed5 (patch) | |
tree | 967ed4c84981d6b626a3370c726d35d1c3e2c2b4 /BackEnd/Timeline | |
parent | 6acef36dc717834605eda2af9e1738dac8fa2f6d (diff) | |
download | timeline-6e067a28d8527726a2a17045bef0f0e3d3430ed5.tar.gz timeline-6e067a28d8527726a2a17045bef0f0e3d3430ed5.tar.bz2 timeline-6e067a28d8527726a2a17045bef0f0e3d3430ed5.zip |
refactor: Refactor a lot.
Diffstat (limited to 'BackEnd/Timeline')
-rw-r--r-- | BackEnd/Timeline/Program.cs | 15 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/DatabaseBackupService.cs | 35 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/DatabaseManagement/DatabaseBackupService.cs | 37 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/DatabaseManagement/DatabaseCustomMigrator.cs | 56 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/DatabaseManagement/DatabaseManagementService.cs | 34 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/DatabaseManagement/IDatabaseCustomMigration.cs | 12 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/DatabaseManagement/MigationServiceCollectionExtensions.cs | 16 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/DatabaseManagement/TimelinePostContentToDataMigration.cs (renamed from BackEnd/Timeline/Services/Migration/TimelinePostContentToDataMigration.cs) | 15 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs | 55 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/Migration/ICustomMigration.cs | 11 | ||||
-rw-r--r-- | BackEnd/Timeline/Services/Migration/MigationServiceCollectionExtensions.cs | 14 | ||||
-rw-r--r-- | BackEnd/Timeline/Startup.cs | 6 |
12 files changed, 168 insertions, 138 deletions
diff --git a/BackEnd/Timeline/Program.cs b/BackEnd/Timeline/Program.cs index 19fa6e37..e16c27c5 100644 --- a/BackEnd/Timeline/Program.cs +++ b/BackEnd/Timeline/Program.cs @@ -7,7 +7,7 @@ using System.Resources; using System.Threading.Tasks;
using Timeline.Entities;
using Timeline.Services;
-using Timeline.Services.Migration;
+using Timeline.Services.DatabaseManagement;
[assembly: NeutralResourcesLanguage("en")]
@@ -19,18 +19,7 @@ namespace Timeline {
var host = CreateWebHostBuilder(args).Build();
- var databaseBackupService = host.Services.GetRequiredService<IDatabaseBackupService>();
- databaseBackupService.BackupNow();
-
- using (var scope = host.Services.CreateScope())
- {
- var databaseContext = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
- await databaseContext.Database.MigrateAsync();
- var customMigrationManager = scope.ServiceProvider.GetRequiredService<ICustomMigrationManager>();
- await customMigrationManager.Migrate();
- }
-
- host.Run();
+ await host.RunAsync();
}
public static IHostBuilder CreateWebHostBuilder(string[] args) =>
diff --git a/BackEnd/Timeline/Services/DatabaseBackupService.cs b/BackEnd/Timeline/Services/DatabaseBackupService.cs deleted file mode 100644 index a76b2a0d..00000000 --- a/BackEnd/Timeline/Services/DatabaseBackupService.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Globalization;
-using System.IO;
-
-namespace Timeline.Services
-{
- public interface IDatabaseBackupService
- {
- void BackupNow();
- }
-
- public class DatabaseBackupService : IDatabaseBackupService
- {
- private readonly IPathProvider _pathProvider;
- private readonly IClock _clock;
-
- public DatabaseBackupService(IPathProvider pathProvider, IClock clock)
- {
- _pathProvider = pathProvider;
- _clock = clock;
- }
-
- public void BackupNow()
- {
- var databasePath = _pathProvider.GetDatabaseFilePath();
- if (File.Exists(databasePath))
- {
- var backupDirPath = _pathProvider.GetDatabaseBackupDirectory();
- Directory.CreateDirectory(backupDirPath);
- var fileName = _clock.GetCurrentTime().ToString("yyyy-MM-ddTHH-mm-ss", CultureInfo.InvariantCulture);
- var path = Path.Combine(backupDirPath, fileName);
- File.Copy(databasePath, path);
- }
- }
- }
-}
diff --git a/BackEnd/Timeline/Services/DatabaseManagement/DatabaseBackupService.cs b/BackEnd/Timeline/Services/DatabaseManagement/DatabaseBackupService.cs new file mode 100644 index 00000000..c00b5f95 --- /dev/null +++ b/BackEnd/Timeline/Services/DatabaseManagement/DatabaseBackupService.cs @@ -0,0 +1,37 @@ +using Microsoft.EntityFrameworkCore;
+using System.Globalization;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+using Timeline.Entities;
+
+namespace Timeline.Services.DatabaseManagement
+{
+ public interface IDatabaseBackupService
+ {
+ Task BackupAsync(CancellationToken cancellationToken = default);
+ }
+
+ public class DatabaseBackupService : IDatabaseBackupService
+ {
+ private readonly DatabaseContext _database;
+ private readonly IPathProvider _pathProvider;
+ private readonly IClock _clock;
+
+ public DatabaseBackupService(DatabaseContext database, IPathProvider pathProvider, IClock clock)
+ {
+ _database = database;
+ _pathProvider = pathProvider;
+ _clock = clock;
+ }
+
+ public async Task BackupAsync(CancellationToken cancellationToken = default)
+ {
+ var backupDirPath = _pathProvider.GetDatabaseBackupDirectory();
+ Directory.CreateDirectory(backupDirPath);
+ var fileName = _clock.GetCurrentTime().ToString("yyyy-MM-ddTHH-mm-ss", CultureInfo.InvariantCulture);
+ var path = Path.Combine(backupDirPath, fileName);
+ await _database.Database.ExecuteSqlInterpolatedAsync($"VACUUM INTO {path}", cancellationToken);
+ }
+ }
+}
diff --git a/BackEnd/Timeline/Services/DatabaseManagement/DatabaseCustomMigrator.cs b/BackEnd/Timeline/Services/DatabaseManagement/DatabaseCustomMigrator.cs new file mode 100644 index 00000000..2180ad40 --- /dev/null +++ b/BackEnd/Timeline/Services/DatabaseManagement/DatabaseCustomMigrator.cs @@ -0,0 +1,56 @@ +using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Logging;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Timeline.Entities;
+
+namespace Timeline.Services.DatabaseManagement
+{
+ public interface IDatabaseCustomMigrator
+ {
+ Task MigrateAsync(CancellationToken cancellationToken = default);
+ }
+
+ public class DatabaseCustomMigrator : IDatabaseCustomMigrator
+ {
+ private IEnumerable<IDatabaseCustomMigration> _migrations;
+ private DatabaseContext _database;
+
+ private ILogger<DatabaseCustomMigrator> _logger;
+
+ public DatabaseCustomMigrator(IEnumerable<IDatabaseCustomMigration> migrations, DatabaseContext database, ILogger<DatabaseCustomMigrator> logger)
+ {
+ _migrations = migrations;
+ _database = database;
+ _logger = logger;
+ }
+
+ public async Task MigrateAsync(CancellationToken cancellationToken = default)
+ {
+ foreach (var migration in _migrations)
+ {
+ var name = migration.GetName();
+ var isApplied = await _database.Migrations.AnyAsync(m => m.Name == name, cancellationToken);
+
+ _logger.LogInformation("Found custom migration '{0}'. Applied: {1}.", name, isApplied);
+
+ if (!isApplied)
+ {
+ _logger.LogWarning("Begin custom migration '{0}'.", name);
+
+ await using var transaction = await _database.Database.BeginTransactionAsync(cancellationToken);
+
+ await migration.ExecuteAsync(_database, cancellationToken);
+
+ _database.Migrations.Add(new MigrationEntity { Name = name });
+ await _database.SaveChangesAsync(cancellationToken);
+
+ await transaction.CommitAsync(cancellationToken);
+
+ _logger.LogWarning("End custom migration '{0}'.", name);
+ }
+ }
+ }
+ }
+}
diff --git a/BackEnd/Timeline/Services/DatabaseManagement/DatabaseManagementService.cs b/BackEnd/Timeline/Services/DatabaseManagement/DatabaseManagementService.cs new file mode 100644 index 00000000..4d54d3dc --- /dev/null +++ b/BackEnd/Timeline/Services/DatabaseManagement/DatabaseManagementService.cs @@ -0,0 +1,34 @@ +using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.Hosting;
+using System.Threading;
+using System.Threading.Tasks;
+using Timeline.Entities;
+
+namespace Timeline.Services.DatabaseManagement
+{
+ public class DatabaseManagementService : IHostedService
+ {
+ private readonly DatabaseContext _database;
+ private readonly IDatabaseBackupService _backupService;
+ private readonly IDatabaseCustomMigrator _customMigrator;
+
+ public DatabaseManagementService(DatabaseContext database, IDatabaseBackupService backupService, IDatabaseCustomMigrator customMigrator)
+ {
+ _database = database;
+ _backupService = backupService;
+ _customMigrator = customMigrator;
+ }
+
+ public async Task StartAsync(CancellationToken cancellationToken = default)
+ {
+ await _backupService.BackupAsync(cancellationToken);
+ await _database.Database.MigrateAsync(cancellationToken);
+ await _customMigrator.MigrateAsync(cancellationToken);
+ }
+
+ public Task StopAsync(CancellationToken cancellationToken)
+ {
+ return Task.CompletedTask;
+ }
+ }
+}
diff --git a/BackEnd/Timeline/Services/DatabaseManagement/IDatabaseCustomMigration.cs b/BackEnd/Timeline/Services/DatabaseManagement/IDatabaseCustomMigration.cs new file mode 100644 index 00000000..7300ccbd --- /dev/null +++ b/BackEnd/Timeline/Services/DatabaseManagement/IDatabaseCustomMigration.cs @@ -0,0 +1,12 @@ +using System.Threading;
+using System.Threading.Tasks;
+using Timeline.Entities;
+
+namespace Timeline.Services.DatabaseManagement
+{
+ public interface IDatabaseCustomMigration
+ {
+ string GetName();
+ Task ExecuteAsync(DatabaseContext database, CancellationToken cancellationToken = default);
+ }
+}
diff --git a/BackEnd/Timeline/Services/DatabaseManagement/MigationServiceCollectionExtensions.cs b/BackEnd/Timeline/Services/DatabaseManagement/MigationServiceCollectionExtensions.cs new file mode 100644 index 00000000..d1f9b51c --- /dev/null +++ b/BackEnd/Timeline/Services/DatabaseManagement/MigationServiceCollectionExtensions.cs @@ -0,0 +1,16 @@ +using Microsoft.Extensions.DependencyInjection;
+
+namespace Timeline.Services.DatabaseManagement
+{
+ public static class DatabaseManagementServiceCollectionExtensions
+ {
+ public static IServiceCollection AddDatabaseManagementService(this IServiceCollection services)
+ {
+ services.AddScoped<IDatabaseCustomMigrator, DatabaseCustomMigrator>();
+ services.AddScoped<IDatabaseCustomMigration, TimelinePostContentToDataMigration>();
+ services.AddScoped<IDatabaseBackupService, DatabaseBackupService>();
+ services.AddHostedService<DatabaseManagementService>();
+ return services;
+ }
+ }
+}
\ No newline at end of file diff --git a/BackEnd/Timeline/Services/Migration/TimelinePostContentToDataMigration.cs b/BackEnd/Timeline/Services/DatabaseManagement/TimelinePostContentToDataMigration.cs index bb7bf606..605223f3 100644 --- a/BackEnd/Timeline/Services/Migration/TimelinePostContentToDataMigration.cs +++ b/BackEnd/Timeline/Services/DatabaseManagement/TimelinePostContentToDataMigration.cs @@ -1,13 +1,14 @@ -using System.Text;
-using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using SixLabors.ImageSharp;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
using Timeline.Entities;
using Timeline.Models;
-namespace Timeline.Services.Migration
+namespace Timeline.Services.DatabaseManagement
{
- public class TimelinePostContentToDataMigration : ICustomMigration
+ public class TimelinePostContentToDataMigration : IDatabaseCustomMigration
{
private readonly IDataManager _dataManager;
@@ -18,10 +19,10 @@ namespace Timeline.Services.Migration public string GetName() => "TimelinePostContentToData";
- public async Task Execute(DatabaseContext database)
+ public async Task ExecuteAsync(DatabaseContext database, CancellationToken cancellationToken)
{
#pragma warning disable CS0618
- var postEntities = await database.TimelinePosts.ToListAsync();
+ var postEntities = await database.TimelinePosts.ToListAsync(cancellationToken);
foreach (var postEntity in postEntities)
{
@@ -62,7 +63,7 @@ namespace Timeline.Services.Migration postEntity.ExtraContent = null;
}
- await database.SaveChangesAsync();
+ await database.SaveChangesAsync(cancellationToken);
#pragma warning restore CS0618
}
}
diff --git a/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs b/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs deleted file mode 100644 index f6f156cc..00000000 --- a/BackEnd/Timeline/Services/Migration/CustomMigrationManager.cs +++ /dev/null @@ -1,55 +0,0 @@ -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<ICustomMigration> _migrations;
- private DatabaseContext _database;
-
- private ILogger<CustomMigrationManager> _logger;
-
- public CustomMigrationManager(IEnumerable<ICustomMigration> migrations, DatabaseContext database, ILogger<CustomMigrationManager> 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.LogWarning("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.LogWarning("End custom migration '{0}'.", name);
- }
- }
- }
- }
-}
diff --git a/BackEnd/Timeline/Services/Migration/ICustomMigration.cs b/BackEnd/Timeline/Services/Migration/ICustomMigration.cs deleted file mode 100644 index 1f47df1e..00000000 --- a/BackEnd/Timeline/Services/Migration/ICustomMigration.cs +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index 0e6f6c0a..00000000 --- a/BackEnd/Timeline/Services/Migration/MigationServiceCollectionExtensions.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Microsoft.Extensions.DependencyInjection;
-
-namespace Timeline.Services.Migration
-{
- public static class MigrationServiceCollectionExtensions
- {
- public static IServiceCollection AddCustomMigration(this IServiceCollection services)
- {
- services.AddScoped<ICustomMigrationManager, CustomMigrationManager>();
- services.AddScoped<ICustomMigration, TimelinePostContentToDataMigration>();
- return services;
- }
- }
-}
\ No newline at end of file diff --git a/BackEnd/Timeline/Startup.cs b/BackEnd/Timeline/Startup.cs index 4f392b2d..932e03c3 100644 --- a/BackEnd/Timeline/Startup.cs +++ b/BackEnd/Timeline/Startup.cs @@ -21,7 +21,7 @@ using Timeline.Models.Converters; using Timeline.Models.Mapper;
using Timeline.Routes;
using Timeline.Services;
-using Timeline.Services.Migration;
+using Timeline.Services.DatabaseManagement;
using Timeline.Swagger;
namespace Timeline
@@ -84,12 +84,12 @@ namespace Timeline services.AddAuthorization();
services.AddSingleton<IAuthorizationPolicyProvider, PermissionPolicyProvider>();
+ // TODO: Remove this.
services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddSingleton<IPathProvider, PathProvider>();
- services.AddSingleton<IDatabaseBackupService, DatabaseBackupService>();
- services.AddCustomMigration();
+ services.AddDatabaseManagementService();
services.AddAutoMapper(GetType().Assembly);
services.AddMappers();
|