diff --git a/Moonlight/App/Helpers/DatabaseCheckup.cs b/Moonlight/App/Helpers/DatabaseCheckup.cs new file mode 100644 index 00000000..c09e4c3f --- /dev/null +++ b/Moonlight/App/Helpers/DatabaseCheckup.cs @@ -0,0 +1,80 @@ +using System.Diagnostics; +using Logging.Net; +using Microsoft.EntityFrameworkCore; +using Moonlight.App.Database; +using Moonlight.App.Services; +using Moonlight.App.Services.Files; +using MySql.Data.MySqlClient; + +namespace Moonlight.App.Helpers; + +public class DatabaseCheckup +{ + public static void Perform() + { + var context = new DataContext(new ConfigService(new StorageService())); + + Logger.Info("Checking database"); + + Logger.Info("Checking for pending migrations"); + + var migrations = context.Database + .GetPendingMigrations() + .ToArray(); + + if (migrations.Any()) + { + Logger.Info($"{migrations.Length} migrations pending. Updating now"); + + BackupDatabase(); + + Logger.Info("Applying migrations"); + + context.Database.Migrate(); + + Logger.Info("Successfully applied migrations"); + } + else + { + Logger.Info("Database is up-to-date. No migrations have been performed"); + } + } + + public static void BackupDatabase() + { + Logger.Info("Creating backup from database"); + + var configService = new ConfigService(new StorageService()); + var dateTimeService = new DateTimeService(); + + var config = configService + .GetSection("Moonlight") + .GetSection("Database"); + + var connectionString = $"host={config.GetValue("Host")};" + + $"port={config.GetValue("Port")};" + + $"database={config.GetValue("Database")};" + + $"uid={config.GetValue("Username")};" + + $"pwd={config.GetValue("Password")}"; + + string file = PathBuilder.File("storage", "backups", $"{dateTimeService.GetCurrentUnix()}-mysql.sql"); + + Logger.Info($"Saving it to: {file}"); + Logger.Info("Starting backup..."); + + var sw = new Stopwatch(); + sw.Start(); + + using MySqlConnection conn = new MySqlConnection(connectionString); + using MySqlCommand cmd = new MySqlCommand(); + using MySqlBackup mb = new MySqlBackup(cmd); + + cmd.Connection = conn; + conn.Open(); + mb.ExportToFile(file); + conn.Close(); + + sw.Stop(); + Logger.Info($"Done. {sw.Elapsed.TotalSeconds}s"); + } +} \ No newline at end of file diff --git a/Moonlight/App/Services/Files/StorageService.cs b/Moonlight/App/Services/Files/StorageService.cs index 1bae49cc..7f8587b9 100644 --- a/Moonlight/App/Services/Files/StorageService.cs +++ b/Moonlight/App/Services/Files/StorageService.cs @@ -15,6 +15,7 @@ public class StorageService Directory.CreateDirectory(PathBuilder.Dir("storage", "uploads")); Directory.CreateDirectory(PathBuilder.Dir("storage", "configs")); Directory.CreateDirectory(PathBuilder.Dir("storage", "resources")); + Directory.CreateDirectory(PathBuilder.Dir("storage", "backups")); if(IsEmpty(PathBuilder.Dir("storage", "resources"))) { diff --git a/Moonlight/Moonlight.csproj b/Moonlight/Moonlight.csproj index 54f18e85..64f9e048 100644 --- a/Moonlight/Moonlight.csproj +++ b/Moonlight/Moonlight.csproj @@ -37,6 +37,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + @@ -73,6 +74,7 @@ + diff --git a/Moonlight/Pages/_Layout.cshtml b/Moonlight/Pages/_Layout.cshtml index ca9c2287..8038b0be 100644 --- a/Moonlight/Pages/_Layout.cshtml +++ b/Moonlight/Pages/_Layout.cshtml @@ -77,12 +77,21 @@ Logo @{ - var loadingMessage = LoadingMessageRepository.Get().Random(); + string loadingMessage; + + try + { + loadingMessage = LoadingMessageRepository.Get().Random().Message; + } + catch (Exception) + { + loadingMessage = ""; + } }
- @(loadingMessage.Message) + @(loadingMessage)
diff --git a/Moonlight/Program.cs b/Moonlight/Program.cs index daa9fec0..2d48a4a2 100644 --- a/Moonlight/Program.cs +++ b/Moonlight/Program.cs @@ -39,13 +39,15 @@ namespace Moonlight Logger.UsedLogger = new CacheLogger(); Logger.Info($"Working dir: {Directory.GetCurrentDirectory()}"); + + DatabaseCheckup.Perform(); var builder = WebApplication.CreateBuilder(args); // Switch to logging.net injection // TODO: Enable in production - //builder.Logging.ClearProviders(); - //builder.Logging.AddProvider(new LogMigratorProvider()); + builder.Logging.ClearProviders(); + builder.Logging.AddProvider(new LogMigratorProvider()); // Add services to the container. builder.Services.AddRazorPages();