aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline
diff options
context:
space:
mode:
Diffstat (limited to 'BackEnd/Timeline')
-rw-r--r--BackEnd/Timeline/Program.cs15
-rw-r--r--BackEnd/Timeline/Services/DatabaseBackupService.cs35
-rw-r--r--BackEnd/Timeline/Services/DatabaseManagement/DatabaseBackupService.cs37
-rw-r--r--BackEnd/Timeline/Services/DatabaseManagement/DatabaseCustomMigrator.cs56
-rw-r--r--BackEnd/Timeline/Services/DatabaseManagement/DatabaseManagementService.cs34
-rw-r--r--BackEnd/Timeline/Services/DatabaseManagement/IDatabaseCustomMigration.cs12
-rw-r--r--BackEnd/Timeline/Services/DatabaseManagement/MigationServiceCollectionExtensions.cs16
-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.cs55
-rw-r--r--BackEnd/Timeline/Services/Migration/ICustomMigration.cs11
-rw-r--r--BackEnd/Timeline/Services/Migration/MigationServiceCollectionExtensions.cs14
-rw-r--r--BackEnd/Timeline/Startup.cs6
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();