From 7130df87ae085c3bd36bcabc5a82c7d2a8adb82c Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Sat, 13 Jan 2024 18:22:28 +0100 Subject: [PATCH] Remove StartupOptions, generate version from assembly info --- .../Controllers/ActivityPubController.cs | 4 +-- .../{UserRenderer.cs => APUserRenderer.cs} | 13 ++++---- .../Core/Configuration/Config.cs | 30 +++++++++++++------ .../Core/Database/DatabaseContext.cs | 22 +++++--------- Iceshrimp.Backend/Core/Federation/Fetch.cs | 3 +- .../Core/Helpers/ServiceExtensions.cs | 9 +++--- .../Core/Services/HttpRequestService.cs | 2 +- Iceshrimp.Backend/Iceshrimp.Backend.csproj | 2 ++ Iceshrimp.Backend/Startup.cs | 7 +++-- 9 files changed, 51 insertions(+), 41 deletions(-) rename Iceshrimp.Backend/Controllers/Renderers/ActivityPub/{UserRenderer.cs => APUserRenderer.cs} (76%) diff --git a/Iceshrimp.Backend/Controllers/ActivityPubController.cs b/Iceshrimp.Backend/Controllers/ActivityPubController.cs index f789838c..c8dd201f 100644 --- a/Iceshrimp.Backend/Controllers/ActivityPubController.cs +++ b/Iceshrimp.Backend/Controllers/ActivityPubController.cs @@ -12,7 +12,7 @@ namespace Iceshrimp.Backend.Controllers; [ApiController] [MediaTypeRouteFilter("application/activity+json", "application/ld+json")] [Produces("application/activity+json", "application/ld+json")] -public class ActivityPubController(ILogger logger, DatabaseContext db) : Controller { +public class ActivityPubController(ILogger logger, DatabaseContext db, APUserRenderer userRenderer) : Controller { /* [HttpGet("/notes/{id}")] [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(Note))] @@ -31,7 +31,7 @@ public class ActivityPubController(ILogger logger, Databa public async Task GetUser(string id) { var user = await db.Users.FirstOrDefaultAsync(p => p.Id == id); if (user == null) return NotFound(); - var rendered = await ActivityPubUserRenderer.Render(user); + var rendered = await userRenderer.Render(user); var compacted = LDHelpers.Compact(rendered); return Ok(compacted); } diff --git a/Iceshrimp.Backend/Controllers/Renderers/ActivityPub/UserRenderer.cs b/Iceshrimp.Backend/Controllers/Renderers/ActivityPub/APUserRenderer.cs similarity index 76% rename from Iceshrimp.Backend/Controllers/Renderers/ActivityPub/UserRenderer.cs rename to Iceshrimp.Backend/Controllers/Renderers/ActivityPub/APUserRenderer.cs index 7dff3ad6..d2b0bee4 100644 --- a/Iceshrimp.Backend/Controllers/Renderers/ActivityPub/UserRenderer.cs +++ b/Iceshrimp.Backend/Controllers/Renderers/ActivityPub/APUserRenderer.cs @@ -4,17 +4,20 @@ using Iceshrimp.Backend.Core.Database; using Iceshrimp.Backend.Core.Database.Tables; using Iceshrimp.Backend.Core.Federation.ActivityStreams.Types; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Options; namespace Iceshrimp.Backend.Controllers.Renderers.ActivityPub; -public static class ActivityPubUserRenderer { - public static async Task Render(User user) { +public class APUserRenderer( + IOptions config, + ILogger logger, + DatabaseContext db) { + public async Task Render(User user) { if (user.Host != null) throw new Exception(); - var db = new DatabaseContext(); var profile = await db.UserProfiles.FirstOrDefaultAsync(p => p.UserId == user.Id); - var id = $"https://{Config.StartupConfig.Instance.WebDomain}/users/{user.Id}"; + var id = $"https://{config.Value.WebDomain}/users/{user.Id}"; var type = Constants.SystemUsers.Contains(user.UsernameLower) ? "Application" : user.IsBot @@ -30,7 +33,7 @@ public static class ActivityPubUserRenderer { //Following = $"{id}/following", //SharedInbox = $"{Config.Instance.Url}/inbox", //Endpoints = new Dictionary { { "SharedInbox", $"{Config.Instance.Url}/inbox" } }, - Url = new ASLink($"https://{Config.StartupConfig.Instance.WebDomain}/@{user.Username}"), + Url = new ASLink($"https://{config.Value.WebDomain}/@{user.Username}"), Username = user.Username, DisplayName = user.Name ?? user.Username, Summary = profile?.Description != null ? "Not implemented" : null, //TODO: convert to html diff --git a/Iceshrimp.Backend/Core/Configuration/Config.cs b/Iceshrimp.Backend/Core/Configuration/Config.cs index 75c1bfe6..92eca02b 100644 --- a/Iceshrimp.Backend/Core/Configuration/Config.cs +++ b/Iceshrimp.Backend/Core/Configuration/Config.cs @@ -1,19 +1,31 @@ +using System.Reflection; + namespace Iceshrimp.Backend.Core.Configuration; public sealed class Config { - // FIXME: This doesn't reflect config updates. - public static Config StartupConfig { get; set; } = null!; - public required InstanceSection Instance { get; set; } public required DatabaseSection Database { get; set; } - public StaticSection Static = new(); - - public sealed class StaticSection { - public string Version = "0.0.1"; - public string UserAgent => $"Iceshrimp.NET/{Version} (https://{StartupConfig.Instance.WebDomain})"; - } public sealed class InstanceSection { + public readonly string Version; + public string UserAgent => $"Iceshrimp.NET/{Version} (https://{WebDomain})"; + + public InstanceSection() { + // Get version information from assembly + var version = Assembly.GetEntryAssembly()! + .GetCustomAttributes().OfType() + .First().InformationalVersion; + + // If we have a git revision, limit it to 10 characters + if (version.Split('+') is { Length: 2 } split) { + split[1] = split[1][..Math.Min(split[1].Length, 10)]; + Version = string.Join('+', split); + } + else { + Version = version; + } + } + public required int ListenPort { get; set; } = 3000; public required string WebDomain { get; set; } public required string AccountDomain { get; set; } diff --git a/Iceshrimp.Backend/Core/Database/DatabaseContext.cs b/Iceshrimp.Backend/Core/Database/DatabaseContext.cs index 899c4365..088aaa4b 100644 --- a/Iceshrimp.Backend/Core/Database/DatabaseContext.cs +++ b/Iceshrimp.Backend/Core/Database/DatabaseContext.cs @@ -9,16 +9,8 @@ namespace Iceshrimp.Backend.Core.Database; [SuppressMessage("ReSharper", "StringLiteralTypo")] [SuppressMessage("ReSharper", "IdentifierTypo")] -public class DatabaseContext : DbContext { - private readonly IOptions? _config; - - public DatabaseContext() { } - - public DatabaseContext(DbContextOptions options, IOptions config) - : base(options) { - _config = config; - } - +public class DatabaseContext(DbContextOptions options, IOptions config) + : DbContext(options) { public virtual DbSet AbuseUserReports { get; init; } = null!; public virtual DbSet AccessTokens { get; init; } = null!; public virtual DbSet Announcements { get; init; } = null!; @@ -90,13 +82,13 @@ public class DatabaseContext : DbContext { protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var dataSourceBuilder = new NpgsqlDataSourceBuilder(); - if (_config == null) + if (config == null) throw new Exception("Failed to initialize database: Failed to load configuration"); - dataSourceBuilder.ConnectionStringBuilder.Host = _config.Value.Host; - dataSourceBuilder.ConnectionStringBuilder.Username = _config.Value.Username; - dataSourceBuilder.ConnectionStringBuilder.Password = _config.Value.Password; - dataSourceBuilder.ConnectionStringBuilder.Database = _config.Value.Database; + dataSourceBuilder.ConnectionStringBuilder.Host = config.Value.Host; + dataSourceBuilder.ConnectionStringBuilder.Username = config.Value.Username; + dataSourceBuilder.ConnectionStringBuilder.Password = config.Value.Password; + dataSourceBuilder.ConnectionStringBuilder.Database = config.Value.Database; dataSourceBuilder.MapEnum(); dataSourceBuilder.MapEnum(); diff --git a/Iceshrimp.Backend/Core/Federation/Fetch.cs b/Iceshrimp.Backend/Core/Federation/Fetch.cs index 2dcd257b..b86767fe 100644 --- a/Iceshrimp.Backend/Core/Federation/Fetch.cs +++ b/Iceshrimp.Backend/Core/Federation/Fetch.cs @@ -32,8 +32,7 @@ public class Fetch { //notes?.ForEach(p => Console.WriteLine(p.PublishedAt)); } - public static void PerformActivity(ASNote note) { - var db = new DatabaseContext(); + public static void PerformActivity(ASNote note, DatabaseContext db) { var actorUri = note.AttributedTo?.FirstOrDefault()?.Id; if (actorUri == null) return; var user = db.Users.FirstOrDefault(p => p.Uri == actorUri) ?? FetchUser(actorUri); diff --git a/Iceshrimp.Backend/Core/Helpers/ServiceExtensions.cs b/Iceshrimp.Backend/Core/Helpers/ServiceExtensions.cs index c5594f8a..e9b1794a 100644 --- a/Iceshrimp.Backend/Core/Helpers/ServiceExtensions.cs +++ b/Iceshrimp.Backend/Core/Helpers/ServiceExtensions.cs @@ -1,3 +1,4 @@ +using Iceshrimp.Backend.Controllers.Renderers.ActivityPub; using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Federation; using Iceshrimp.Backend.Core.Federation.Services; @@ -15,20 +16,18 @@ public static class ServiceExtensions { services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); // Singleton = instantiated once across application lifetime services.AddSingleton(); services.AddSingleton(); services.AddSingleton(); } - + public static void ConfigureServices(this IServiceCollection services, IConfiguration configuration) { //TODO: fail if config doesn't parse correctly / required things are missing + services.Configure(configuration); services.Configure(configuration.GetSection("Instance")); services.Configure(configuration.GetSection("Database")); - services.AddScoped(); - services.AddScoped(); - - Config.StartupConfig = configuration.Get()!; } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Services/HttpRequestService.cs b/Iceshrimp.Backend/Core/Services/HttpRequestService.cs index 6deece1e..5d5fead4 100644 --- a/Iceshrimp.Backend/Core/Services/HttpRequestService.cs +++ b/Iceshrimp.Backend/Core/Services/HttpRequestService.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.Options; namespace Iceshrimp.Backend.Core.Services; -public class HttpRequestService(IOptions options) { +public class HttpRequestService(IOptions options) { private HttpRequestMessage GenerateRequest(string url, IEnumerable? accept, HttpMethod method) { var message = new HttpRequestMessage { RequestUri = new Uri(url), diff --git a/Iceshrimp.Backend/Iceshrimp.Backend.csproj b/Iceshrimp.Backend/Iceshrimp.Backend.csproj index 5b2d2f27..78ad0bcd 100644 --- a/Iceshrimp.Backend/Iceshrimp.Backend.csproj +++ b/Iceshrimp.Backend/Iceshrimp.Backend.csproj @@ -5,6 +5,8 @@ enable enable true + 2024.1 + prealpha diff --git a/Iceshrimp.Backend/Startup.cs b/Iceshrimp.Backend/Startup.cs index 4201794b..0f7594af 100644 --- a/Iceshrimp.Backend/Startup.cs +++ b/Iceshrimp.Backend/Startup.cs @@ -38,8 +38,11 @@ builder.Services.AddServices(); builder.Services.ConfigureServices(builder.Configuration); var app = builder.Build(); +var instanceConfig = app.Configuration.GetSection("Instance").Get() ?? + throw new Exception("Failed to read Instance config section"); + +app.Logger.LogInformation("Iceshrimp.NET v{version} ({domain})", instanceConfig.Version, instanceConfig.AccountDomain); app.Logger.LogInformation("Initializing, please wait..."); -app.Logger.LogInformation("Account domain: {AccountDomain}", Config.StartupConfig.Instance.AccountDomain); app.UseSwagger(); app.UseSwaggerUI(options => { options.DocumentTitle = "Iceshrimp API documentation"; }); @@ -53,6 +56,6 @@ app.MapFallbackToPage("/Shared/FrontendSPA"); if (app.Environment.IsDevelopment()) app.UseViteDevMiddleware(); app.Urls.Clear(); -app.Urls.Add($"http://{Config.StartupConfig.Instance.WebDomain}:{Config.StartupConfig.Instance.ListenPort}"); +app.Urls.Add($"http://{instanceConfig.WebDomain}:{instanceConfig.ListenPort}"); app.Run(); \ No newline at end of file