From 634958ffc5959fff58575dd8fcc62da3af67d41c Mon Sep 17 00:00:00 2001 From: LittleSheep Date: Fri, 19 Sep 2025 00:14:37 +0800 Subject: [PATCH] :wastebasket: Remove built-in frontend serving code --- .../Pages/Data/VersionPageData.cs | 24 ------ DysonNetwork.Drive/Program.cs | 11 --- .../Startup/ApplicationBuilderExtensions.cs | 8 +- DysonNetwork.Pass/Account/AccountService.cs | 4 +- .../Account/MagicSpellService.cs | 4 +- DysonNetwork.Pass/DysonNetwork.Pass.csproj | 9 --- .../Emails/AccountDeletionEmail.razor | 0 .../Emails/ContactVerificationEmail.razor | 0 .../{Pages => }/Emails/EmailLayout.razor | 0 .../{Pages => }/Emails/LandingEmail.razor | 0 .../Emails/PasswordResetEmail.razor | 0 .../Emails/VerificationEmail.razor | 0 .../{Email => Mailer}/EmailModels.cs | 2 +- .../{Email => Mailer}/EmailService.cs | 2 +- .../{Email => Mailer}/RazorViewRenderer.cs | 10 +-- .../Pages/Data/AccountPageData.cs | 52 ------------ .../Pages/Data/CaptchaPageData.cs | 20 ----- .../Pages/Data/VersionPageData.cs | 24 ------ DysonNetwork.Pass/Program.cs | 10 +-- .../Startup/ApplicationConfiguration.cs | 8 +- .../Startup/ServiceCollectionExtensions.cs | 2 +- .../PageData/IPageDataProvider.cs | 9 --- DysonNetwork.Shared/PageData/Startup.cs | 80 ------------------- DysonNetwork.Sphere/PageData/PostPageData.cs | 72 ----------------- DysonNetwork.Sphere/Program.cs | 12 --- 25 files changed, 11 insertions(+), 352 deletions(-) delete mode 100644 DysonNetwork.Drive/Pages/Data/VersionPageData.cs rename DysonNetwork.Pass/{Pages => }/Emails/AccountDeletionEmail.razor (100%) rename DysonNetwork.Pass/{Pages => }/Emails/ContactVerificationEmail.razor (100%) rename DysonNetwork.Pass/{Pages => }/Emails/EmailLayout.razor (100%) rename DysonNetwork.Pass/{Pages => }/Emails/LandingEmail.razor (100%) rename DysonNetwork.Pass/{Pages => }/Emails/PasswordResetEmail.razor (100%) rename DysonNetwork.Pass/{Pages => }/Emails/VerificationEmail.razor (100%) rename DysonNetwork.Pass/{Email => Mailer}/EmailModels.cs (94%) rename DysonNetwork.Pass/{Email => Mailer}/EmailService.cs (97%) rename DysonNetwork.Pass/{Email => Mailer}/RazorViewRenderer.cs (76%) delete mode 100644 DysonNetwork.Pass/Pages/Data/AccountPageData.cs delete mode 100644 DysonNetwork.Pass/Pages/Data/CaptchaPageData.cs delete mode 100644 DysonNetwork.Pass/Pages/Data/VersionPageData.cs delete mode 100644 DysonNetwork.Shared/PageData/IPageDataProvider.cs delete mode 100644 DysonNetwork.Shared/PageData/Startup.cs delete mode 100644 DysonNetwork.Sphere/PageData/PostPageData.cs diff --git a/DysonNetwork.Drive/Pages/Data/VersionPageData.cs b/DysonNetwork.Drive/Pages/Data/VersionPageData.cs deleted file mode 100644 index d7a1b8a..0000000 --- a/DysonNetwork.Drive/Pages/Data/VersionPageData.cs +++ /dev/null @@ -1,24 +0,0 @@ -using DysonNetwork.Shared.Data; -using DysonNetwork.Shared.PageData; - -namespace DysonNetwork.Drive.Pages.Data; - -public class VersionPageData : IPageDataProvider -{ - public bool CanHandlePath(PathString path) => true; - - public Task> GetAppDataAsync(HttpContext context) - { - var versionData = new AppVersion - { - Version = ThisAssembly.AssemblyVersion, - Commit = ThisAssembly.GitCommitId, - UpdateDate = ThisAssembly.GitCommitDate - }; - - var result = typeof(AppVersion).GetProperties() - .ToDictionary(property => property.Name, property => property.GetValue(versionData)); - - return Task.FromResult>(result); - } -} \ No newline at end of file diff --git a/DysonNetwork.Drive/Program.cs b/DysonNetwork.Drive/Program.cs index 91fe0c7..fcdd9c2 100644 --- a/DysonNetwork.Drive/Program.cs +++ b/DysonNetwork.Drive/Program.cs @@ -1,9 +1,7 @@ using DysonNetwork.Drive; -using DysonNetwork.Drive.Pages.Data; using DysonNetwork.Drive.Startup; using DysonNetwork.Shared.Auth; using DysonNetwork.Shared.Http; -using DysonNetwork.Shared.PageData; using DysonNetwork.Shared.Registry; using Microsoft.EntityFrameworkCore; using tusdotnet.Stores; @@ -35,8 +33,6 @@ builder.Services.AddAppBusinessServices(); // Add scheduled jobs builder.Services.AddAppScheduledJobs(); -builder.Services.AddTransient(); - var app = builder.Build(); app.MapDefaultEndpoints(); @@ -48,13 +44,6 @@ using (var scope = app.Services.CreateScope()) await db.Database.MigrateAsync(); } -var tusDiskStore = app.Services.GetRequiredService(); - -// Configure application middleware pipeline -app.ConfigureAppMiddleware(tusDiskStore, builder.Environment.ContentRootPath); - -app.MapPages(Path.Combine(app.Environment.WebRootPath, "dist", "index.html")); - // Configure gRPC app.ConfigureGrpcServices(); diff --git a/DysonNetwork.Drive/Startup/ApplicationBuilderExtensions.cs b/DysonNetwork.Drive/Startup/ApplicationBuilderExtensions.cs index a325430..8b9e4be 100644 --- a/DysonNetwork.Drive/Startup/ApplicationBuilderExtensions.cs +++ b/DysonNetwork.Drive/Startup/ApplicationBuilderExtensions.cs @@ -7,7 +7,7 @@ namespace DysonNetwork.Drive.Startup; public static class ApplicationBuilderExtensions { - public static WebApplication ConfigureAppMiddleware(this WebApplication app, ITusStore tusStore, string contentRoot) + public static WebApplication ConfigureAppMiddleware(this WebApplication app, ITusStore tusStore) { // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) @@ -28,12 +28,6 @@ public static class ApplicationBuilderExtensions .AllowAnyMethod() ); - app.UseDefaultFiles(); - app.UseStaticFiles(new StaticFileOptions - { - FileProvider = new PhysicalFileProvider(Path.Combine(contentRoot, "wwwroot", "dist")) - }); - app.MapTus("/api/tus", _ => Task.FromResult(TusService.BuildConfiguration(tusStore, app.Configuration))); return app; diff --git a/DysonNetwork.Pass/Account/AccountService.cs b/DysonNetwork.Pass/Account/AccountService.cs index ab5a39b..2229fbd 100644 --- a/DysonNetwork.Pass/Account/AccountService.cs +++ b/DysonNetwork.Pass/Account/AccountService.cs @@ -2,8 +2,8 @@ using System.Globalization; using System.Text.Json; using DysonNetwork.Pass.Auth; using DysonNetwork.Pass.Auth.OpenId; -using DysonNetwork.Pass.Email; using DysonNetwork.Pass.Localization; +using DysonNetwork.Pass.Mailer; using DysonNetwork.Pass.Permission; using DysonNetwork.Shared.Cache; using DysonNetwork.Shared.Data; @@ -452,7 +452,7 @@ public class AccountService( } await mailer - .SendTemplatedEmailAsync( + .SendTemplatedEmailAsync( account.Nick, contact.Content, emailLocalizer["VerificationEmail"], diff --git a/DysonNetwork.Pass/Account/MagicSpellService.cs b/DysonNetwork.Pass/Account/MagicSpellService.cs index de4fefd..6951949 100644 --- a/DysonNetwork.Pass/Account/MagicSpellService.cs +++ b/DysonNetwork.Pass/Account/MagicSpellService.cs @@ -1,7 +1,7 @@ using System.Security.Cryptography; using System.Text.Json; -using DysonNetwork.Pass.Email; -using DysonNetwork.Pass.Pages.Emails; +using DysonNetwork.Pass.Emails; +using DysonNetwork.Pass.Mailer; using DysonNetwork.Pass.Permission; using DysonNetwork.Shared.Cache; using Microsoft.EntityFrameworkCore; diff --git a/DysonNetwork.Pass/DysonNetwork.Pass.csproj b/DysonNetwork.Pass/DysonNetwork.Pass.csproj index 88f6e6b..37a1d41 100644 --- a/DysonNetwork.Pass/DysonNetwork.Pass.csproj +++ b/DysonNetwork.Pass/DysonNetwork.Pass.csproj @@ -135,14 +135,5 @@ SharedResource.Designer.cs - - - - - - - - - diff --git a/DysonNetwork.Pass/Pages/Emails/AccountDeletionEmail.razor b/DysonNetwork.Pass/Emails/AccountDeletionEmail.razor similarity index 100% rename from DysonNetwork.Pass/Pages/Emails/AccountDeletionEmail.razor rename to DysonNetwork.Pass/Emails/AccountDeletionEmail.razor diff --git a/DysonNetwork.Pass/Pages/Emails/ContactVerificationEmail.razor b/DysonNetwork.Pass/Emails/ContactVerificationEmail.razor similarity index 100% rename from DysonNetwork.Pass/Pages/Emails/ContactVerificationEmail.razor rename to DysonNetwork.Pass/Emails/ContactVerificationEmail.razor diff --git a/DysonNetwork.Pass/Pages/Emails/EmailLayout.razor b/DysonNetwork.Pass/Emails/EmailLayout.razor similarity index 100% rename from DysonNetwork.Pass/Pages/Emails/EmailLayout.razor rename to DysonNetwork.Pass/Emails/EmailLayout.razor diff --git a/DysonNetwork.Pass/Pages/Emails/LandingEmail.razor b/DysonNetwork.Pass/Emails/LandingEmail.razor similarity index 100% rename from DysonNetwork.Pass/Pages/Emails/LandingEmail.razor rename to DysonNetwork.Pass/Emails/LandingEmail.razor diff --git a/DysonNetwork.Pass/Pages/Emails/PasswordResetEmail.razor b/DysonNetwork.Pass/Emails/PasswordResetEmail.razor similarity index 100% rename from DysonNetwork.Pass/Pages/Emails/PasswordResetEmail.razor rename to DysonNetwork.Pass/Emails/PasswordResetEmail.razor diff --git a/DysonNetwork.Pass/Pages/Emails/VerificationEmail.razor b/DysonNetwork.Pass/Emails/VerificationEmail.razor similarity index 100% rename from DysonNetwork.Pass/Pages/Emails/VerificationEmail.razor rename to DysonNetwork.Pass/Emails/VerificationEmail.razor diff --git a/DysonNetwork.Pass/Email/EmailModels.cs b/DysonNetwork.Pass/Mailer/EmailModels.cs similarity index 94% rename from DysonNetwork.Pass/Email/EmailModels.cs rename to DysonNetwork.Pass/Mailer/EmailModels.cs index 39a3075..8cbe268 100644 --- a/DysonNetwork.Pass/Email/EmailModels.cs +++ b/DysonNetwork.Pass/Mailer/EmailModels.cs @@ -1,4 +1,4 @@ -namespace DysonNetwork.Pass.Email; +namespace DysonNetwork.Pass.Mailer; public class LandingEmailModel { diff --git a/DysonNetwork.Pass/Email/EmailService.cs b/DysonNetwork.Pass/Mailer/EmailService.cs similarity index 97% rename from DysonNetwork.Pass/Email/EmailService.cs rename to DysonNetwork.Pass/Mailer/EmailService.cs index 71714c3..7bb2ecc 100644 --- a/DysonNetwork.Pass/Email/EmailService.cs +++ b/DysonNetwork.Pass/Mailer/EmailService.cs @@ -1,7 +1,7 @@ using DysonNetwork.Shared.Proto; using Microsoft.AspNetCore.Components; -namespace DysonNetwork.Pass.Email; +namespace DysonNetwork.Pass.Mailer; public class EmailService( RingService.RingServiceClient pusher, diff --git a/DysonNetwork.Pass/Email/RazorViewRenderer.cs b/DysonNetwork.Pass/Mailer/RazorViewRenderer.cs similarity index 76% rename from DysonNetwork.Pass/Email/RazorViewRenderer.cs rename to DysonNetwork.Pass/Mailer/RazorViewRenderer.cs index 57e76cc..d546172 100644 --- a/DysonNetwork.Pass/Email/RazorViewRenderer.cs +++ b/DysonNetwork.Pass/Mailer/RazorViewRenderer.cs @@ -1,15 +1,7 @@ using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; -using Microsoft.AspNetCore.Mvc; -using Microsoft.AspNetCore.Mvc.Abstractions; -using Microsoft.AspNetCore.Mvc.ModelBinding; -using Microsoft.AspNetCore.Mvc.Razor; -using Microsoft.AspNetCore.Mvc.Rendering; -using Microsoft.AspNetCore.Mvc.ViewEngines; -using Microsoft.AspNetCore.Mvc.ViewFeatures; -using RouteData = Microsoft.AspNetCore.Routing.RouteData; -namespace DysonNetwork.Pass.Email; +namespace DysonNetwork.Pass.Mailer; public class RazorViewRenderer( IServiceProvider serviceProvider, diff --git a/DysonNetwork.Pass/Pages/Data/AccountPageData.cs b/DysonNetwork.Pass/Pages/Data/AccountPageData.cs deleted file mode 100644 index f0a66ed..0000000 --- a/DysonNetwork.Pass/Pages/Data/AccountPageData.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System.Net; -using DysonNetwork.Pass.Wallet; -using DysonNetwork.Shared.PageData; -using Microsoft.EntityFrameworkCore; -using OpenGraphNet; - -namespace DysonNetwork.Pass.Pages.Data; - -public class AccountPageData(AppDatabase db, SubscriptionService subscriptions, IConfiguration configuration) - : IPageDataProvider -{ - private readonly string _siteUrl = configuration["SiteUrl"]!; - - public bool CanHandlePath(PathString path) => - path.StartsWithSegments("/accounts") || path.ToString().StartsWith("/@"); - - public async Task> GetAppDataAsync(HttpContext context) - { - var path = context.Request.Path.Value!; - var startIndex = path.StartsWith("/accounts/") ? "/accounts/".Length : "/@".Length; - var endIndex = path.IndexOf('/', startIndex); - var username = endIndex == -1 ? path[startIndex..] : path.Substring(startIndex, endIndex - startIndex); - username = WebUtility.UrlDecode(username); - if (username.StartsWith("@")) - username = username[1..]; - - var account = await db.Accounts - .Include(e => e.Badges) - .Include(e => e.Profile) - .Where(a => a.Name == username) - .FirstOrDefaultAsync(); - if (account is null) return new Dictionary(); - - var perk = await subscriptions.GetPerkSubscriptionAsync(account.Id); - account.PerkSubscription = perk?.ToReference(); - - var og = OpenGraph.MakeGraph( - title: account.Nick, - type: "profile", - image: $"{_siteUrl}/cgi/drive/files/{account.Profile.Picture?.Id}?original=true", - url: $"{_siteUrl}/@{username}", - description: account.Profile.Bio ?? $"@{account.Name} profile on the Solar Network", - siteName: "Solarpass" - ); - - return new Dictionary() - { - ["Account"] = account, - ["OpenGraph"] = og - }; - } -} \ No newline at end of file diff --git a/DysonNetwork.Pass/Pages/Data/CaptchaPageData.cs b/DysonNetwork.Pass/Pages/Data/CaptchaPageData.cs deleted file mode 100644 index d9a382f..0000000 --- a/DysonNetwork.Pass/Pages/Data/CaptchaPageData.cs +++ /dev/null @@ -1,20 +0,0 @@ -using DysonNetwork.Shared.PageData; - -namespace DysonNetwork.Pass.Pages.Data; - -public class CaptchaPageData(IConfiguration configuration) : IPageDataProvider -{ - public bool CanHandlePath(PathString path) => path == "/captcha"; - - public Task> GetAppDataAsync(HttpContext context) - { - var provider = configuration.GetSection("Captcha")["Provider"]?.ToLower(); - var apiKey = configuration.GetSection("Captcha")["ApiKey"]; - - return Task.FromResult>(new Dictionary - { - ["Provider"] = provider, - ["ApiKey"] = apiKey - }); - } -} \ No newline at end of file diff --git a/DysonNetwork.Pass/Pages/Data/VersionPageData.cs b/DysonNetwork.Pass/Pages/Data/VersionPageData.cs deleted file mode 100644 index dcc8600..0000000 --- a/DysonNetwork.Pass/Pages/Data/VersionPageData.cs +++ /dev/null @@ -1,24 +0,0 @@ -using DysonNetwork.Shared.Data; -using DysonNetwork.Shared.PageData; - -namespace DysonNetwork.Pass.Pages.Data; - -public class VersionPageData : IPageDataProvider -{ - public bool CanHandlePath(PathString path) => true; - - public Task> GetAppDataAsync(HttpContext context) - { - var versionData = new AppVersion - { - Version = ThisAssembly.AssemblyVersion, - Commit = ThisAssembly.GitCommitId, - UpdateDate = ThisAssembly.GitCommitDate - }; - - var result = typeof(AppVersion).GetProperties() - .ToDictionary(property => property.Name, property => property.GetValue(versionData)); - - return Task.FromResult>(result); - } -} \ No newline at end of file diff --git a/DysonNetwork.Pass/Program.cs b/DysonNetwork.Pass/Program.cs index fc96c59..1c56847 100644 --- a/DysonNetwork.Pass/Program.cs +++ b/DysonNetwork.Pass/Program.cs @@ -1,8 +1,6 @@ using DysonNetwork.Pass; -using DysonNetwork.Pass.Pages.Data; using DysonNetwork.Pass.Startup; using DysonNetwork.Shared.Http; -using DysonNetwork.Shared.PageData; using DysonNetwork.Shared.Registry; using Microsoft.EntityFrameworkCore; @@ -31,10 +29,6 @@ builder.Services.AddAppBusinessServices(builder.Configuration); // Add scheduled jobs builder.Services.AddAppScheduledJobs(); -builder.Services.AddTransient(); -builder.Services.AddTransient(); -builder.Services.AddTransient(); - var app = builder.Build(); app.MapDefaultEndpoints(); @@ -47,9 +41,7 @@ using (var scope = app.Services.CreateScope()) } // Configure application middleware pipeline -app.ConfigureAppMiddleware(builder.Configuration, builder.Environment.ContentRootPath); - -app.MapPages(Path.Combine(builder.Environment.WebRootPath, "dist", "index.html")); +app.ConfigureAppMiddleware(builder.Configuration); // Configure gRPC app.ConfigureGrpcServices(); diff --git a/DysonNetwork.Pass/Startup/ApplicationConfiguration.cs b/DysonNetwork.Pass/Startup/ApplicationConfiguration.cs index dd85cef..261b245 100644 --- a/DysonNetwork.Pass/Startup/ApplicationConfiguration.cs +++ b/DysonNetwork.Pass/Startup/ApplicationConfiguration.cs @@ -14,7 +14,7 @@ namespace DysonNetwork.Pass.Startup; public static class ApplicationConfiguration { - public static WebApplication ConfigureAppMiddleware(this WebApplication app, IConfiguration configuration, string contentRoot) + public static WebApplication ConfigureAppMiddleware(this WebApplication app, IConfiguration configuration) { app.MapMetrics(); app.MapOpenApi(); @@ -41,12 +41,6 @@ public static class ApplicationConfiguration app.UseAuthorization(); app.UseMiddleware(); - app.UseDefaultFiles(); - app.UseStaticFiles(new StaticFileOptions - { - FileProvider = new PhysicalFileProvider(Path.Combine(contentRoot, "wwwroot", "dist")) - }); - app.MapControllers().RequireRateLimiting("fixed"); return app; diff --git a/DysonNetwork.Pass/Startup/ServiceCollectionExtensions.cs b/DysonNetwork.Pass/Startup/ServiceCollectionExtensions.cs index cda0085..f29a0cf 100644 --- a/DysonNetwork.Pass/Startup/ServiceCollectionExtensions.cs +++ b/DysonNetwork.Pass/Startup/ServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ using System.Globalization; using DysonNetwork.Pass.Account; using DysonNetwork.Pass.Auth; using DysonNetwork.Pass.Auth.OpenId; -using DysonNetwork.Pass.Email; using DysonNetwork.Pass.Localization; using DysonNetwork.Pass.Permission; using DysonNetwork.Pass.Wallet; @@ -19,6 +18,7 @@ using DysonNetwork.Pass.Auth.OidcProvider.Services; using DysonNetwork.Pass.Credit; using DysonNetwork.Pass.Handlers; using DysonNetwork.Pass.Leveling; +using DysonNetwork.Pass.Mailer; using DysonNetwork.Pass.Safety; using DysonNetwork.Pass.Wallet.PaymentHandlers; using DysonNetwork.Shared.Cache; diff --git a/DysonNetwork.Shared/PageData/IPageDataProvider.cs b/DysonNetwork.Shared/PageData/IPageDataProvider.cs deleted file mode 100644 index aaacf89..0000000 --- a/DysonNetwork.Shared/PageData/IPageDataProvider.cs +++ /dev/null @@ -1,9 +0,0 @@ -using Microsoft.AspNetCore.Http; - -namespace DysonNetwork.Shared.PageData; - -public interface IPageDataProvider -{ - bool CanHandlePath(PathString path); - Task> GetAppDataAsync(HttpContext context); -} \ No newline at end of file diff --git a/DysonNetwork.Shared/PageData/Startup.cs b/DysonNetwork.Shared/PageData/Startup.cs deleted file mode 100644 index 5d928f0..0000000 --- a/DysonNetwork.Shared/PageData/Startup.cs +++ /dev/null @@ -1,80 +0,0 @@ -using System.Text.Json; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Routing; -using Microsoft.Extensions.DependencyInjection; -using NodaTime; -using NodaTime.Serialization.SystemTextJson; -using OpenGraphNet; - -namespace DysonNetwork.Shared.PageData; - -public static class PageStartup -{ - /// - /// The method setup the single page application routes for you. - /// Before you calling this, ensure you have setup the static files and default files: - /// - /// app.UseDefaultFiles(); - /// app.UseStaticFiles(new StaticFileOptions - /// { - /// FileProvider = new PhysicalFileProvider(Path.Combine(contentRoot, "wwwroot", "dist")) - /// }); - /// - /// - /// - /// - /// - public static WebApplication MapPages(this WebApplication app, string defaultFile) - { - var jsonOpts = new JsonSerializerOptions - { - PropertyNamingPolicy = JsonNamingPolicy.SnakeCaseLower, - DictionaryKeyPolicy = JsonNamingPolicy.SnakeCaseLower, - PropertyNameCaseInsensitive = true, - }.ConfigureForNodaTime(DateTimeZoneProviders.Tzdb); - -#pragma warning disable ASP0016 - app.MapFallback(async context => - { - if (context.Request.Path.StartsWithSegments("/api") || context.Request.Path.StartsWithSegments("/cgi")) - { - context.Response.StatusCode = StatusCodes.Status404NotFound; - await context.Response.WriteAsync("Not found"); - return; - } - - var html = await File.ReadAllTextAsync(defaultFile); - - using var scope = app.Services.CreateScope(); - var providers = scope.ServiceProvider.GetServices(); - - var matches = providers - .Where(p => p.CanHandlePath(context.Request.Path)) - .Select(p => p.GetAppDataAsync(context)) - .ToList(); - var results = await Task.WhenAll(matches); - - var appData = new Dictionary(); - foreach (var result in results) - foreach (var (key, value) in result) - appData[key] = value; - - OpenGraph? og = null; - if (appData.TryGetValue("OpenGraph", out var openGraph) && openGraph is OpenGraph gog) - og = gog; - - var json = JsonSerializer.Serialize(appData, jsonOpts); - html = html.Replace("", $""); - - if (og is not null) - html = html.Replace("", og.ToString()); - - context.Response.ContentType = "text/html"; - await context.Response.WriteAsync(html); - }); -#pragma warning restore ASP0016 - - return app; - } -} \ No newline at end of file diff --git a/DysonNetwork.Sphere/PageData/PostPageData.cs b/DysonNetwork.Sphere/PageData/PostPageData.cs deleted file mode 100644 index b88ed16..0000000 --- a/DysonNetwork.Sphere/PageData/PostPageData.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.Net; -using DysonNetwork.Shared.PageData; -using DysonNetwork.Shared.Proto; -using DysonNetwork.Sphere.Post; -using Microsoft.EntityFrameworkCore; -using OpenGraphNet; - -namespace DysonNetwork.Sphere.PageData; - -public class PostPageData( - AppDatabase db, - AccountService.AccountServiceClient accounts, - Publisher.PublisherService pub, - PostService ps, - IConfiguration configuration -) - : IPageDataProvider -{ - private readonly string _siteUrl = configuration["SiteUrl"]!; - - public bool CanHandlePath(PathString path) => - path.StartsWithSegments("/posts"); - - public async Task> GetAppDataAsync(HttpContext context) - { - var path = context.Request.Path.Value!; - var startIndex = "/posts/".Length; - var endIndex = path.IndexOf('/', startIndex); - var slug = endIndex == -1 ? path[startIndex..] : path.Substring(startIndex, endIndex - startIndex); - slug = WebUtility.UrlDecode(slug); - - var postId = Guid.TryParse(slug, out var postIdGuid) ? postIdGuid : Guid.Empty; - if (postId == Guid.Empty) return new Dictionary(); - - context.Items.TryGetValue("CurrentUser", out var currentUserValue); - var currentUser = currentUserValue as Account; - List userFriends = []; - if (currentUser != null) - { - var friendsResponse = await accounts.ListFriendsAsync(new ListRelationshipSimpleRequest - { AccountId = currentUser.Id }); - userFriends = friendsResponse.AccountsId.Select(Guid.Parse).ToList(); - } - - var userPublishers = currentUser is null ? [] : await pub.GetUserPublishers(Guid.Parse(currentUser.Id)); - - var post = await db.Posts - .Where(e => e.Id == postId) - .Include(e => e.Publisher) - .Include(e => e.Tags) - .Include(e => e.Categories) - .FilterWithVisibility(currentUser, userFriends, userPublishers) - .FirstOrDefaultAsync(); - if (post == null) return new Dictionary(); - post = await ps.LoadPostInfo(post, currentUser); - - var og = OpenGraph.MakeGraph( - title: post.Title ?? $"Post from {post.Publisher.Name}", - type: "article", - image: $"{_siteUrl}/cgi/drive/files/{post.Publisher.Background?.Id}?original=true", - url: $"{_siteUrl}/@{slug}", - description: post.Description ?? (post.Content?.Length > 80 ? post.Content?[..80] : post.Content) ?? "Posted with some media", - siteName: "Solar Network" - ); - - return new Dictionary() - { - ["Post"] = post, - ["OpenGraph"] = og - }; - } -} diff --git a/DysonNetwork.Sphere/Program.cs b/DysonNetwork.Sphere/Program.cs index bdec808..0c2aacf 100644 --- a/DysonNetwork.Sphere/Program.cs +++ b/DysonNetwork.Sphere/Program.cs @@ -1,9 +1,7 @@ using DysonNetwork.Shared.Auth; using DysonNetwork.Shared.Http; -using DysonNetwork.Shared.PageData; using DysonNetwork.Shared.Registry; using DysonNetwork.Sphere; -using DysonNetwork.Sphere.PageData; using DysonNetwork.Sphere.Startup; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.FileProviders; @@ -35,8 +33,6 @@ builder.Services.AddAppBusinessServices(builder.Configuration); // Add scheduled jobs builder.Services.AddAppScheduledJobs(); -builder.Services.AddTransient(); - var app = builder.Build(); app.MapDefaultEndpoints(); @@ -51,12 +47,4 @@ using (var scope = app.Services.CreateScope()) // Configure application middleware pipeline app.ConfigureAppMiddleware(builder.Configuration); -app.UseDefaultFiles(); -app.UseStaticFiles(new StaticFileOptions -{ - FileProvider = new PhysicalFileProvider(Path.Combine(app.Environment.ContentRootPath, "wwwroot", "dist")) -}); - -app.MapPages(Path.Combine(app.Environment.WebRootPath, "dist", "index.html")); - app.Run(); \ No newline at end of file