Added base bundle service
This commit is contained in:
@@ -8,16 +8,22 @@ using MySql.Data.MySqlClient;
|
||||
|
||||
namespace Moonlight.App.Helpers;
|
||||
|
||||
public class DatabaseCheckup
|
||||
public class DatabaseCheckupService
|
||||
{
|
||||
public static void Perform()
|
||||
private readonly ConfigService ConfigService;
|
||||
|
||||
public DatabaseCheckupService(ConfigService configService)
|
||||
{
|
||||
// This will also copy all default config files
|
||||
var context = new DataContext(new ConfigService(new StorageService()));
|
||||
ConfigService = configService;
|
||||
}
|
||||
|
||||
public async Task Perform()
|
||||
{
|
||||
var context = new DataContext(ConfigService);
|
||||
|
||||
Logger.Info("Checking database");
|
||||
|
||||
if (!context.Database.CanConnect())
|
||||
if (!await context.Database.CanConnectAsync())
|
||||
{
|
||||
Logger.Fatal("-----------------------------------------------");
|
||||
Logger.Fatal("Unable to connect to mysql database");
|
||||
@@ -32,19 +38,19 @@ public class DatabaseCheckup
|
||||
|
||||
Logger.Info("Checking for pending migrations");
|
||||
|
||||
var migrations = context.Database
|
||||
.GetPendingMigrations()
|
||||
var migrations = (await context.Database
|
||||
.GetPendingMigrationsAsync())
|
||||
.ToArray();
|
||||
|
||||
if (migrations.Any())
|
||||
{
|
||||
Logger.Info($"{migrations.Length} migrations pending. Updating now");
|
||||
|
||||
BackupDatabase();
|
||||
await BackupDatabase();
|
||||
|
||||
Logger.Info("Applying migrations");
|
||||
|
||||
context.Database.Migrate();
|
||||
await context.Database.MigrateAsync();
|
||||
|
||||
Logger.Info("Successfully applied migrations");
|
||||
}
|
||||
@@ -54,7 +60,7 @@ public class DatabaseCheckup
|
||||
}
|
||||
}
|
||||
|
||||
public static void BackupDatabase()
|
||||
public async Task BackupDatabase()
|
||||
{
|
||||
Logger.Info("Creating backup from database");
|
||||
|
||||
@@ -79,14 +85,14 @@ public class DatabaseCheckup
|
||||
var sw = new Stopwatch();
|
||||
sw.Start();
|
||||
|
||||
using MySqlConnection conn = new MySqlConnection(connectionString);
|
||||
using MySqlCommand cmd = new MySqlCommand();
|
||||
await using MySqlConnection conn = new MySqlConnection(connectionString);
|
||||
await using MySqlCommand cmd = new MySqlCommand();
|
||||
using MySqlBackup mb = new MySqlBackup(cmd);
|
||||
|
||||
cmd.Connection = conn;
|
||||
conn.Open();
|
||||
await conn.OpenAsync();
|
||||
mb.ExportToFile(file);
|
||||
conn.Close();
|
||||
await conn.CloseAsync();
|
||||
|
||||
sw.Stop();
|
||||
Logger.Info($"Done. {sw.Elapsed.TotalSeconds}s");
|
||||
@@ -1,10 +1,12 @@
|
||||
using Logging.Net;
|
||||
using System.Text;
|
||||
using Logging.Net;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Moonlight.App.Helpers;
|
||||
using Moonlight.App.Models.Misc;
|
||||
using Moonlight.App.Services;
|
||||
using Moonlight.App.Services.Files;
|
||||
using Moonlight.App.Services.LogServices;
|
||||
using Moonlight.App.Services.Sessions;
|
||||
|
||||
namespace Moonlight.App.Http.Controllers.Api.Moonlight;
|
||||
|
||||
@@ -14,12 +16,14 @@ public class ResourcesController : Controller
|
||||
{
|
||||
private readonly SecurityLogService SecurityLogService;
|
||||
private readonly BucketService BucketService;
|
||||
private readonly BundleService BundleService;
|
||||
|
||||
public ResourcesController(SecurityLogService securityLogService,
|
||||
BucketService bucketService)
|
||||
BucketService bucketService, BundleService bundleService)
|
||||
{
|
||||
SecurityLogService = securityLogService;
|
||||
BucketService = bucketService;
|
||||
BundleService = bundleService;
|
||||
}
|
||||
|
||||
[HttpGet("images/{name}")]
|
||||
@@ -73,4 +77,34 @@ public class ResourcesController : Controller
|
||||
return Problem();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet("bundle/js")]
|
||||
public Task<ActionResult> GetJs()
|
||||
{
|
||||
if (BundleService.BundledFinished)
|
||||
{
|
||||
return Task.FromResult<ActionResult>(
|
||||
File(Encoding.ASCII.GetBytes(BundleService.BundledJs), "text/javascript")
|
||||
);
|
||||
}
|
||||
|
||||
return Task.FromResult<ActionResult>(
|
||||
NotFound()
|
||||
);
|
||||
}
|
||||
|
||||
[HttpGet("bundle/css")]
|
||||
public Task<ActionResult> GetCss()
|
||||
{
|
||||
if (BundleService.BundledFinished)
|
||||
{
|
||||
return Task.FromResult<ActionResult>(
|
||||
File(Encoding.ASCII.GetBytes(BundleService.BundledCss), "text/css")
|
||||
);
|
||||
}
|
||||
|
||||
return Task.FromResult<ActionResult>(
|
||||
NotFound()
|
||||
);
|
||||
}
|
||||
}
|
||||
101
Moonlight/App/Services/Sessions/BundleService.cs
Normal file
101
Moonlight/App/Services/Sessions/BundleService.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
using Logging.Net;
|
||||
|
||||
namespace Moonlight.App.Services.Sessions;
|
||||
|
||||
public class BundleService
|
||||
{
|
||||
private readonly ConfigService ConfigService;
|
||||
|
||||
public BundleService(ConfigService configService)
|
||||
{
|
||||
ConfigService = configService;
|
||||
|
||||
CacheId = Guid.NewGuid().ToString();
|
||||
|
||||
Task.Run(Bundle);
|
||||
}
|
||||
|
||||
public string BundledJs { get; private set; }
|
||||
public string BundledCss { get; private set; }
|
||||
public string CacheId { get; private set; }
|
||||
public bool BundledFinished { get; set; } = false;
|
||||
private bool IsBundling { get; set; } = false;
|
||||
|
||||
public async Task Bundle()
|
||||
{
|
||||
if (!IsBundling)
|
||||
IsBundling = true;
|
||||
|
||||
Logger.Info("Bundling js and css files");
|
||||
|
||||
BundledJs = "";
|
||||
BundledCss = "";
|
||||
|
||||
var url = ConfigService
|
||||
.GetSection("Moonlight")
|
||||
.GetValue<string>("AppUrl");
|
||||
|
||||
BundledJs = await BundleFiles(
|
||||
new[]
|
||||
{
|
||||
url + "/_framework/blazor.server.js",
|
||||
url + "/assets/plugins/global/plugins.bundle.js",
|
||||
url + "/_content/XtermBlazor/XtermBlazor.min.js",
|
||||
url + "/_content/BlazorTable/BlazorTable.min.js",
|
||||
url + "/_content/CurrieTechnologies.Razor.SweetAlert2/sweetAlert2.min.js",
|
||||
url + "/_content/Blazor.ContextMenu/blazorContextMenu.min.js",
|
||||
"https://www.google.com/recaptcha/api.js",
|
||||
"https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.5.0/lib/xterm-addon-fit.min.js",
|
||||
"https://cdn.jsdelivr.net/npm/xterm-addon-search@0.8.2/lib/xterm-addon-search.min.js",
|
||||
"https://cdn.jsdelivr.net/npm/xterm-addon-web-links@0.5.0/lib/xterm-addon-web-links.min.js",
|
||||
url + "/_content/BlazorMonaco/lib/monaco-editor/min/vs/loader.js",
|
||||
"require.config({ paths: { 'vs': '/_content/BlazorMonaco/lib/monaco-editor/min/vs' } });",
|
||||
url + "/_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.js",
|
||||
url + "/_content/BlazorMonaco/jsInterop.js",
|
||||
url + "/assets/js/scripts.bundle.js",
|
||||
url + "/assets/js/moonlight.js",
|
||||
"moonlight.loading.registerXterm();",
|
||||
url + "/_content/Blazor-ApexCharts/js/apex-charts.min.js",
|
||||
url + "/_content/Blazor-ApexCharts/js/blazor-apex-charts.js"
|
||||
}
|
||||
);
|
||||
|
||||
BundledCss = await BundleFiles(
|
||||
new[]
|
||||
{
|
||||
"https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700",
|
||||
url + "/assets/css/style.bundle.css",
|
||||
url + "/assets/css/flashbang.css",
|
||||
url + "/assets/css/snow.css",
|
||||
url + "/assets/css/utils.css",
|
||||
url + "/assets/css/blazor.css",
|
||||
url + "/_content/XtermBlazor/XtermBlazor.css",
|
||||
url + "/_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.css",
|
||||
url + "/_content/Blazor.ContextMenu/blazorContextMenu.min.css",
|
||||
url + "/assets/plugins/global/plugins.bundle.css",
|
||||
}
|
||||
);
|
||||
|
||||
Logger.Info("Successfully bundled");
|
||||
BundledFinished = true;
|
||||
}
|
||||
|
||||
private async Task<string> BundleFiles(string[] jsUrls)
|
||||
{
|
||||
var bundledJs = "";
|
||||
|
||||
using HttpClient client = new HttpClient();
|
||||
foreach (string url in jsUrls)
|
||||
{
|
||||
if (url.StartsWith("http"))
|
||||
{
|
||||
var jsCode = await client.GetStringAsync(url);
|
||||
bundledJs += jsCode + "\n";
|
||||
}
|
||||
else
|
||||
bundledJs += url + "\n";
|
||||
}
|
||||
|
||||
return bundledJs;
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,12 @@
|
||||
@using Moonlight.App.Extensions
|
||||
@using Moonlight.App.Repositories
|
||||
@using Moonlight.App.Services
|
||||
@using Moonlight.App.Services.Sessions
|
||||
@namespace Moonlight.Pages
|
||||
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
|
||||
|
||||
@inject ConfigService ConfigService
|
||||
@inject BundleService BundleService
|
||||
@inject LoadingMessageRepository LoadingMessageRepository
|
||||
|
||||
@{
|
||||
@@ -36,20 +38,29 @@
|
||||
|
||||
<link rel="shortcut icon" href="@(moonlightConfig.GetValue<string>("AppUrl"))/api/moonlight/resources/images/logo.svg"/>
|
||||
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700"/>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/style.bundle.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/flashbang.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/snow.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/utils.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/boxicons.min.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/blazor.css"/>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/_content/XtermBlazor/XtermBlazor.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/_content/Blazor.ContextMenu/blazorContextMenu.min.css"/>
|
||||
@if (BundleService.BundledFinished)
|
||||
{
|
||||
<link rel="stylesheet" type="text/css" href="/api/moonlight/resources/bundle/css?idontwannabecached=@(BundleService.CacheId)"/>
|
||||
}
|
||||
else
|
||||
{
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Poppins:300,400,500,600,700"/>
|
||||
|
||||
<link href="/assets/plugins/global/plugins.bundle.css" rel="stylesheet" type="text/css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/style.bundle.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/flashbang.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/snow.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/utils.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/boxicons.min.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/assets/css/blazor.css"/>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="/_content/XtermBlazor/XtermBlazor.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.css"/>
|
||||
<link rel="stylesheet" type="text/css" href="/_content/Blazor.ContextMenu/blazorContextMenu.min.css"/>
|
||||
|
||||
<link href="/assets/plugins/global/plugins.bundle.css" rel="stylesheet" type="text/css"/>
|
||||
}
|
||||
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<base href="~/"/>
|
||||
@@ -95,33 +106,38 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/_framework/blazor.server.js"></script>
|
||||
<script src="/assets/plugins/global/plugins.bundle.js"></script>
|
||||
<script src="/_content/XtermBlazor/XtermBlazor.min.js"></script>
|
||||
<script src="/_content/BlazorTable/BlazorTable.min.js"></script>
|
||||
<script src="/_content/BlazorInputFile/inputfile.js"></script>
|
||||
<script src="/_content/CurrieTechnologies.Razor.SweetAlert2/sweetAlert2.min.js"></script>
|
||||
<script src="/_content/Blazor.ContextMenu/blazorContextMenu.min.js"></script>
|
||||
@if (BundleService.BundledFinished)
|
||||
{
|
||||
<script src="/api/moonlight/resources/bundle/js?idontwannabecached=@(BundleService.CacheId)">
|
||||
</script>
|
||||
}
|
||||
else
|
||||
{
|
||||
<script src="/_framework/blazor.server.js"></script>
|
||||
<script src="/assets/plugins/global/plugins.bundle.js"></script>
|
||||
<script src="/_content/XtermBlazor/XtermBlazor.min.js"></script>
|
||||
<script src="/_content/BlazorTable/BlazorTable.min.js"></script>
|
||||
<script src="/_content/CurrieTechnologies.Razor.SweetAlert2/sweetAlert2.min.js"></script>
|
||||
<script src="/_content/Blazor.ContextMenu/blazorContextMenu.min.js"></script>
|
||||
|
||||
<script src="https://www.google.com/recaptcha/api.js"></script>
|
||||
<script src="https://www.google.com/recaptcha/api.js"></script>
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.5.0/lib/xterm-addon-fit.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-search@0.8.2/lib/xterm-addon-search.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-web-links@0.5.0/lib/xterm-addon-web-links.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-fit@0.5.0/lib/xterm-addon-fit.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-search@0.8.2/lib/xterm-addon-search.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/xterm-addon-web-links@0.5.0/lib/xterm-addon-web-links.min.js"></script>
|
||||
|
||||
<script src="/_content/BlazorMonaco/lib/monaco-editor/min/vs/loader.js"></script>
|
||||
<script>require.config({ paths: { 'vs': '/_content/BlazorMonaco/lib/monaco-editor/min/vs' } });</script>
|
||||
<script src="/_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.js"></script>
|
||||
<script src="/_content/BlazorMonaco/jsInterop.js"></script>
|
||||
<script src="/_content/BlazorMonaco/lib/monaco-editor/min/vs/loader.js"></script>
|
||||
<script>require.config({ paths: { 'vs': '/_content/BlazorMonaco/lib/monaco-editor/min/vs' } });</script>
|
||||
<script src="/_content/BlazorMonaco/lib/monaco-editor/min/vs/editor/editor.main.js"></script>
|
||||
<script src="/_content/BlazorMonaco/jsInterop.js"></script>
|
||||
|
||||
<script src="/assets/js/scripts.bundle.js"></script>
|
||||
<script src="/assets/js/moonlight.js"></script>
|
||||
<script src="/assets/js/scripts.bundle.js"></script>
|
||||
<script src="/assets/js/moonlight.js"></script>
|
||||
|
||||
<script>
|
||||
moonlight.loading.registerXterm();
|
||||
</script>
|
||||
<script>moonlight.loading.registerXterm();</script>
|
||||
|
||||
<script src="_content/Blazor-ApexCharts/js/apex-charts.min.js"></script>
|
||||
<script src="_content/Blazor-ApexCharts/js/blazor-apex-charts.js"></script>
|
||||
<script src="/_content/Blazor-ApexCharts/js/apex-charts.min.js"></script>
|
||||
<script src="/_content/Blazor-ApexCharts/js/blazor-apex-charts.js"></script>
|
||||
}
|
||||
</body>
|
||||
</html>
|
||||
@@ -34,13 +34,19 @@ namespace Moonlight
|
||||
// App version. Change for release
|
||||
public static readonly string AppVersion = $"InDev {Formatter.FormatDateOnly(DateTime.Now.Date)}";
|
||||
|
||||
public static void Main(string[] args)
|
||||
public static async Task Main(string[] args)
|
||||
{
|
||||
Logger.UsedLogger = new CacheLogger();
|
||||
|
||||
Logger.Info($"Working dir: {Directory.GetCurrentDirectory()}");
|
||||
|
||||
DatabaseCheckup.Perform();
|
||||
Logger.Info("Running pre-init tasks");
|
||||
|
||||
// This will also copy all default config files
|
||||
var configService = new ConfigService(new StorageService());
|
||||
var databaseCheckupService = new DatabaseCheckupService(configService);
|
||||
|
||||
await databaseCheckupService.Perform();
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
@@ -121,6 +127,7 @@ namespace Moonlight
|
||||
builder.Services.AddScoped<ReCaptchaService>();
|
||||
builder.Services.AddScoped<IpBanService>();
|
||||
builder.Services.AddSingleton<OAuth2Service>();
|
||||
builder.Services.AddSingleton<BundleService>();
|
||||
|
||||
builder.Services.AddScoped<SubscriptionService>();
|
||||
builder.Services.AddScoped<SubscriptionAdminService>();
|
||||
@@ -189,7 +196,7 @@ namespace Moonlight
|
||||
// Discord bot service
|
||||
//var discordBotService = app.Services.GetRequiredService<DiscordBotService>();
|
||||
|
||||
app.Run();
|
||||
await app.RunAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user